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/