[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220422200040.93813-12-dqiao@redhat.com>
Date: Fri, 22 Apr 2022 16:00:40 -0400
From: Donghai Qiao <dqiao@...hat.com>
To: akpm@...ux-foundation.org, sfr@...b.auug.org.au, arnd@...db.de,
peterz@...radead.org, heying24@...wei.com,
andriy.shevchenko@...ux.intel.com, axboe@...nel.dk,
rdunlap@...radead.org, tglx@...utronix.de, gor@...ux.ibm.com
Cc: donghai.w.qiao@...il.com, linux-kernel@...r.kernel.org,
Donghai Qiao <dqiao@...hat.com>
Subject: [PATCH v2 11/11] smp: modify up.c to adopt the same format of cross CPU call.
Since smp.c has been changed to use the new interface, up.c should
be changed to use the uniprocessor version of cross call as well.
Signed-off-by: Donghai Qiao <dqiao@...hat.com>
---
v1 -> v2: removed 'x' from the function names and change XCALL to SMP_CALL from the new macros
kernel/up.c | 56 +++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 42 insertions(+), 14 deletions(-)
diff --git a/kernel/up.c b/kernel/up.c
index a38b8b095251..b442e011a059 100644
--- a/kernel/up.c
+++ b/kernel/up.c
@@ -9,8 +9,7 @@
#include <linux/smp.h>
#include <linux/hypervisor.h>
-int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
- int wait)
+int smp_call(int cpu, void (*func) (void *info), void *info, unsigned int type)
{
unsigned long flags;
@@ -23,37 +22,66 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
return 0;
}
-EXPORT_SYMBOL(smp_call_function_single);
+EXPORT_SYMBOL(smp_call);
-int smp_call_function_single_async(int cpu, struct __call_single_data *csd)
+int smp_call_cond(int cpu, smp_call_func_t func, void *info,
+ smp_cond_func_t cond_func, unsigned int type)
+{
+ int ret = 0;
+
+ preempt_disable();
+ if (!cond_func || cond_func(0, info))
+ ret = smp_call(cpu, func, info, type);
+
+ preempt_enable();
+
+ return ret;
+}
+EXPORT_SYMBOL(smp_call_cond);
+
+void smp_call_mask(const struct cpumask *mask, smp_call_func_t func, void *info, unsigned int type)
{
unsigned long flags;
- local_irq_save(flags);
- csd->func(csd->info);
- local_irq_restore(flags);
+ if (!cpumask_test_cpu(0, mask))
+ return;
+
+ preempt_disable();
+ smp_call(cpu, func, info, type);
+ preempt_enable();
+}
+EXPORT_SYMBOL(smp_call_mask);
+
+int smp_call_private(int cpu, struct __call_single_data *csd, unsigned int type)
+{
+ preempt_disable();
+
+ if (csd->func != NULL)
+ smp_call(cpu, csd->func, csd->info, type);
+
+ preempt_enable();
+
return 0;
}
-EXPORT_SYMBOL(smp_call_function_single_async);
+EXPORT_SYMBOL(smp_call_private);
/*
* Preemption is disabled here to make sure the cond_func is called under the
* same conditions in UP and SMP.
*/
-void on_each_cpu_cond_mask(smp_cond_func_t cond_func, smp_call_func_t func,
- void *info, bool wait, const struct cpumask *mask)
+void smp_call_mask_cond(const struct cpumask *mask, smp_call_func_t func,
+ void *info, smp_cond_func_t cond_func,
+ unsigned int type)
{
unsigned long flags;
preempt_disable();
if ((!cond_func || cond_func(0, info)) && cpumask_test_cpu(0, mask)) {
- local_irq_save(flags);
- func(info);
- local_irq_restore(flags);
+ smp_call(cpu, func, info, type);
}
preempt_enable();
}
-EXPORT_SYMBOL(on_each_cpu_cond_mask);
+EXPORT_SYMBOL(smp_call_mask_cond);
int smp_call_on_cpu(unsigned int cpu, int (*func)(void *), void *par, bool phys)
{
--
2.27.0
Powered by blists - more mailing lists