From: Donghai Qiao <dqiao@redhat.com>
To: akpm@linux-foundation.org, sfr@canb.auug.org.au, arnd@arndb.de,
peterz@infradead.org, heying24@huawei.com,
andriy.shevchenko@linux.intel.com, axboe@kernel.dk,
rdunlap@infradead.org, tglx@linutronix.de, gor@linux.ibm.com
Cc: donghai.w.qiao@gmail.com, linux-kernel@vger.kernel.org,
Donghai Qiao <dqiao@redhat.com>
Subject: [PATCH v3 04/11] smp: replace smp_call_function_single() with smp_call()
Date: Tue, 17 May 2022 14:03:19 -0400 [thread overview]
Message-ID: <20220517180326.997129-5-dqiao@redhat.com> (raw)
In-Reply-To: <20220517180326.997129-1-dqiao@redhat.com>
Eliminated the percpu global csd_data and temporarily hooked up
smp_call_function_single() to smp_call().
Signed-off-by: Donghai Qiao <dqiao@redhat.com>
---
v1 -> v2: Removed 'x' from the function names and change XCALL to
SMP_CALL from the new macros
kernel/smp.c | 74 ++++++++++++++++++----------------------------------
1 file changed, 25 insertions(+), 49 deletions(-)
diff --git a/kernel/smp.c b/kernel/smp.c
index 101a48d1d8af..8fdea9547502 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -414,8 +414,6 @@ static __always_inline void csd_unlock(struct __call_single_data *csd)
smp_store_release(&csd->node.u_flags, 0);
}
-static DEFINE_PER_CPU_SHARED_ALIGNED(call_single_data_t, csd_data);
-
void __smp_call_single_queue(int cpu, struct llist_node *node)
{
#ifdef CONFIG_CSD_LOCK_WAIT_DEBUG
@@ -649,6 +647,9 @@ void flush_smp_call_function_from_idle(void)
}
/*
+ * This is a temporarily hook up. This function will be eliminated
+ * with a later patch in this series.
+ *
* smp_call_function_single - Run a function on a specific CPU
* @func: The function to run. This must be fast and non-blocking.
* @info: An arbitrary pointer to pass to the function.
@@ -657,59 +658,21 @@ void flush_smp_call_function_from_idle(void)
* Returns 0 on success, else a negative status code.
*/
int smp_call_function_single(int cpu, smp_call_func_t func, void *info,
- int wait)
+ int wait)
{
- call_single_data_t *csd;
- call_single_data_t csd_stack = {
- .node = { .u_flags = CSD_FLAG_LOCK | CSD_TYPE_SYNC, },
- };
- int this_cpu;
- int err;
-
- /*
- * prevent preemption and reschedule on another processor,
- * as well as CPU removal
- */
- this_cpu = get_cpu();
-
- /*
- * Can deadlock when called with interrupts disabled.
- * We allow cpu's that are not yet online though, as no one else can
- * send smp call function interrupt to this cpu and as such deadlocks
- * can't happen.
- */
- WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled()
- && !oops_in_progress);
+ unsigned int flags = 0;
- /*
- * When @wait we can deadlock when we interrupt between llist_add() and
- * arch_send_call_function_ipi*(); when !@wait we can deadlock due to
- * csd_lock() on because the interrupt context uses the same csd
- * storage.
- */
- WARN_ON_ONCE(!in_task());
-
- csd = &csd_stack;
- if (!wait) {
- csd = this_cpu_ptr(&csd_data);
- csd_lock(csd);
- }
-
- csd->func = func;
- csd->info = info;
-#ifdef CONFIG_CSD_LOCK_WAIT_DEBUG
- csd->node.src = smp_processor_id();
- csd->node.dst = cpu;
-#endif
-
- err = generic_exec_single(cpu, csd);
+ if ((unsigned int)cpu >= nr_cpu_ids || !cpu_online(cpu))
+ return -ENXIO;
if (wait)
- csd_lock_wait(csd);
+ flags = SMP_CALL_TYPE_SYNC;
+ else
+ flags = SMP_CALL_TYPE_ASYNC;
- put_cpu();
+ smp_call(cpu, func, info, flags);
- return err;
+ return 0;
}
EXPORT_SYMBOL(smp_call_function_single);
@@ -1175,6 +1138,19 @@ void __smp_call_mask_cond(const struct cpumask *mask,
smp_cond_func_t cond_func, bool local_cpu,
unsigned int flags)
{
+ bool wait = false;
+
+ if (flags == SMP_CALL_TYPE_SYNC)
+ wait = true;
+
+ preempt_disable();
+
+ /*
+ * This is temporarily hook. The function smp_call_function_many_cond()
+ * will be inlined here with a later patch in this series.
+ */
+ smp_call_function_many_cond(mask, func, info, local_cpu, wait, cond_func);
+ preempt_enable();
}
/*
--
2.27.0
next prev parent reply other threads:[~2022-05-17 18:04 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-17 18:03 [PATCH v3 00/11] smp: cross CPU call interface Donghai Qiao
2022-05-17 18:03 ` [PATCH v3 01/11] smp: consolidate the structure definitions to smp.h Donghai Qiao
2022-05-18 9:02 ` Christoph Hellwig
2022-05-17 18:03 ` [PATCH v3 02/11] smp: the definitions of cross call interface Donghai Qiao
2022-05-17 18:03 ` [PATCH v3 03/11] smp: remove SCF_WAIT and SCF_RUN_LOCAL Donghai Qiao
2022-05-17 18:03 ` Donghai Qiao [this message]
2022-05-17 18:03 ` [PATCH v3 05/11] smp: replace smp_call_function_single_async with smp_call_csd Donghai Qiao
2022-05-17 18:03 ` [PATCH v3 06/11] smp: use smp_call_csd() from irq_work.c and core.c Donghai Qiao
2022-05-17 18:03 ` [PATCH v3 07/11] smp: eliminate smp_call_function_any Donghai Qiao
2022-05-18 19:39 ` kernel test robot
2022-05-17 18:03 ` [PATCH v3 08/11] smp: replace smp_call_function_many_cond() with __smp_call_mask_cond() Donghai Qiao
2022-05-18 20:09 ` kernel test robot
2022-05-17 18:03 ` [PATCH v3 09/11] smp: replace smp_call_function_single_async with smp_call_csd Donghai Qiao
2022-05-17 18:03 ` [PATCH v3 10/11] smp: replace smp_call_function_single() with smp_call() Donghai Qiao
2022-05-17 18:03 ` [PATCH v3 11/11] smp: up.c to adopt the same format of cross CPU call Donghai Qiao
2022-05-18 6:19 ` [PATCH v3 00/11] smp: cross CPU call interface Sven Schnelle
2022-05-18 9:04 ` Christoph Hellwig
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=20220517180326.997129-5-dqiao@redhat.com \
--to=dqiao@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=andriy.shevchenko@linux.intel.com \
--cc=arnd@arndb.de \
--cc=axboe@kernel.dk \
--cc=donghai.w.qiao@gmail.com \
--cc=gor@linux.ibm.com \
--cc=heying24@huawei.com \
--cc=linux-kernel@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=rdunlap@infradead.org \
--cc=sfr@canb.auug.org.au \
--cc=tglx@linutronix.de \
/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
all inboxes | Powered by JetHome®