lkml.org 
[lkml]   [2003]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: 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/
\
 
 \ /
  Last update: 2005-03-22 13:47    [W:0.034 / U:0.484 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site