Re: Dumb question: BKL on reboot ?
From: Hannes Reinecke
Date: Wed Aug 20 2003 - 06:59:24 EST
Andi Kleen wrote:
Hannes Reinecke <Hannes.Reinecke@xxxxxxx> writes:
I've got a dumb question: Why is the BKL held on entering sys_reboot()
in kernel/sys.c:405 ?
Interesting. I have a few SMP deadlocks on x86-64 in reboot too
and it's possible that it is the same problem.
I would hold it during exection of the notifiers, but drop
it before calling into machine_*
Indeed. Works on s390 and survived several reboots (test still
continuing). I moved lock_kernel() into the sections that actually _do_
something; looks much cleaner IMHO.
THX for your help.
Is it worth to try to push it into mainstream kernel?
Cheers,
Hannes
--
--- linux-2.4.21/kernel/sys.c.orig 2003-08-20 10:52:39.000000000 +0200
+++ linux-2.4.21/kernel/sys.c 2003-08-20 10:52:39.000000000 +0200
@@ -340,11 +340,12 @@
magic2 != LINUX_REBOOT_MAGIC2B))
return -EINVAL;
- lock_kernel();
switch (cmd) {
case LINUX_REBOOT_CMD_RESTART:
+ lock_kernel();
notifier_call_chain(&reboot_notifier_list, SYS_RESTART,
NULL);
printk(KERN_EMERG "Restarting system.\n");
+ unlock_kernel();
machine_restart(NULL);
break;
@@ -357,20 +358,25 @@
break;
case LINUX_REBOOT_CMD_HALT:
+ lock_kernel();
notifier_call_chain(&reboot_notifier_list, SYS_HALT, NULL);
printk(KERN_EMERG "System halted.\n");
+ unlock_kernel();
machine_halt();
do_exit(0);
break;
case LINUX_REBOOT_CMD_POWER_OFF:
+ lock_kernel();
notifier_call_chain(&reboot_notifier_list,
SYS_POWER_OFF, NULL);
printk(KERN_EMERG "Power down.\n");
+ unlock_kernel();
machine_power_off();
do_exit(0);
break;
case LINUX_REBOOT_CMD_RESTART2:
+ lock_kernel();
if (strncpy_from_user(&buffer[0], (char *)arg,
sizeof(buffer) -
1) < 0) {
unlock_kernel();
return -EFAULT;
@@ -379,14 +385,13 @@
notifier_call_chain(&reboot_notifier_list, SYS_RESTART,
buffer);
printk(KERN_EMERG "Restarting system with command
'%s'.\n", buff
er);
+ unlock_kernel();
machine_restart(buffer);
break;
default:
- unlock_kernel();
return -EINVAL;
}
- unlock_kernel();
return 0;
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/