Messages in this thread Patch in this message | | | Date | Wed, 20 Aug 2003 13:51:47 +0200 | From | Hannes Reinecke <> | Subject | Re: Dumb question: BKL on reboot ? |
| |
Andi Kleen wrote: > Hannes Reinecke <Hannes.Reinecke@suse.de> 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |