balance_irq()'s move() while in machine_restart() hangs system
Ingo, if one processor is in move() when another processor calls machine_restart(), the system will hang. All otherCPUs will move into the hlt state, but one in move(), by virtue of smp_num_cpus getting set to 1 in smp_send_stop() before the 4th CPU has completed its work and gets out of move(). It will loop in move() in this chunk:
if (direction == 1) {
cpu++;
if (cpu >= smp_num_cpus)
cpu = 0;
} else {
cpu--;
if (cpu == -1)
cpu = smp_num_cpus-1;
}
} while (!IRQ_ALLOWED(cpu,allowed_mask) ||
(search_idle && !IDLE_ENOUGH(cpu,now)));with smp_num_cpus=1 and never manage to exit.
Is it fair to change smp_send_stop() to call smp_call_function(stop_this_cpu, NULL, 1, 1) instead (make it wait for the other CPUs to complete before continuing)?
Thanks,
Matt
Signature · 4 lines
Matt Domsch Sr. Software Engineer, Lead Engineer, Architect Dell Linux Solutions www.dell.com/linux Linux on Dell mailing lists @ http://lists.us.dell.com
Quoted 3 lines · Matt Domsch
Is it fair to change
smp_send_stop()to callsmp_call_function(stop_this_cpu, NULL, 1, 1)instead (make it wait for the other CPUs to complete before continuing)?
sure, it's fair - at that point all the notification has been done.
Ingo