From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: akpm@linux-foundation.org, Ingo Molnar <mingo@elte.hu>,
linux-kernel@vger.kernel.org
Cc: Andi Kleen <andi@firstfloor.org>,
Rusty Russell <rusty@rustcorp.com.au>,
Jason Baron <jbaron@redhat.com>,
Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>,
Adrian Bunk <bunk@stusta.de>,
Alexey Dobriyan <adobriyan@gmail.com>,
Christoph Hellwig <hch@infradead.org>,
akpm@osdl.org
Subject: [patch 11/17] Implement immediate update via stop_machine_run
Date: Wed, 09 Apr 2008 11:08:40 -0400 [thread overview]
Message-ID: <20080409152050.389300996@polymtl.ca> (raw)
In-Reply-To: 20080409150829.855195878@polymtl.ca
[-- Attachment #1: implement-immediate-update-via-stop-machine-run.patch --]
[-- Type: text/plain, Size: 4771 bytes --]
-Updating immediate values, cannot rely on smp_call_function() b/c synchronizing
cpus using IPIs leads to deadlocks. Process A held a read lock on
tasklist_lock, then process B called apply_imv_update(). Process A received the
IPI and begins executing ipi_busy_loop(). Then process C takes a write lock
irq on the task list lock, before receiving the IPI. Thus, process A holds up
process C, and C can't get an IPI b/c interrupts are disabled. Solve this
problem by using a new 'ALL_CPUS' parameter to stop_machine_run(). Which
runs a function on all cpus after they are busy looping and have disabled
irqs. Since this is done in a new process context, we don't have to worry
about interrupted spin_locks. Also, less lines of code. Has survived 24 hours+
of testing...
Signed-off-by: Jason Baron <jbaron@redhat.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
CC: Rusty Russell <rusty@rustcorp.com.au>
CC: Adrian Bunk <bunk@stusta.de>
CC: Andi Kleen <andi@firstfloor.org>
CC: Alexey Dobriyan <adobriyan@gmail.com>
CC: Christoph Hellwig <hch@infradead.org>
CC: mingo@elte.hu
CC: akpm@osdl.org
---
kernel/immediate.c | 80 +++++++++++++----------------------------------------
1 file changed, 21 insertions(+), 59 deletions(-)
Index: linux-2.6-lttng/kernel/immediate.c
===================================================================
--- linux-2.6-lttng.orig/kernel/immediate.c 2008-03-03 10:22:06.000000000 -0500
+++ linux-2.6-lttng/kernel/immediate.c 2008-03-03 10:42:38.000000000 -0500
@@ -20,6 +20,7 @@
#include <linux/immediate.h>
#include <linux/memory.h>
#include <linux/cpu.h>
+#include <linux/stop_machine.h>
#include <asm/cacheflush.h>
@@ -27,48 +28,33 @@
* Kernel ready to execute the SMP update that may depend on trap and ipi.
*/
static int imv_early_boot_complete;
+static int wrote_text;
extern const struct __imv __start___imv[];
extern const struct __imv __stop___imv[];
+static int stop_machine_imv_update(void *imv_ptr)
+{
+ struct __imv *imv = imv_ptr;
+
+ if (!wrote_text) {
+ text_poke((void *)imv->imv, (void *)imv->var, imv->size);
+ wrote_text = 1;
+ smp_wmb(); /* make sure other cpus see that this has run */
+ } else
+ sync_core();
+
+ flush_icache_range(imv->imv, imv->imv + imv->size);
+
+ return 0;
+}
+
/*
* imv_mutex nests inside module_mutex. imv_mutex protects builtin
* immediates and module immediates.
*/
static DEFINE_MUTEX(imv_mutex);
-static atomic_t wait_sync;
-
-struct ipi_loop_data {
- long value;
- const struct __imv *imv;
-} loop_data;
-
-static void ipi_busy_loop(void *arg)
-{
- unsigned long flags;
-
- local_irq_save(flags);
- atomic_dec(&wait_sync);
- do {
- /* Make sure the wait_sync gets re-read */
- smp_mb();
- } while (atomic_read(&wait_sync) > loop_data.value);
- atomic_dec(&wait_sync);
- do {
- /* Make sure the wait_sync gets re-read */
- smp_mb();
- } while (atomic_read(&wait_sync) > 0);
- /*
- * Issuing a synchronizing instruction must be done on each CPU before
- * reenabling interrupts after modifying an instruction. Required by
- * Intel's errata.
- */
- sync_core();
- flush_icache_range(loop_data.imv->imv,
- loop_data.imv->imv + loop_data.imv->size);
- local_irq_restore(flags);
-}
/**
* apply_imv_update - update one immediate value
@@ -82,9 +68,6 @@ static void ipi_busy_loop(void *arg)
*/
static int apply_imv_update(const struct __imv *imv)
{
- unsigned long flags;
- long online_cpus;
-
/*
* If the variable and the instruction have the same value, there is
* nothing to do.
@@ -111,30 +94,9 @@ static int apply_imv_update(const struct
if (imv_early_boot_complete) {
kernel_text_lock();
- get_online_cpus();
- online_cpus = num_online_cpus();
- atomic_set(&wait_sync, 2 * online_cpus);
- loop_data.value = online_cpus;
- loop_data.imv = imv;
- smp_call_function(ipi_busy_loop, NULL, 1, 0);
- local_irq_save(flags);
- atomic_dec(&wait_sync);
- do {
- /* Make sure the wait_sync gets re-read */
- smp_mb();
- } while (atomic_read(&wait_sync) > online_cpus);
- text_poke((void *)imv->imv, (void *)imv->var,
- imv->size);
- /*
- * Make sure the modified instruction is seen by all CPUs before
- * we continue (visible to other CPUs and local interrupts).
- */
- wmb();
- atomic_dec(&wait_sync);
- flush_icache_range(imv->imv,
- imv->imv + imv->size);
- local_irq_restore(flags);
- put_online_cpus();
+ wrote_text = 0;
+ stop_machine_run(stop_machine_imv_update, (void *)imv,
+ ALL_CPUS);
kernel_text_unlock();
} else
text_poke_early((void *)imv->imv, (void *)imv->var,
--
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
next prev parent reply other threads:[~2008-04-09 16:26 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-09 15:08 [patch 00/17] Text Edit Lock and Immediate Values for 2.6.25-rc8-mm1 Mathieu Desnoyers
2008-04-09 15:08 ` [patch 01/17] Kprobes - use a mutex to protect the instruction pages list Mathieu Desnoyers
2008-04-09 20:08 ` Masami Hiramatsu
2008-04-09 15:08 ` [patch 02/17] Kprobes - do not use kprobes mutex in arch code Mathieu Desnoyers
2008-04-09 20:08 ` Masami Hiramatsu
2008-04-09 15:08 ` [patch 03/17] Kprobes - declare kprobe_mutex static Mathieu Desnoyers
2008-04-09 20:08 ` Masami Hiramatsu
2008-04-09 15:08 ` [patch 04/17] x86 - Enhance DEBUG_RODATA support - alternatives Mathieu Desnoyers
2008-04-09 15:08 ` [patch 05/17] x86 Fix text_poke for vmalloced pages Mathieu Desnoyers
2008-04-09 15:08 ` [patch 06/17] x86 - Enhance DEBUG_RODATA support for hotplug and kprobes Mathieu Desnoyers
2008-04-09 15:08 ` [patch 07/17] Text Edit Lock - Architecture Independent Code Mathieu Desnoyers
2008-04-09 15:08 ` [patch 08/17] Text Edit Lock - kprobes architecture independent support Mathieu Desnoyers
2008-04-09 15:08 ` [patch 09/17] Add all cpus option to stop machine run Mathieu Desnoyers
2008-04-09 18:10 ` Alexey Dobriyan
2008-04-09 18:24 ` Andi Kleen
2008-04-10 3:34 ` Rusty Russell
2008-04-10 4:26 ` KOSAKI Motohiro
2008-04-09 18:54 ` Mathieu Desnoyers
2008-04-09 15:08 ` [patch 10/17] Immediate Values - Architecture Independent Code Mathieu Desnoyers
2008-04-09 15:08 ` Mathieu Desnoyers [this message]
2008-04-10 8:04 ` [patch 11/17] Implement immediate update via stop_machine_run KOSAKI Motohiro
2008-04-10 20:01 ` Mathieu Desnoyers
2008-04-11 4:50 ` KOSAKI Motohiro
2008-04-09 15:08 ` [patch 12/17] Immediate Values - Kconfig menu in EMBEDDED Mathieu Desnoyers
2008-04-10 3:23 ` Rusty Russell
2008-04-10 19:32 ` [patch 12/17] Immediate Values - Kconfig menu in EMBEDDED (updated) Mathieu Desnoyers
2008-04-10 21:54 ` Rusty Russell
2008-04-14 23:52 ` Mathieu Desnoyers
2008-04-09 15:08 ` [patch 13/17] Immediate Values - x86 Optimization Mathieu Desnoyers
2008-04-09 18:01 ` H. Peter Anvin
2008-04-09 19:08 ` Mathieu Desnoyers
2008-04-09 22:33 ` H. Peter Anvin
2008-04-10 0:42 ` Mathieu Desnoyers
2008-04-10 0:47 ` H. Peter Anvin
2008-04-09 20:21 ` [patch 13/17] Immediate Values - x86 Optimization (updated) Mathieu Desnoyers
2008-04-09 22:33 ` H. Peter Anvin
2008-04-09 23:15 ` Mathieu Desnoyers
2008-04-09 15:08 ` [patch 14/17] Add text_poke and sync_core to powerpc Mathieu Desnoyers
2008-04-09 15:08 ` [patch 15/17] Immediate Values - Powerpc Optimization Mathieu Desnoyers
2008-04-09 15:08 ` [patch 16/17] Immediate Values - Documentation Mathieu Desnoyers
2008-04-10 3:33 ` Rusty Russell
2008-04-11 1:16 ` Mathieu Desnoyers
2008-04-11 15:06 ` Rusty Russell
2008-04-15 0:12 ` Mathieu Desnoyers
2008-04-11 13:44 ` [RFC PATCH] Immediate Values Support init Mathieu Desnoyers
2008-04-09 15:08 ` [patch 17/17] Scheduler Profiling - Use Immediate Values Mathieu Desnoyers
2008-04-10 4:23 ` [patch 00/17] Text Edit Lock and Immediate Values for 2.6.25-rc8-mm1 KOSAKI Motohiro
2008-04-10 7:31 ` Takashi Nishiie
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=20080409152050.389300996@polymtl.ca \
--to=mathieu.desnoyers@polymtl.ca \
--cc=adobriyan@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=akpm@osdl.org \
--cc=andi@firstfloor.org \
--cc=bunk@stusta.de \
--cc=hch@infradead.org \
--cc=jbaron@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=rusty@rustcorp.com.au \
/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