[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v5 13/24] hvmloader: construct SRAT



On 12/02/15 19:44, Wei Liu wrote:
> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> Acked-by: Jan Beulich <JBeulich@xxxxxxxx>
> ---
> Changes in v3:
> 1. Remove redundant variable.
> 2. Coding style fix.
> 3. Add assertion.
>
> Changes in v2:
> 1. Remove explicit zero initializers.
> 2. Adapt to new vNUMA retrieval routine.
> 3. Move SRAT very late in secondary table build.
> ---
>  tools/firmware/hvmloader/acpi/acpi2_0.h | 53 ++++++++++++++++++++++++
>  tools/firmware/hvmloader/acpi/build.c   | 72 
> +++++++++++++++++++++++++++++++++
>  2 files changed, 125 insertions(+)
>
> diff --git a/tools/firmware/hvmloader/acpi/acpi2_0.h 
> b/tools/firmware/hvmloader/acpi/acpi2_0.h
> index 7b22d80..6169213 100644
> --- a/tools/firmware/hvmloader/acpi/acpi2_0.h
> +++ b/tools/firmware/hvmloader/acpi/acpi2_0.h
> @@ -364,6 +364,57 @@ struct acpi_20_madt_intsrcovr {
>  };
>  
>  /*
> + * System Resource Affinity Table header definition (SRAT)
> + */
> +struct acpi_20_srat {
> +    struct acpi_header header;
> +    uint32_t table_revision;
> +    uint32_t reserved2[2];
> +};
> +
> +#define ACPI_SRAT_TABLE_REVISION 1
> +
> +/*
> + * System Resource Affinity Table structure types.
> + */
> +#define ACPI_PROCESSOR_AFFINITY 0x0
> +#define ACPI_MEMORY_AFFINITY    0x1
> +struct acpi_20_srat_processor {
> +    uint8_t type;
> +    uint8_t length;
> +    uint8_t domain;
> +    uint8_t apic_id;
> +    uint32_t flags;
> +    uint8_t sapic_id;
> +    uint8_t domain_hi[3];
> +    uint32_t reserved;
> +};
> +
> +/*
> + * Local APIC Affinity Flags.  All other bits are reserved and must be 0.
> + */
> +#define ACPI_LOCAL_APIC_AFFIN_ENABLED (1 << 0)
> +
> +struct acpi_20_srat_memory {
> +    uint8_t type;
> +    uint8_t length;
> +    uint32_t domain;
> +    uint16_t reserved;
> +    uint64_t base_address;
> +    uint64_t mem_length;
> +    uint32_t reserved2;
> +    uint32_t flags;
> +    uint64_t reserved3;
> +};
> +
> +/*
> + * Memory Affinity Flags.  All other bits are reserved and must be 0.
> + */
> +#define ACPI_MEM_AFFIN_ENABLED (1 << 0)
> +#define ACPI_MEM_AFFIN_HOTPLUGGABLE (1 << 1)
> +#define ACPI_MEM_AFFIN_NONVOLATILE (1 << 2)
> +
> +/*
>   * Table Signatures.
>   */
>  #define ACPI_2_0_RSDP_SIGNATURE ASCII64('R','S','D',' ','P','T','R',' ')
> @@ -375,6 +426,7 @@ struct acpi_20_madt_intsrcovr {
>  #define ACPI_2_0_TCPA_SIGNATURE ASCII32('T','C','P','A')
>  #define ACPI_2_0_HPET_SIGNATURE ASCII32('H','P','E','T')
>  #define ACPI_2_0_WAET_SIGNATURE ASCII32('W','A','E','T')
> +#define ACPI_2_0_SRAT_SIGNATURE ASCII32('S','R','A','T')
>  
>  /*
>   * Table revision numbers.
> @@ -388,6 +440,7 @@ struct acpi_20_madt_intsrcovr {
>  #define ACPI_2_0_HPET_REVISION 0x01
>  #define ACPI_2_0_WAET_REVISION 0x01
>  #define ACPI_1_0_FADT_REVISION 0x01
> +#define ACPI_2_0_SRAT_REVISION 0x01
>  
>  #pragma pack ()
>  
> diff --git a/tools/firmware/hvmloader/acpi/build.c 
> b/tools/firmware/hvmloader/acpi/build.c
> index 1431296..3e96c23 100644
> --- a/tools/firmware/hvmloader/acpi/build.c
> +++ b/tools/firmware/hvmloader/acpi/build.c
> @@ -23,6 +23,7 @@
>  #include "ssdt_pm.h"
>  #include "../config.h"
>  #include "../util.h"
> +#include "../vnuma.h"
>  #include <xen/hvm/hvm_xs_strings.h>
>  #include <xen/hvm/params.h>
>  
> @@ -203,6 +204,66 @@ static struct acpi_20_waet *construct_waet(void)
>      return waet;
>  }
>  
> +static struct acpi_20_srat *construct_srat(void)
> +{
> +    struct acpi_20_srat *srat;
> +    struct acpi_20_srat_processor *processor;
> +    struct acpi_20_srat_memory *memory;
> +    unsigned int size;
> +    void *p;
> +    int i;

unsigned

> +
> +    size = sizeof(*srat) + sizeof(*processor) * hvm_info->nr_vcpus +
> +        sizeof(*memory) * nr_vmemranges;
> +
> +    p = mem_alloc(size, 16);
> +    if ( !p )
> +        return NULL;
> +
> +    srat = p;
> +    memset(srat, 0, sizeof(*srat));

Probably best to memset() all of size in one go, rather than memset()ing
each bit individually.

Otherwise, Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>

> +    srat->header.signature    = ACPI_2_0_SRAT_SIGNATURE;
> +    srat->header.revision     = ACPI_2_0_SRAT_REVISION;
> +    fixed_strcpy(srat->header.oem_id, ACPI_OEM_ID);
> +    fixed_strcpy(srat->header.oem_table_id, ACPI_OEM_TABLE_ID);
> +    srat->header.oem_revision = ACPI_OEM_REVISION;
> +    srat->header.creator_id   = ACPI_CREATOR_ID;
> +    srat->header.creator_revision = ACPI_CREATOR_REVISION;
> +    srat->table_revision      = ACPI_SRAT_TABLE_REVISION;
> +
> +    processor = (struct acpi_20_srat_processor *)(srat + 1);
> +    for ( i = 0; i < hvm_info->nr_vcpus; i++ )
> +    {
> +        memset(processor, 0, sizeof(*processor));
> +        processor->type     = ACPI_PROCESSOR_AFFINITY;
> +        processor->length   = sizeof(*processor);
> +        processor->domain   = vcpu_to_vnode[i];
> +        processor->apic_id  = LAPIC_ID(i);
> +        processor->flags    = ACPI_LOCAL_APIC_AFFIN_ENABLED;
> +        processor++;
> +    }
> +
> +    memory = (struct acpi_20_srat_memory *)processor;
> +    for ( i = 0; i < nr_vmemranges; i++ )
> +    {
> +        memset(memory, 0, sizeof(*memory));
> +        memory->type          = ACPI_MEMORY_AFFINITY;
> +        memory->length        = sizeof(*memory);
> +        memory->domain        = vmemrange[i].nid;
> +        memory->flags         = ACPI_MEM_AFFIN_ENABLED;
> +        memory->base_address  = vmemrange[i].start;
> +        memory->mem_length    = vmemrange[i].end - vmemrange[i].start;
> +        memory++;
> +    }
> +
> +    ASSERT(((unsigned long)memory) - ((unsigned long)p) == size);
> +
> +    srat->header.length = size;
> +    set_checksum(srat, offsetof(struct acpi_header, checksum), size);
> +
> +    return srat;
> +}
> +
>  static int construct_passthrough_tables(unsigned long *table_ptrs,
>                                          int nr_tables)
>  {
> @@ -257,6 +318,7 @@ static int construct_secondary_tables(unsigned long 
> *table_ptrs,
>      struct acpi_20_hpet *hpet;
>      struct acpi_20_waet *waet;
>      struct acpi_20_tcpa *tcpa;
> +    struct acpi_20_srat *srat;
>      unsigned char *ssdt;
>      static const uint16_t tis_signature[] = {0x0001, 0x0001, 0x0001};
>      uint16_t *tis_hdr;
> @@ -346,6 +408,16 @@ static int construct_secondary_tables(unsigned long 
> *table_ptrs,
>          }
>      }
>  
> +    /* SRAT */
> +    if ( nr_vnodes > 0 )
> +    {
> +        srat = construct_srat();
> +        if ( srat )
> +            table_ptrs[nr_tables++] = (unsigned long)srat;
> +        else
> +            printf("Failed to build SRAT, skipping...\n");
> +    }
> +
>      /* Load any additional tables passed through. */
>      nr_tables += construct_passthrough_tables(table_ptrs, nr_tables);
>  



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.