[PATCH 5/6] numa: Enable numa for libvirt interface

Yang Zhong posted 6 patches 4 years, 4 months ago
Maintainers: "Dr. David Alan Gilbert" <dgilbert@redhat.com>, Eric Blake <eblake@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Ani Sinha <ani@anisinha.ca>, Markus Armbruster <armbru@redhat.com>, "Michael S. Tsirkin" <mst@redhat.com>, Igor Mammedov <imammedo@redhat.com>, Eduardo Habkost <ehabkost@redhat.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Richard Henderson <richard.henderson@linaro.org>
[PATCH 5/6] numa: Enable numa for libvirt interface
Posted by Yang Zhong 4 years, 4 months ago
Libvirt need get the detailed host SGX EPC capabilities to support
numa function. Libvirt can decide how to allocate host EPC sections
to guest numa from host numa info.

(QEMU) query-sgx-capabilities
{"return": {"sgx": true, "sgx2": true, "sgx1": true, "sections": \
[{"index": 0, "size": 17070817280}, {"index": 1, "size": 17079205888}], "flc": true}}

Signed-off-by: Yang Zhong <yang.zhong@intel.com>
---
 hw/i386/sgx.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
index 8af45925c6..fe3034060d 100644
--- a/hw/i386/sgx.c
+++ b/hw/i386/sgx.c
@@ -74,11 +74,13 @@ static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high)
            ((high & MAKE_64BIT_MASK(0, 20)) << 32);
 }
 
-static uint64_t sgx_calc_host_epc_section_size(void)
+static SGXEPCSectionList *sgx_calc_host_epc_sections(void)
 {
+    SGXEPCSectionList *head = NULL, **tail = &head;
+    SGXEPCSection *section;
     uint32_t i, type;
     uint32_t eax, ebx, ecx, edx;
-    uint64_t size = 0;
+    uint32_t j = 0;
 
     for (i = 0; i < SGX_MAX_EPC_SECTIONS; i++) {
         host_cpuid(0x12, i + 2, &eax, &ebx, &ecx, &edx);
@@ -92,10 +94,13 @@ static uint64_t sgx_calc_host_epc_section_size(void)
             break;
         }
 
-        size += sgx_calc_section_metric(ecx, edx);
+        section = g_new0(SGXEPCSection, 1);
+        section->index = j++;
+        section->size = sgx_calc_section_metric(ecx, edx);
+        QAPI_LIST_APPEND(tail, section);
     }
 
-    return size;
+    return head;
 }
 
 SGXInfo *sgx_get_capabilities(Error **errp)
@@ -119,7 +124,7 @@ SGXInfo *sgx_get_capabilities(Error **errp)
     info->sgx1 = eax & (1U << 0) ? true : false;
     info->sgx2 = eax & (1U << 1) ? true : false;
 
-    info->section_size = sgx_calc_host_epc_section_size();
+    info->sections = sgx_calc_host_epc_sections();
 
     close(fd);
 

Re: [PATCH 5/6] numa: Enable numa for libvirt interface
Posted by Paolo Bonzini 4 years, 3 months ago
On 11/10/21 13:15, Yang Zhong wrote:
> Libvirt need get the detailed host SGX EPC capabilities to support
> numa function. Libvirt can decide how to allocate host EPC sections
> to guest numa from host numa info.
> 
> (QEMU) query-sgx-capabilities
> {"return": {"sgx": true, "sgx2": true, "sgx1": true, "sections": \
> [{"index": 0, "size": 17070817280}, {"index": 1, "size": 17079205888}], "flc": true}}
> 
> Signed-off-by: Yang Zhong <yang.zhong@intel.com>
> ---
>   hw/i386/sgx.c | 15 ++++++++++-----
>   1 file changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
> index 8af45925c6..fe3034060d 100644
> --- a/hw/i386/sgx.c
> +++ b/hw/i386/sgx.c
> @@ -74,11 +74,13 @@ static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high)
>              ((high & MAKE_64BIT_MASK(0, 20)) << 32);
>   }
>   
> -static uint64_t sgx_calc_host_epc_section_size(void)
> +static SGXEPCSectionList *sgx_calc_host_epc_sections(void)
>   {
> +    SGXEPCSectionList *head = NULL, **tail = &head;
> +    SGXEPCSection *section;
>       uint32_t i, type;
>       uint32_t eax, ebx, ecx, edx;
> -    uint64_t size = 0;
> +    uint32_t j = 0;
>   
>       for (i = 0; i < SGX_MAX_EPC_SECTIONS; i++) {
>           host_cpuid(0x12, i + 2, &eax, &ebx, &ecx, &edx);
> @@ -92,10 +94,13 @@ static uint64_t sgx_calc_host_epc_section_size(void)
>               break;
>           }
>   
> -        size += sgx_calc_section_metric(ecx, edx);
> +        section = g_new0(SGXEPCSection, 1);
> +        section->index = j++;
> +        section->size = sgx_calc_section_metric(ecx, edx);
> +        QAPI_LIST_APPEND(tail, section);
>       }
>   
> -    return size;
> +    return head;
>   }
>   
>   SGXInfo *sgx_get_capabilities(Error **errp)
> @@ -119,7 +124,7 @@ SGXInfo *sgx_get_capabilities(Error **errp)
>       info->sgx1 = eax & (1U << 0) ? true : false;
>       info->sgx2 = eax & (1U << 1) ? true : false;
>   
> -    info->section_size = sgx_calc_host_epc_section_size();
> +    info->sections = sgx_calc_host_epc_sections();
>   
>       close(fd);
>   
> 

This too.

Paolo