All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: qemu-devel@nongnu.org
Cc: Eduardo Habkost <ehabkost@redhat.com>,
	Peter Maydell <peter.maydell@linaro.org>,
	Andrew Jones <drjones@redhat.com>,
	David Gibson <david@gibson.dropbear.id.au>,
	Eric Blake <eblake@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Shannon Zhao <zhaoshenglong@huawei.com>,
	qemu-arm@nongnu.org, qemu-ppc@nongnu.org
Subject: [Qemu-devel] [PATCH v2 10/24] numa: mirror cpu to node mapping in MachineState::possible_cpus
Date: Wed,  3 May 2017 14:57:04 +0200	[thread overview]
Message-ID: <1493816238-33120-11-git-send-email-imammedo@redhat.com> (raw)
In-Reply-To: <1493816238-33120-1-git-send-email-imammedo@redhat.com>

Introduce machine_set_cpu_numa_node() helper that stores
node mapping for CPU in MachineState::possible_cpus.
CPU and node it belongs to is specified by 'props' argument.

Patch doesn't remove old way of storing mapping in
numa_info[X].node_cpu as removing it at the same time
makes patch rather big. Instead it just mirrors mapping
in possible_cpus and follow up per target patches will
switch to possible_cpus and numa_info[X].node_cpu will
be removed once there isn't any users left.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 include/hw/boards.h |  2 ++
 hw/core/machine.c   | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 numa.c              |  8 +++++++
 3 files changed, 78 insertions(+)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 5d6af21..1f518a1 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -42,6 +42,8 @@ bool machine_dump_guest_core(MachineState *machine);
 bool machine_mem_merge(MachineState *machine);
 void machine_register_compat_props(MachineState *machine);
 HotpluggableCPUList *machine_query_hotpluggable_cpus(MachineState *machine);
