Commit aa570207 authored by Tao Xu's avatar Tao Xu Committed by Eduardo Habkost
Browse files

numa: move numa global variable nb_numa_nodes into MachineState



Add struct NumaState in MachineState and move existing numa global
nb_numa_nodes(renamed as "num_nodes") into NumaState. And add variable
numa_support into MachineClass to decide which submachines support NUMA.

Reviewed-by: default avatarIgor Mammedov <imammedo@redhat.com>
Suggested-by: default avatarIgor Mammedov <imammedo@redhat.com>
Suggested-by: default avatarEduardo Habkost <ehabkost@redhat.com>
Signed-off-by: default avatarTao Xu <tao3.xu@intel.com>
Message-Id: <20190809065731.9097-3-tao3.xu@intel.com>
[ehabkost: include hw/boards.h again to fix build failures]
Signed-off-by: default avatarEduardo Habkost <ehabkost@redhat.com>
parent 2744ece8
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1750,6 +1750,7 @@ long qemu_minrampagesize(void)
    long hpsize = LONG_MAX;
    long mainrampagesize;
    Object *memdev_root;
    MachineState *ms = MACHINE(qdev_get_machine());

    mainrampagesize = qemu_mempath_getpagesize(mem_path);

@@ -1777,7 +1778,9 @@ long qemu_minrampagesize(void)
     * so if its page size is smaller we have got to report that size instead.
     */
    if (hpsize > mainrampagesize &&
        (nb_numa_nodes == 0 || numa_info[0].node_memdev == NULL)) {
        (ms->numa_state == NULL ||
         ms->numa_state->num_nodes == 0 ||
         numa_info[0].node_memdev == NULL)) {
        static bool warned;
        if (!warned) {
            error_report("Huge page support disabled (n/a for main memory).");
+3 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include "qemu/bswap.h"
#include "qemu/bitops.h"
#include "sysemu/numa.h"
#include "hw/boards.h"

static GArray *build_alloc_array(void)
{
@@ -1726,10 +1727,11 @@ void build_srat_memory(AcpiSratMemoryAffinity *numamem, uint64_t base,
 * ACPI spec 5.2.17 System Locality Distance Information Table
 * (Revision 2.0 or later)
 */
void build_slit(GArray *table_data, BIOSLinker *linker)
void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms)
{
    int slit_start, i, j;
    slit_start = table_data->len;
    int nb_numa_nodes = ms->numa_state->num_nodes;

    acpi_data_push(table_data, sizeof(AcpiTableHeader));

+2 −2
Original line number Diff line number Diff line
@@ -598,9 +598,9 @@ int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
    }
    g_strfreev(node_path);

    if (nb_numa_nodes > 0) {
    if (ms->numa_state != NULL && ms->numa_state->num_nodes > 0) {
        mem_base = binfo->loader_start;
        for (i = 0; i < nb_numa_nodes; i++) {
        for (i = 0; i < ms->numa_state->num_nodes; i++) {
            mem_len = numa_info[i].node_mem;
            rc = fdt_add_memory_node(fdt, acells, mem_base,
                                     scells, mem_len, i);
+3 −1
Original line number Diff line number Diff line
@@ -146,6 +146,7 @@ static void create_fdt(SBSAMachineState *sms)
{
    void *fdt = create_device_tree(&sms->fdt_size);
    const MachineState *ms = MACHINE(sms);
    int nb_numa_nodes = ms->numa_state->num_nodes;
    int cpu;

    if (!fdt) {
@@ -762,7 +763,7 @@ sbsa_ref_cpu_index_to_props(MachineState *ms, unsigned cpu_index)
static int64_t
sbsa_ref_get_default_cpu_node_id(const MachineState *ms, int idx)
{
    return idx % nb_numa_nodes;
    return idx % ms->numa_state->num_nodes;
}

static void sbsa_ref_instance_init(Object *obj)
@@ -789,6 +790,7 @@ static void sbsa_ref_class_init(ObjectClass *oc, void *data)
    mc->possible_cpu_arch_ids = sbsa_ref_possible_cpu_arch_ids;
    mc->cpu_index_to_instance_props = sbsa_ref_cpu_index_to_props;
    mc->get_default_cpu_node_id = sbsa_ref_get_default_cpu_node_id;
    mc->numa_mem_supported = true;
}

static const TypeInfo sbsa_ref_info = {
+6 −4
Original line number Diff line number Diff line
@@ -517,7 +517,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
    int i, srat_start;
    uint64_t mem_base;
    MachineClass *mc = MACHINE_GET_CLASS(vms);
    const CPUArchIdList *cpu_list = mc->possible_cpu_arch_ids(MACHINE(vms));
    MachineState *ms = MACHINE(vms);
    const CPUArchIdList *cpu_list = mc->possible_cpu_arch_ids(ms);

    srat_start = table_data->len;
    srat = acpi_data_push(table_data, sizeof(*srat));
@@ -533,7 +534,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
    }

    mem_base = vms->memmap[VIRT_MEM].base;
    for (i = 0; i < nb_numa_nodes; ++i) {
    for (i = 0; i < ms->numa_state->num_nodes; ++i) {
        if (numa_info[i].node_mem > 0) {
            numamem = acpi_data_push(table_data, sizeof(*numamem));
            build_srat_memory(numamem, mem_base, numa_info[i].node_mem, i,
@@ -759,6 +760,7 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
    GArray *table_offsets;
    unsigned dsdt, xsdt;
    GArray *tables_blob = tables->table_data;
    MachineState *ms = MACHINE(vms);

    table_offsets = g_array_new(false, true /* clear */,
                                        sizeof(uint32_t));
@@ -793,12 +795,12 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
    acpi_add_table(table_offsets, tables_blob);
    build_spcr(tables_blob, tables->linker, vms);

    if (nb_numa_nodes > 0) {
    if (ms->numa_state->num_nodes > 0) {
        acpi_add_table(table_offsets, tables_blob);
        build_srat(tables_blob, tables->linker, vms);
        if (have_numa_distance) {
            acpi_add_table(table_offsets, tables_blob);
            build_slit(tables_blob, tables->linker);
            build_slit(tables_blob, tables->linker, ms);
        }
    }

Loading