(2013/11/14 19:41), Petr Mladek wrote: > We would like to use text_poke_bp in ftrace. It might be called also during > boot when there is only one CPU and we do not need to sync the others. > > The check is must to have because there are also disabled interrupts during > the boot. Then the call would cause a deadlock, see the warning in > "smp_call_function_many", kernel/smp.c:371. > > The change is inspired by the code in arch/x86/kernel/ftrace.c.
Looks good for me :) Reviewed-by: Masami Hiramatsu <masami.hiramatsu...@hitachi.com> > > Signed-off-by: Petr Mladek <pmla...@suse.cz> > --- > arch/x86/kernel/alternative.c | 17 ++++++++++++++--- > 1 file changed, 14 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c > index 2aebe54..125fb16 100644 > --- a/arch/x86/kernel/alternative.c > +++ b/arch/x86/kernel/alternative.c > @@ -603,6 +603,17 @@ static void do_sync_core(void *info) > sync_core(); > } > > +static void run_sync(void) > +{ > + /* > + * We do not need to sync other cores during boot when there is only one > + * CPU enabled. In fact, we must not because there are also disabled > + * interrupts. The call would fail because of a potential deadlock. > + */ > + if (num_online_cpus() != 1) > + on_each_cpu(do_sync_core, NULL, 1); > +} > + > static bool bp_patching_in_progress; > static void *bp_int3_handler, *bp_int3_addr; > > @@ -665,7 +676,7 @@ int text_poke_bp(void *addr, const void *opcode, size_t > len, void *handler) > if (unlikely(ret)) > goto fail; > > - on_each_cpu(do_sync_core, NULL, 1); > + run_sync(); > > if (len - sizeof(int3) > 0) { > /* patch all but the first byte */ > @@ -678,14 +689,14 @@ int text_poke_bp(void *addr, const void *opcode, size_t > len, void *handler) > * not necessary and we'd be safe even without it. But > * better safe than sorry (plus there's not only Intel). > */ > - on_each_cpu(do_sync_core, NULL, 1); > + run_sync(); > } > > /* patch the first byte */ > ret = text_poke(addr, opcode, sizeof(int3)); > BUG_ON(ret); > > - on_each_cpu(do_sync_core, NULL, 1); > + run_sync(); > > fail: > bp_patching_in_progress = false; > -- Masami HIRAMATSU IT Management Research Dept. Linux Technology Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: masami.hiramatsu...@hitachi.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/