All of lore.kernel.org
 help / color / mirror / Atom feed
From: Henry Wang <Henry.Wang@arm.com>
To: xen-devel@lists.xenproject.org
Cc: Henry Wang <Henry.Wang@arm.com>,
	Stefano Stabellini <sstabellini@kernel.org>,
	Julien Grall <julien@xen.org>,
	Bertrand Marquis <bertrand.marquis@arm.com>,
	Michal Orzel <michal.orzel@amd.com>,
	Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>
Subject: [PATCH v6 15/17] xen/arm: Set correct per-cpu cpu_core_mask
Date: Mon, 20 Nov 2023 10:54:29 +0800	[thread overview]
Message-ID: <20231120025431.14845-16-Henry.Wang@arm.com> (raw)
In-Reply-To: <20231120025431.14845-1-Henry.Wang@arm.com>

In the common sysctl command XEN_SYSCTL_physinfo, the cores_per_socket
is calculated based on the cpu_core_mask of CPU0. Currently on Arm
this is a fixed value 1 (can be checked via xl info), which is not
correct. This is because during the Arm cpu online process,
set_cpu_sibling_map() only sets the per-cpu cpu_core_mask for itself.

cores_per_socket refers to the number of cores that belong to the same
socket (NUMA node). Therefore, this commit introduces a helper function
numa_set_cpu_core_mask(cpu), which sets the per-cpu cpu_core_mask to
the cpus in the same NUMA node as cpu. Calling this function at the
boot time can ensure the correct cpu_core_mask, leading to the correct
cores_per_socket to be returned by XEN_SYSCTL_physinfo.

Signed-off-by: Henry Wang <Henry.Wang@arm.com>
---
v6:
- Rebase on top of staging without code changes.
---
 xen/arch/arm/include/asm/numa.h |  7 +++++++
 xen/arch/arm/numa.c             | 11 +++++++++++
 xen/arch/arm/setup.c            |  5 +++++
 3 files changed, 23 insertions(+)

