Skip to contentSkip to conversation

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

DISCUSSION Matt Domsch 2 participants 2 messages Apr 9, 2003 – Apr 10, 2003

lore
Share & tools
lore
#0 lore raw

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
#1 lore raw
Quoted 3 lines · Matt Domsch

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

sure, it's fair - at that point all the notification has been done.

Ingo