be1057174e
* Completely remove the option STOP_NMI from the kernel. This option has proven to have a good effect when entering KDB by using a NMI, but it completely violates all the good rules about interrupts disabled while holding a spinlock in other occasions. This can be the cause of deadlocks on events where a normal IPI_STOP is expected. * Add an new IPI called IPI_STOP_HARD on all the supported architectures. This IPI is responsible for sending a stop message among CPUs using a privileged channel when disponible. In other cases it just does match a normal IPI_STOP. Right now the IPI_STOP_HARD functionality uses a NMI on ia32 and amd64 architectures, while on the other has a normal IPI_STOP effect. It is responsibility of maintainers to eventually implement an hard stop when necessary and possible. * Use the new IPI facility in order to implement a new userend SMP kernel function called stop_cpus_hard(). That is specular to stop_cpu() but it does use the privileged channel for the stopping facility. * Let KDB use the newly introduced function stop_cpus_hard() and leave stop_cpus() for all the other cases * Disable interrupts on CPU0 when starting the process of APs suspension. * Style cleanup and comments adding This patch should fix the reboot/shutdown deadlocks many users are constantly reporting on mailing lists. Please don't forget to update your config file with the STOP_NMI option removal Reviewed by: jhb Tested by: pho, bz, rink Approved by: re (kib) |
||
---|---|---|
.. | ||
autoconf.c | ||
busdma_machdep.c | ||
cache_mipsNN.c | ||
cache.c | ||
copystr.S | ||
cpu.c | ||
db_disasm.c | ||
db_interface.c | ||
db_trace.c | ||
dump_machdep.c | ||
elf64_machdep.c | ||
elf_machdep.c | ||
exception.S | ||
fp.S | ||
gdb_machdep.c | ||
genassym.c | ||
in_cksum.c | ||
intr_machdep.c | ||
locore.S | ||
machdep.c | ||
mainbus.c | ||
mem.c | ||
mp_machdep.c | ||
nexus.c | ||
pm_machdep.c | ||
pmap.c | ||
psraccess.S | ||
stack_machdep.c | ||
support.S | ||
swtch.S | ||
tick.c | ||
tlb.S | ||
trap.c | ||
uio_machdep.c | ||
vm_machdep.c |