diff --git a/xen/arch/arm/include/asm/numa.h b/xen/arch/arm/include/asm/numa.h
index 71b95a9a62..d4c89909d0 100644
--- a/xen/arch/arm/include/asm/numa.h
+++ b/xen/arch/arm/include/asm/numa.h
@@ -46,6 +46,7 @@ extern void numa_set_distance(nodeid_t from, nodeid_t to,
 extern void numa_detect_cpu_node(unsigned int cpu);
 extern int numa_device_tree_init(const void *fdt);
 extern void numa_init(void);
+extern void numa_set_cpu_core_mask(int cpu);
 
 /*
  * Device tree NUMA doesn't have architecural node id.
@@ -62,6 +63,12 @@ static inline unsigned int numa_node_to_arch_nid(nodeid_t n)
 #define cpu_to_node(cpu) 0
 #define node_to_cpumask(node)   (cpu_online_map)
 
+static inline void numa_set_cpu_core_mask(int cpu)
+{
+    cpumask_or(per_cpu(cpu_core_mask, cpu),
+               per_cpu(cpu_core_mask, cpu), &cpu_possible_map);
+}
+
 /*
  * TODO: make first_valid_mfn static when NUMA is supported on Arm, this
  * is required because the dummy helpers are using it.
diff --git a/xen/arch/arm/numa.c b/xen/arch/arm/numa.c
index 13a167fc4f..1ac2df37fc 100644
--- a/xen/arch/arm/numa.c
+++ b/xen/arch/arm/numa.c
@@ -52,6 +52,17 @@ int __init arch_numa_setup(const char *opt)
     return -EINVAL;
 }
 
+void numa_set_cpu_core_mask(int cpu)
+{
+    nodeid_t node = cpu_to_node[cpu];
+
+    if ( node == NUMA_NO_NODE )
+        node = 0;
+
+    cpumask_or(per_cpu(cpu_core_mask, cpu),
+               per_cpu(cpu_core_mask, cpu), &node_to_cpumask(node));
+}
+
 void __init numa_set_distance(nodeid_t from, nodeid_t to,
                               unsigned int distance)
 {
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 01affc12d9..af8631b6e5 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -1229,6 +1229,11 @@ void __init start_xen(unsigned long boot_phys_offset,
     }
 
     printk("Brought up %ld CPUs\n", (long)num_online_cpus());
+
+    /* Set per-cpu cpu_core_mask to cpus that belongs to the same NUMA node. */
+    for_each_online_cpu ( i )
+        numa_set_cpu_core_mask(i);
+
     /* TODO: smp_cpus_done(); */
 
     /* This should be done in a vpmu driver but we do not have one yet. */
-- 
2.25.1



  parent reply	other threads:[~2023-11-20  2:56 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-20  2:54 [PATCH v6 00/17] Device tree based NUMA support for Arm Henry Wang
2023-11-20  2:54 ` [PATCH v6 01/17] xen/arm: use NR_MEM_BANKS to override default NR_NODE_MEMBLKS Henry Wang
2023-11-20  2:54 ` [PATCH v6 02/17] xen/arm: implement helpers to get and update NUMA status Henry Wang
2024-01-03 15:10   ` Julien Grall
2023-11-20  2:54 ` [PATCH v6 03/17] xen/arm: implement node distance helpers for Arm Henry Wang
2023-11-20  2:54 ` [PATCH v6 04/17] xen/arm: use arch_get_ram_range to get memory ranges from bootinfo Henry Wang
2023-11-20  2:54 ` [PATCH v6 05/17] xen/arm: build NUMA cpu_to_node map in dt_smp_init_cpus Henry Wang
2023-11-20  2:54 ` [PATCH v6 06/17] xen/arm: Add boot and secondary CPU to NUMA system Henry Wang
2023-11-20  2:54 ` [PATCH v6 07/17] xen/arm: introduce a helper to parse device tree processor node Henry Wang
2023-11-20  2:54 ` [PATCH v6 08/17] xen/arm: introduce a helper to parse device tree memory node Henry Wang
2023-11-20  2:54 ` [PATCH v6 09/17] xen/arm: introduce a helper to parse device tree NUMA distance map Henry Wang
2023-11-20  2:54 ` [PATCH v6 10/17] xen/arm: unified entry to parse all NUMA data from device tree Henry Wang
2023-11-20  2:54 ` [PATCH v6 11/17] xen/arm: keep guest still be NUMA unware Henry Wang
2023-11-20  2:54 ` [PATCH v6 12/17] xen/arm: enable device tree based NUMA in system init Henry Wang
2023-11-20  2:54 ` [PATCH v6 13/17] xen/arm: implement numa_node_to_arch_nid for device tree NUMA Henry Wang
2023-11-20  2:54 ` [PATCH v6 14/17] xen/arm: use CONFIG_NUMA to gate node_online_map in smpboot Henry Wang
2023-11-20  2:54 ` Henry Wang [this message]
2023-11-20  2:54 ` [PATCH v6 16/17] xen/arm: Provide Kconfig options for Arm to enable NUMA Henry Wang
2023-11-20  2:54 ` [PATCH v6 17/17] docs: update numa command line to support Arm Henry Wang
2023-11-20  8:55   ` Jan Beulich
2023-11-20  8:57     ` Henry Wang
2023-11-30  1:06 ` [PATCH v6 00/17] Device tree based NUMA support for Arm Stefano Stabellini
2023-11-30  2:11   ` Henry Wang
2024-01-03 15:14 ` Julien Grall

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=20231120025431.14845-16-Henry.Wang@arm.com \
    --to=henry.wang@arm.com \
    --cc=Volodymyr_Babchuk@epam.com \
    --cc=bertrand.marquis@arm.com \
    --cc=julien@xen.org \
    --cc=michal.orzel@amd.com \
    --cc=sstabellini@kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    /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.