You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
rcutorture: Abstract torture_shutdown_notify()
Because handling the race between rmmod and system shutdown is not specific to RCU, this commit abstracts torture_shutdown_notify(), placing this code into kernel/torture.c. This change also allows fullstop_mutex to be private to kernel/torture.c. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Reviewed-by: Josh Triplett <josh@joshtriplett.org>
This commit is contained in:
+24
-5
@@ -54,8 +54,7 @@ static bool verbose;
|
||||
|
||||
int fullstop = FULLSTOP_RMMOD;
|
||||
EXPORT_SYMBOL_GPL(fullstop);
|
||||
DEFINE_MUTEX(fullstop_mutex);
|
||||
EXPORT_SYMBOL_GPL(fullstop_mutex);
|
||||
static DEFINE_MUTEX(fullstop_mutex);
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
|
||||
@@ -422,14 +421,32 @@ EXPORT_SYMBOL_GPL(torture_shuffle_cleanup);
|
||||
void torture_shutdown_absorb(const char *title)
|
||||
{
|
||||
while (ACCESS_ONCE(fullstop) == FULLSTOP_SHUTDOWN) {
|
||||
pr_notice(
|
||||
"torture thread %s parking due to system shutdown\n",
|
||||
title);
|
||||
pr_notice("torture thread %s parking due to system shutdown\n",
|
||||
title);
|
||||
schedule_timeout_uninterruptible(MAX_SCHEDULE_TIMEOUT);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(torture_shutdown_absorb);
|
||||
|
||||
/*
|
||||
* Detect and respond to a system shutdown.
|
||||
*/
|
||||
static int torture_shutdown_notify(struct notifier_block *unused1,
|
||||
unsigned long unused2, void *unused3)
|
||||
{
|
||||
mutex_lock(&fullstop_mutex);
|
||||
if (fullstop == FULLSTOP_DONTSTOP)
|
||||
fullstop = FULLSTOP_SHUTDOWN;
|
||||
else
|
||||
pr_warn("Concurrent rmmod and shutdown illegal!\n");
|
||||
mutex_unlock(&fullstop_mutex);
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block torture_shutdown_nb = {
|
||||
.notifier_call = torture_shutdown_notify,
|
||||
};
|
||||
|
||||
/*
|
||||
* Initialize torture module. Please note that this is -not- invoked via
|
||||
* the usual module_init() mechanism, but rather by an explicit call from
|
||||
@@ -451,6 +468,7 @@ EXPORT_SYMBOL_GPL(torture_init_begin);
|
||||
void __init torture_init_end(void)
|
||||
{
|
||||
mutex_unlock(&fullstop_mutex);
|
||||
register_reboot_notifier(&torture_shutdown_nb);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(torture_init_end);
|
||||
|
||||
@@ -474,6 +492,7 @@ bool torture_cleanup(void)
|
||||
}
|
||||
fullstop = FULLSTOP_RMMOD;
|
||||
mutex_unlock(&fullstop_mutex);
|
||||
unregister_reboot_notifier(&torture_shutdown_nb);
|
||||
torture_shuffle_cleanup();
|
||||
torture_onoff_cleanup();
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user