Juergen Gross 10244d
Patch-mainline: v5.10-rc1
Juergen Gross 10244d
Git-commit: e48c15b796d412ede883bb2ef7779b2a142f7962
Juergen Gross 10244d
References: bsc#1180846
Juergen Gross 10244d
From: "Paul E. McKenney" <paulmck@kernel.org>
Juergen Gross 10244d
Date: Mon, 29 Jun 2020 17:21:32 -0700
Juergen Gross 10244d
Subject: [PATCH] smp: Add source and destination CPUs to __call_single_data
Juergen Gross 10244d
Juergen Gross 10244d
This commit adds a destination CPU to __call_single_data, and is inspired
Juergen Gross 10244d
by an earlier commit by Peter Zijlstra.  This version adds #ifdef to
Juergen Gross 10244d
permit use by 32-bit systems and supplying the destination CPU for all
Juergen Gross 10244d
smp_call_function*() requests, not just smp_call_function_single().
Juergen Gross 10244d
Juergen Gross 10244d
If need be, 32-bit systems could be accommodated by shrinking the flags
Juergen Gross 10244d
field to 16 bits (the atomic_t variant is currently unused) and by
Juergen Gross 10244d
providing only eight bits for CPU on such systems.
Juergen Gross 10244d
Juergen Gross 10244d
It is not clear that the addition of the fields to __call_single_node
Juergen Gross 10244d
are really needed.
Juergen Gross 10244d
Juergen Gross 10244d
[ paulmck: Apply Boqun Feng feedback on 32-bit builds. ]
Juergen Gross 10244d
Link: https://lore.kernel.org/lkml/20200615164048.GC2531@hirez.programming.kicks-ass.net/
Juergen Gross 10244d
Cc: Peter Zijlstra <peterz@infradead.org>
Juergen Gross 10244d
Cc: Ingo Molnar <mingo@kernel.org>
Juergen Gross 10244d
Cc: Thomas Gleixner <tglx@linutronix.de>
Juergen Gross 10244d
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Juergen Gross 10244d
Cc: Frederic Weisbecker <frederic@kernel.org>
Juergen Gross 10244d
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Juergen Gross 10244d
Signed-off-by: Juergen Gross <jgross@suse.com>
Juergen Gross 10244d
---
Juergen Gross 10244d
 include/linux/smp.h       | 3 +++
Juergen Gross 10244d
 kernel/smp.c              | 6 ++++++
Juergen Gross 10244d
 2 files changed, 9 insertions(+)
Juergen Gross 10244d
Juergen Gross 10244d
diff --git a/include/linux/smp.h b/include/linux/smp.h
Juergen Gross 10244d
index 80d557ef8a11..9f13966d3d92 100644
Juergen Gross 10244d
--- a/include/linux/smp.h
Juergen Gross 10244d
+++ b/include/linux/smp.h
Juergen Gross 10244d
@@ -20,6 +20,9 @@ struct __call_single_data {
Juergen Gross 10244d
 	smp_call_func_t func;
Juergen Gross 10244d
 	void *info;
Juergen Gross 10244d
 	unsigned int flags;
Juergen Gross 10244d
+#ifdef CONFIG_64BIT
Juergen Gross 10244d
+	u16 src, dst;
Juergen Gross 10244d
+#endif
Juergen Gross 10244d
 };
Juergen Gross 10244d
 
Juergen Gross 10244d
 /* Use __aligned() to avoid to use 2 cache lines for 1 csd */
Juergen Gross 10244d
diff --git a/kernel/smp.c b/kernel/smp.c
Juergen Gross 10244d
index d0ae8eb6bf8b..865a876f83ce 100644
Juergen Gross 10244d
--- a/kernel/smp.c
Juergen Gross 10244d
+++ b/kernel/smp.c
Juergen Gross 10244d
@@ -164,6 +164,9 @@ int generic_exec_single(int cpu, call_single_data_t *csd,
Juergen Gross 10244d
 
Juergen Gross 10244d
 	csd->func = func;
Juergen Gross 10244d
 	csd->info = info;
Juergen Gross 10244d
+#ifdef CONFIG_64BIT
Juergen Gross 10244d
+	csd->dst = cpu;
Juergen Gross 10244d
+#endif
Juergen Gross 10244d
 
Juergen Gross 10244d
 	/*
Juergen Gross 10244d
 	 * The list addition should be visible before sending the IPI
Juergen Gross 10244d
@@ -470,6 +473,9 @@ static void smp_call_function_many(const struct cpumask *mask,
Juergen Gross 10244d
 			csd->flags |= CSD_FLAG_SYNCHRONOUS;
Juergen Gross 10244d
 		csd->func = func;
Juergen Gross 10244d
 		csd->info = info;
Juergen Gross 10244d
+#ifdef CONFIG_64BIT
Juergen Gross 10244d
+		csd->dst = cpu;
Juergen Gross 10244d
+#endif
Juergen Gross 10244d
 		if (llist_add(&csd->llist, &per_cpu(call_single_queue, cpu)))
Juergen Gross 10244d
 			__cpumask_set_cpu(cpu, cfd->cpumask_ipi);
Juergen Gross 10244d
 	}
Juergen Gross 10244d
-- 
Juergen Gross 10244d
2.26.2
Juergen Gross 10244d