balance_irq()'s move() while in machine_restart() hangs system

Matt Domsch (Matt_Domsch@dell.com)
09 Apr 2003 17:56:38 -0500


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

-- 
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

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/