Don't bother calling the module event handlers from module_shutdown()
in the shutdown_final state if the RB_NOSYNC flag is set. The specific motivation in this case is that a system panic in an interrupt context results in a call to module_shutdown(), which calls g_modevent(), which calls g_malloc(..., M_WAITOK), which results in a second panic. While g_modevent() could be fixed to not call malloc() for MOD_SHUTDOWN events (which it doesn't handle in any case), it is probably also a good idea to entirely skip the execution of the module shutdown handlers after a panic. This may be a MFC candidate for RELENG_5.
This commit is contained in:
parent
8ded654028
commit
1a1c04b6b3
@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/proc.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/reboot.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/linker.h>
|
||||
@ -94,6 +95,8 @@ module_shutdown(void *arg1, int arg2)
|
||||
{
|
||||
module_t mod;
|
||||
|
||||
if (arg2 & RB_NOSYNC)
|
||||
return;
|
||||
MOD_SLOCK;
|
||||
TAILQ_FOREACH(mod, &modules, link)
|
||||
MOD_EVENT(mod, MOD_SHUTDOWN);
|
||||
|
Loading…
Reference in New Issue
Block a user