From: Nathan Fontenot <nfont@linux.vnet.ibm.com>
To: linuxppc-dev@lists.ozlabs.org
Subject: [PATCH v2 7/11] Use stop machine to update cpu maps
Date: Mon, 25 Mar 2013 13:58:04 -0500 [thread overview]
Message-ID: <51509E3C.2030008@linux.vnet.ibm.com> (raw)
In-Reply-To: <51509AE8.8070803@linux.vnet.ibm.com>
From: Jesse Larrew <jlarrew@linux.vnet.ibm.com>
The new PRRN firmware feature allows CPU and memory resources to be
transparently reassigned across NUMA boundaries. When this happens, the
kernel must update the node maps to reflect the new affinity
information.
Although the NUMA maps can be protected by locking primitives during the
update itself, this is insufficient to prevent concurrent accesses to these
structures. Since cpumask_of_node() hands out a pointer to these
structures, they can still be modified outside of the lock. Furthermore,
tracking down each usage of these pointers and adding locks would be quite
invasive and difficult to maintain.
Situations like these are best handled using stop_machine(). Since the NUMA
affinity updates are exceptionally rare events, this approach has the
benefit of not adding any overhead while accessing the NUMA maps during
normal operation.
Signed-off-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
---
arch/powerpc/mm/numa.c | 51 +++++++++++++++++++++++++++++++++----------------
1 file changed, 35 insertions(+), 16 deletions(-)
Index: powerpc/arch/powerpc/mm/numa.c
===================================================================
--- powerpc.orig/arch/powerpc/mm/numa.c 2013-03-20 12:26:36.000000000 -0500
+++ powerpc/arch/powerpc/mm/numa.c 2013-03-20 12:27:43.000000000 -0500
@@ -22,6 +22,7 @@
#include <linux/pfn.h>
#include <linux/cpuset.h>
#include <linux/node.h>
+#include <linux/stop_machine.h>
#include <asm/sparsemem.h>
#include <asm/prom.h>
#include <asm/smp.h>
@@ -1254,6 +1255,12 @@
/* Virtual Processor Home Node (VPHN) support */
#ifdef CONFIG_PPC_SPLPAR
+struct topology_update_data {
+ int cpu;
+ int old_nid;
+ int new_nid;
+};
+
static u8 vphn_cpu_change_counts[NR_CPUS][MAX_DISTANCE_REF_POINTS];
static cpumask_t cpu_associativity_changes_mask;
static int vphn_enabled;
@@ -1405,34 +1412,46 @@
}
/*
+ * Update the CPU maps and sysfs entries for a single CPU when its NUMA
+ * characteristics change. This function doesn't perform any locking and is
+ * only safe to call from stop_machine().
+ */
+static int update_cpu_topology(void *data)
+{
+ struct topology_update_data *update = data;
+
+ if (!update)
+ return -EINVAL;
+
+ unregister_cpu_under_node(update->cpu, update->old_nid);
+ unmap_cpu_from_node(update->cpu);
+ map_cpu_to_node(update->cpu, update->new_nid);
+ register_cpu_under_node(update->cpu, update->new_nid);
+
+ return 0;
+}
+
+/*
* Update the node maps and sysfs entries for each cpu whose home node
* has changed. Returns 1 when the topology has changed, and 0 otherwise.
*/
int arch_update_cpu_topology(void)
{
- int cpu, nid, old_nid, changed = 0;
+ int cpu, changed = 0;
+ struct topology_update_data update;
unsigned int associativity[VPHN_ASSOC_BUFSIZE] = {0};
struct device *dev;
for_each_cpu(cpu, &cpu_associativity_changes_mask) {
+ update.cpu = cpu;
vphn_get_associativity(cpu, associativity);
- nid = associativity_to_nid(associativity);
-
- if (nid < 0 || !node_online(nid))
- nid = first_online_node;
+ update.new_nid = associativity_to_nid(associativity);
- old_nid = numa_cpu_lookup_table[cpu];
-
- /* Disable hotplug while we update the cpu
- * masks and sysfs.
- */
- get_online_cpus();
- unregister_cpu_under_node(cpu, old_nid);
- unmap_cpu_from_node(cpu);
- map_cpu_to_node(cpu, nid);
- register_cpu_under_node(cpu, nid);
- put_online_cpus();
+ if (update.new_nid < 0 || !node_online(update.new_nid))
+ update.new_nid = first_online_node;
+ update.old_nid = numa_cpu_lookup_table[cpu];
+ stop_machine(update_cpu_topology, &update, cpu_online_mask);
dev = get_cpu_device(cpu);
if (dev)
kobject_uevent(&dev->kobj, KOBJ_CHANGE);
next prev parent reply other threads:[~2013-03-25 18:58 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-25 18:43 [PATCH v2 0/11] NUMA CPU Reconfiguration using PRRN Nathan Fontenot
2013-03-25 18:51 ` [PATCH v2 1/11] Expose pseries devicetree_update() Nathan Fontenot
2013-04-04 3:09 ` Paul Mackerras
2013-03-25 18:52 ` [PATCH v2 2/11] Add PRRN Event Handler Nathan Fontenot
2013-04-04 3:34 ` Paul Mackerras
2013-04-04 7:16 ` Benjamin Herrenschmidt
2013-04-05 15:43 ` Nathan Fontenot
2013-04-10 8:30 ` Michael Ellerman
2013-04-15 20:12 ` Nathan Fontenot
2013-03-25 18:53 ` [PATCH v2 3/11] Move architecture vector definitions to prom.h Nathan Fontenot
2013-03-25 18:54 ` [PATCH v2 4/11] Update firmware_has_feature() to check architecture bits Nathan Fontenot
2013-04-04 4:19 ` Paul Mackerras
2013-03-25 18:56 ` [PATCH v2 5/11] Update numa.c to use updated firmware_has_feature() Nathan Fontenot
2013-04-04 4:20 ` Paul Mackerras
2013-03-25 18:57 ` [PATCH v2 6/11] Update CPU Maps Nathan Fontenot
2013-04-04 4:42 ` Paul Mackerras
2013-04-05 18:02 ` Nathan Fontenot
2013-03-25 18:58 ` Nathan Fontenot [this message]
2013-04-04 4:46 ` [PATCH v2 7/11] Use stop machine to update cpu maps Paul Mackerras
2013-04-05 18:22 ` Nathan Fontenot
2013-04-23 0:23 ` Benjamin Herrenschmidt
2013-03-25 18:59 ` [PATCH v2 8/11] Update numa cpu vdso info Nathan Fontenot
2013-03-25 19:00 ` [PATCH v2 9/11] Re-enable Virtual Private Home Node capabilities Nathan Fontenot
2013-03-25 19:01 ` [PATCH v2 10/11] Enable PRRN Nathan Fontenot
2013-03-25 19:02 ` [PATCH v2 11/11] Add /proc interface to control topology updates Nathan Fontenot
2013-04-10 6:59 ` Michael Ellerman
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=51509E3C.2030008@linux.vnet.ibm.com \
--to=nfont@linux.vnet.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).