+void machine_set_cpu_numa_node(MachineState *machine,
+                               CpuInstanceProperties *props, Error **errp);
 
 /**
  * CPUArchId:
diff --git a/hw/core/machine.c b/hw/core/machine.c
index ada9eea..a63f17b 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -388,6 +388,74 @@ HotpluggableCPUList *machine_query_hotpluggable_cpus(MachineState *machine)
     return head;
 }
 
+void machine_set_cpu_numa_node(MachineState *machine,
+                               CpuInstanceProperties *props, Error **errp)
+{
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    bool match = false;
+    int i;
+
+    if (!mc->possible_cpu_arch_ids) {
+        error_setg(errp, "mapping of CPUs to NUMA node is not supported");
+        return;
+    }
+
+    /* force board to initialize possible_cpus if it hasn't been done yet */
+    mc->possible_cpu_arch_ids(machine);
+
+    for (i = 0; i < machine->possible_cpus->len; i++) {
+        CPUArchId *slot = &machine->possible_cpus->cpus[i];
+
+        /* reject unsupported by board properties */
+        if (props->has_thread_id && !slot->props.has_thread_id) {
+            error_setg(errp, "thread-id is not supported");
+            return;
+        }
+
+        if (props->has_core_id && !slot->props.has_core_id) {
+            error_setg(errp, "core-id is not supported");
+            return;
+        }
+
+        if (props->has_socket_id && !slot->props.has_socket_id) {
+            error_setg(errp, "socket-id is not supported");
+            return;
+        }
+
+        /* skip slots with explicit mismatch */
+        if (props->has_thread_id && props->thread_id != slot->props.thread_id) {
+                continue;
+        }
+
+        if (props->has_core_id && props->core_id != slot->props.core_id) {
+                continue;
+        }
+
+        if (props->has_socket_id && props->socket_id != slot->props.socket_id) {
+                continue;
+        }
+
+        /* reject assignment if slot is already assigned, for compatibility
+         * of legacy cpu_index mapping with SPAPR core based mapping do not
+         * error out if cpu thread and matched core have the same node-id */
+        if (slot->props.has_node_id &&
+            slot->props.node_id != props->node_id) {
+            error_setg(errp, "CPU is already assigned to node-id: %" PRId64,
+                       slot->props.node_id);
+            return;
+        }
+
+        /* assign slot to node as it's matched '-numa cpu' key */
+        match = true;
+        slot->props.node_id = props->node_id;
+        slot->props.has_node_id = props->has_node_id;
+    }
+
+    if (!match) {
+        error_setg(errp, "no match found");
+    }
+}
+
 static void machine_class_init(ObjectClass *oc, void *data)
 {
     MachineClass *mc = MACHINE_CLASS(oc);
diff --git a/numa.c b/numa.c
index b517870..5ff1212 100644
--- a/numa.c
+++ b/numa.c
@@ -169,6 +169,7 @@ static void numa_node_parse(MachineState *ms, NumaNodeOptions *node,
         exit(1);
     }
     for (cpus = node->cpus; cpus; cpus = cpus->next) {
+        CpuInstanceProperties props;
         if (cpus->value >= max_cpus) {
             error_setg(errp,
                        "CPU index (%" PRIu16 ")"
@@ -177,6 +178,10 @@ static void numa_node_parse(MachineState *ms, NumaNodeOptions *node,
             return;
         }
         bitmap_set(numa_info[nodenr].node_cpu, cpus->value, 1);
+        props = mc->cpu_index_to_instance_props(ms, cpus->value);
+        props.node_id = nodenr;
+        props.has_node_id = true;
+        machine_set_cpu_numa_node(ms, &props, &error_fatal);
     }
 
     if (node->has_mem && node->has_memdev) {
@@ -393,9 +398,12 @@ void parse_numa_opts(MachineState *ms)
         if (i == nb_numa_nodes) {
             for (i = 0; i < max_cpus; i++) {
                 CpuInstanceProperties props;
+                /* fetch default mapping from board and enable it */
                 props = mc->cpu_index_to_instance_props(ms, i);
+                props.has_node_id = true;
 
                 set_bit(i, numa_info[props.node_id].node_cpu);
+                machine_set_cpu_numa_node(ms, &props, &error_fatal);
             }
         }
 
-- 
2.7.4

  parent reply	other threads:[~2017-05-03 12:58 UTC|newest]

Thread overview: 94+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-03 12:56 [Qemu-devel] [PATCH v2 00/24] numa: add '-numa cpu' option Igor Mammedov
2017-05-03 12:56 ` [Qemu-devel] [PATCH v2 01/24] tests: add CPUs to numa node mapping test Igor Mammedov
2017-05-03 14:32   ` Eduardo Habkost
2017-05-04 13:17   ` Eduardo Habkost
2017-05-03 12:56 ` [Qemu-devel] [PATCH v2 02/24] hw/arm/virt: extract mp-affinity calculation in separate function Igor Mammedov
2017-05-04  9:20   ` Andrew Jones
2017-05-04 13:21   ` Eduardo Habkost
2017-05-03 12:56 ` [Qemu-devel] [PATCH v2 03/24] hw/arm/virt: use machine->possible_cpus for storing possible topology info Igor Mammedov
2017-05-04  9:38   ` Andrew Jones
2017-05-04 12:55     ` Igor Mammedov
2017-05-04 13:16       ` Andrew Jones
2017-05-04 14:33         ` Igor Mammedov
2017-05-03 12:56 ` [Qemu-devel] [PATCH v2 04/24] hw/arm/virt: explicitly allocate cpu_index for cpus Igor Mammedov
2017-05-03 12:56 ` [Qemu-devel] [PATCH v2 05/24] numa: move source of default CPUs to NUMA node mapping into boards Igor Mammedov
2017-05-03 14:42   ` Eduardo Habkost
2017-05-03 15:57     ` Igor Mammedov
2017-05-04  7:32     ` David Gibson
2017-05-05  8:01       ` Igor Mammedov
2017-05-03 14:59   ` Eduardo Habkost
2017-05-03 16:14     ` Igor Mammedov
2017-05-03 15:13   ` Eduardo Habkost
2017-05-04  9:19     ` Igor Mammedov
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 06/24] spapr: add node-id property to sPAPR core Igor Mammedov
2017-05-03 14:46   ` Eduardo Habkost
2017-05-03 16:12     ` Igor Mammedov
2017-05-04 16:49       ` David Gibson
2017-05-05  8:04         ` Igor Mammedov
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 07/24] pc: add node-id property to CPU Igor Mammedov
2017-05-05 20:29   ` Eduardo Habkost
2017-05-09 13:14     ` Igor Mammedov
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 08/24] virt-arm: " Igor Mammedov
2017-05-04  9:57   ` Andrew Jones
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 09/24] numa: add check that board supports cpu_index to node mapping Igor Mammedov
2017-05-03 15:04   ` Eduardo Habkost
2017-05-03 16:19     ` Igor Mammedov
2017-05-03 17:31       ` Eduardo Habkost
2017-05-04  9:07         ` Igor Mammedov
2017-05-04 10:01   ` Andrew Jones
2017-05-04 16:51   ` David Gibson
2017-05-03 12:57 ` Igor Mammedov [this message]
2017-05-03 15:20   ` [Qemu-devel] [PATCH v2 10/24] numa: mirror cpu to node mapping in MachineState::possible_cpus Eduardo Habkost
2017-05-04  8:44     ` Igor Mammedov
2017-05-05 12:16     ` Igor Mammedov
2017-05-05 17:04       ` Eduardo Habkost
2017-05-05 20:00         ` Igor Mammedov
2017-05-04 11:40   ` Andrew Jones
2017-05-04 12:57     ` Igor Mammedov
2017-05-05 11:28     ` Igor Mammedov
2017-05-05 11:47       ` Andrew Jones
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 11/24] numa: do default mapping based on possible_cpus instead of node_cpu bitmaps Igor Mammedov
2017-05-04 11:45   ` Andrew Jones
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 12/24] numa: add numa_[has_]node_id() wrappers Igor Mammedov
2017-05-04 12:30   ` Andrew Jones
2017-05-05  1:45   ` David Gibson
2017-05-05  8:09     ` Igor Mammedov
2017-05-05  9:06       ` Andrew Jones
2017-05-05 17:12         ` Eduardo Habkost
2017-05-05 20:04           ` Igor Mammedov
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 13/24] pc: get numa node mapping from possible_cpus instead of numa_get_node_for_cpu() Igor Mammedov
2017-05-04 12:30   ` Andrew Jones
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 14/24] spapr: " Igor Mammedov
2017-05-05  3:15   ` David Gibson
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 15/24] virt-arm: " Igor Mammedov
2017-05-04 12:33   ` Andrew Jones
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 16/24] QMP: include CpuInstanceProperties into query_cpus output output Igor Mammedov
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 17/24] tests: numa: add case for QMP command query-cpus Igor Mammedov
2017-05-05  3:22   ` David Gibson
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 18/24] numa: remove no longer used numa_get_node_for_cpu() Igor Mammedov
2017-05-04 12:34   ` Andrew Jones
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 19/24] numa: remove no longer need numa_post_machine_init() Igor Mammedov
2017-05-04 12:35   ` Andrew Jones
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 20/24] machine: call machine init from wrapper Igor Mammedov
2017-05-04 12:43   ` Andrew Jones
2017-05-05  3:23   ` David Gibson
2017-05-08 14:31   ` Eduardo Habkost
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 21/24] numa: use possible_cpus for not mapped CPUs check Igor Mammedov
2017-05-04 12:43   ` Andrew Jones
2017-05-04 13:06     ` Igor Mammedov
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 22/24] numa: remove node_cpu bitmaps as they are no longer used Igor Mammedov
2017-05-04 12:45   ` Andrew Jones
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 23/24] numa: add '-numa cpu, ...' option for property based node mapping Igor Mammedov
2017-05-03 16:35   ` Eduardo Habkost
2017-05-03 16:39     ` Eric Blake
2017-05-03 17:38       ` Eduardo Habkost
2017-05-03 17:58         ` Eduardo Habkost
2017-05-04  9:52           ` Igor Mammedov
2017-05-08  5:40   ` David Gibson
2017-05-08 14:47     ` Eduardo Habkost
2017-05-09 15:58     ` Igor Mammedov
2017-05-10  1:15       ` David Gibson
2017-05-03 12:57 ` [Qemu-devel] [PATCH v2 24/24] tests: check -numa node, cpu=props_list usecase Igor Mammedov
2017-05-08  6:35   ` David Gibson
2017-05-04 13:41 ` [Qemu-devel] [PATCH v2 00/24] numa: add '-numa cpu' option Eduardo Habkost
2017-05-04 14:34   ` Igor Mammedov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1493816238-33120-11-git-send-email-imammedo@redhat.com \
    --to=imammedo@redhat.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=drjones@redhat.com \
    --cc=eblake@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=zhaoshenglong@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.