diff options
author | attilio <attilio@FreeBSD.org> | 2009-08-13 17:09:45 +0000 |
---|---|---|
committer | attilio <attilio@FreeBSD.org> | 2009-08-13 17:09:45 +0000 |
commit | e85ca71aadcc42a3f7cc90e6cff96c28f1c54290 (patch) | |
tree | fa01b2cb8792e972d05922a5507e082efa4d4c1d /sys/amd64/include/apicvar.h | |
parent | b1786d80d2f6e85141431d158b4cf3a47a2f71ec (diff) | |
download | FreeBSD-src-e85ca71aadcc42a3f7cc90e6cff96c28f1c54290.zip FreeBSD-src-e85ca71aadcc42a3f7cc90e6cff96c28f1c54290.tar.gz |
* 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.
* Adds 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)
Diffstat (limited to 'sys/amd64/include/apicvar.h')
-rw-r--r-- | sys/amd64/include/apicvar.h | 6 |
1 files changed, 1 insertions, 5 deletions
diff --git a/sys/amd64/include/apicvar.h b/sys/amd64/include/apicvar.h index 84ba3b8..73fff6c 100644 --- a/sys/amd64/include/apicvar.h +++ b/sys/amd64/include/apicvar.h @@ -102,11 +102,6 @@ * smp_ipi_mtx and waits for the completion of the IPI (Only one IPI user * at a time) The second group uses a single interrupt and a bitmap to avoid * redundant IPI interrupts. - * - * Right now IPI_STOP used by kdb shares the interrupt priority class with - * the two IPI groups mentioned above. As such IPI_STOP may cause a deadlock. - * Eventually IPI_STOP should use NMI IPIs - this would eliminate this and - * other deadlocks caused by IPI_STOP. */ /* Interrupts for local APIC LVT entries other than the timer. */ @@ -134,6 +129,7 @@ #define IPI_STOP (APIC_IPI_INTS + 7) /* Stop CPU until restarted. */ #define IPI_SUSPEND (APIC_IPI_INTS + 8) /* Suspend CPU until restarted. */ +#define IPI_STOP_HARD (APIC_IPI_INTS + 9) /* Stop CPU with a NMI. */ /* * The spurious interrupt can share the priority class with the IPIs since |