Messages in this thread Patch in this message | | | Date | Sun, 24 Aug 2008 10:17:13 -0700 | From | "H. Peter Anvin" <> | Subject | Re: latest -git: WARNING: at arch/x86/kernel/ipi.c:123 send_IPI_mask_bitmask+0xc3/0xe0() |
| |
Vegard Nossum wrote: > > Hm. > > Kernel fails to detect cpu1 at all. > > I am currently unsure of whether it's your patch or not. But it's the > same config that I've been booting for ages (and I copy it over for > each new kernel version I check out). > > Processor #0 (Bootup-CPU) > I/O APIC #2 Version 32 at 0xFEC00000. > Enabling APIC mode: Flat. Using 1 I/O APICs > Processors: 1 > SMP: Allowing 1 CPUs, 0 hotplug CPUs > mapped APIC to ffffb000 (fee00000) > mapped IOAPIC to ffffa000 (fec00000) > Allocating PCI resources starting at 50000000 (gap: 40000000:bee00000) > PERCPU: Allocating 1221764 bytes of per cpu data > NR_CPUS: 7, nr_cpu_ids: 1, nr_node_ids 1 > > I really don't get it. Is this something that can be caused by your > patch _at all_ ? >
Could you try this patch? It should (hopefully) tell us if there is any such invocations and what the call trace looks like.
-hpa diff --git a/kernel/smp.c b/kernel/smp.c index 782e2b9..95e1bad 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -210,8 +210,10 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info, { struct call_single_data d; unsigned long flags; - /* prevent preemption and reschedule on another processor */ + /* prevent preemption and reschedule on another processor, + as well as CPU removal */ int me = get_cpu(); + int err = 0; /* Can deadlock when called with interrupts disabled */ WARN_ON(irqs_disabled()); @@ -220,7 +222,7 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info, local_irq_save(flags); func(info); local_irq_restore(flags); - } else { + } else if ((unsigned)cpu < NR_CPUS && cpu_online(cpu)) { struct call_single_data *data = NULL; if (!wait) { @@ -236,10 +238,13 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info, data->func = func; data->info = info; generic_exec_single(cpu, data); + } else { + BUG(); + err = -ENXIO; /* CPU not online */ } put_cpu(); - return 0; + return err; } EXPORT_SYMBOL(smp_call_function_single); | |