panic on boot with kernel/sysctl.c changes in 2.6.27-rc5

From: James Bottomley
Date: Thu Sep 04 2008 - 11:04:27 EST


This patch:

commit ae7edecc9b8810770a8e5cb9a466ea4bdcfa8401
Author: Al Viro <viro@xxxxxxxxxxxxxxxxxx>
Date: Tue Jul 15 06:33:31 2008 -0400

[PATCH] sysctl: keep track of tree relationships

Is causing a panic on boot with parisc. The panic occurs when we try to
bring up the secondary CPUs via hotplug, so I think it's a general panic
that would be seen on any architecture.

This is what the boot shows:

Searching for devices...
Found devices:
1. Storm Peak Slow at 0xfffffffffe780000 [128] { 0, 0x0, 0x887, 0x00004 }
2. Storm Peak Slow at 0xfffffffffe781000 [129] { 0, 0x0, 0x887, 0x00004 }
3. Storm Peak Slow at 0xfffffffffe798000 [152] { 0, 0x0, 0x887, 0x00004 }
4. Storm Peak Slow at 0xfffffffffe799000 [153] { 0, 0x0, 0x887, 0x00004 }
5. Everest Mako Memory at 0xfffffffffed08000 [8] { 1, 0x0, 0x0af, 0x00009 }
6. Pluto BC McKinley Port at 0xfffffffffed00000 [0] { 12, 0x0, 0x880, 0x0000c }
7. Mercury PCI Bridge at 0xfffffffffed20000 [0/0] { 13, 0x0, 0x783, 0x0000a }
8. Mercury PCI Bridge at 0xfffffffffed22000 [0/1] { 13, 0x0, 0x783, 0x0000a }
9. Mercury PCI Bridge at 0xfffffffffed24000 [0/2] { 13, 0x0, 0x783, 0x0000a }
10. Mercury PCI Bridge at 0xfffffffffed26000 [0/3] { 13, 0x0, 0x783, 0x0000a }
11. Mercury PCI Bridge at 0xfffffffffed28000 [0/4] { 13, 0x0, 0x783, 0x0000a }
12. Mercury PCI Bridge at 0xfffffffffed2c000 [0/6] { 13, 0x0, 0x783, 0x0000a }
13. Mercury PCI Bridge at 0xfffffffffed2e000 [0/7] { 13, 0x0, 0x783, 0x0000a }
14. BMC IPMI Mgmt Ctlr at 0xfffffff0f05b0000 [16] { 15, 0x0, 0x004, 0x000c0 }
Releasing cpu 1 now, hpa=fffffffffe781000
FP[1] enabled: Rev 1 Model 20
------------[ cut here ]------------
Badness at kernel/sysctl.c:1929

YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI
PSW: 00001000000001000001111100001111 Not tainted
r00-03 0000000008041f0f 00000000405956e0 000000004015c4bc 000000007f410d58
r04-07 0000000040589ee0 000000004048d1e4 00000000404b0040 0000000000000001
r08-11 0000000000000002 0000000040467868 0000000000000000 0000000000000000
r12-15 00000000405c25d0 0000000000000001 0000000000000000 0000000000000000
r16-19 00000000405c2f00 00000000404e58c0 00000000405c2f00 00000000404c8758
r20-23 0000000000000005 000000007f469df0 0000000000000022 fffffffffffffff3
r24-27 0000000000000000 0000000000000022 00000000404c8788 0000000040589ee0
r28-31 0000000000000000 000000007f469e50 000000007f469e80 000000007f410d60
sr00-03 0000000000000000 0000000000000000 0000000000000000 0000000000000000
sr04-07 0000000000000000 0000000000000000 0000000000000000 0000000000000000

IASQ: 0000000000000000 0000000000000000 IAOQ: 000000004015c538 000000004015c53c
IIR: 03ffe01f ISR: 0000000010240000 IOR: 00000001320c87a4
CPU: 0 CR30: 000000007f468000 CR31: fffffff0f0e098e0
ORIG_R28: 00000000404d1340
IAOQ[0]: unregister_sysctl_table+0xb0/0x138
IAOQ[1]: unregister_sysctl_table+0xb4/0x138
RP(r2): unregister_sysctl_table+0x34/0x138
Backtrace:
[<0000000040116384>] mutex_lock+0x14/0x20
[<0000000040148930>] partition_sched_domains+0x88/0x3e8
[<00000000401469fc>] wake_up_process+0x24/0x38
[<0000000040122324>] print_one_device+0xbc/0x160
[<00000000402e3d04>] next_device+0x14/0x30
[<00000000402e3e10>] device_for_each_child+0x90/0xb8
[<0000000040121dfc>] for_each_padev+0x34/0x48
[<000000004012005c>] pdc_pat_cell_module+0xf4/0x178
[<00000000401524d0>] printk+0x40/0x50
[<0000000040175e64>] update_wall_time+0x26c/0x560
[<000000004018bdd4>] __rcu_process_callbacks+0x19c/0x258
[<000000004014313c>] enqueue_task_fair+0x5c/0x88
[<000000004014313c>] enqueue_task_fair+0x5c/0x88
[<0000000040141324>] __dequeue_entity+0x4c/0xb0
[<00000000401c08dc>] cache_alloc_debugcheck_after+0x23c/0x2f0
[<0000000040115f58>] __mutex_unlock_slowpath+0x70/0x168

------------[ cut here ]------------
kernel BUG at mm/slab.c:590!

YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI
PSW: 00001000000001001111110000001110 Tainted: G W
r00-03 000000ff0804fc0e 0000000040591ee0 00000000401c0f24 000000007f410d58
r04-07 0000000040589ee0 000000004048d1e4 00000000404c8788 000000004015c548
r08-11 000000000800000f 0000000040467868 0000000000000000 0000000000000000
r12-15 00000000405c25d0 0000000000000001 0000000000000000 0000000000000000
r16-19 00000000405c2f00 00000000404e58c0 00000000405c2f00 00000000408e3000
r20-23 00000000004c8788 00000000000004c8 0000000000000022 fffffffffffffff3
r24-27 0000000000000000 00000000404c8788 00000000408f3bc0 0000000040589ee0
r28-31 0000000000000400 000000007f469ef0 000000007f469f20 0000000000000400
sr00-03 0000000000000000 0000000000000000 0000000000000000 0000000000000000
sr04-07 0000000000000000 0000000000000000 0000000000000000 0000000000000000

IASQ: 0000000000000000 0000000000000000 IAOQ: 00000000401c1120 00000000401c1124
IIR: 03ffe01f ISR: 0000000000000000 IOR: 0000000000000000
CPU: 0 CR30: 000000007f468000 CR31: fffffff0f0e098e0
ORIG_R28: 000000007f46a0c0
IAOQ[0]: kfree+0x238/0x258
IAOQ[1]: kfree+0x23c/0x258
RP(r2): kfree+0x3c/0x258
Backtrace:
[<000000004015c548>] unregister_sysctl_table+0xc0/0x138
[<0000000040116384>] mutex_lock+0x14/0x20
[<0000000040148930>] partition_sched_domains+0x88/0x3e8
[<00000000401469fc>] wake_up_process+0x24/0x38
[<0000000040122324>] print_one_device+0xbc/0x160
[<00000000402e3d04>] next_device+0x14/0x30
[<00000000402e3e10>] device_for_each_child+0x90/0xb8
[<0000000040121dfc>] for_each_padev+0x34/0x48
[<000000004012005c>] pdc_pat_cell_module+0xf4/0x178
[<00000000401524d0>] printk+0x40/0x50
[<0000000040175e64>] update_wall_time+0x26c/0x560
[<000000004018bdd4>] __rcu_process_callbacks+0x19c/0x258
[<000000004014313c>] enqueue_task_fair+0x5c/0x88
[<000000004014313c>] enqueue_task_fair+0x5c/0x88
[<0000000040141324>] __dequeue_entity+0x4c/0xb0
[<00000000401c08dc>] cache_alloc_debugcheck_after+0x23c/0x2f0

Backtrace:
[<000000004011b6ec>] parisc_show_stack+0x9c/0xe8
[<000000004011b74c>] show_stack+0x14/0x20
[<000000004013fbc8>] update_curr+0x60/0xa0
[<00000000402651bc>] report_bug+0xf4/0x150
[<000000004015c548>] unregister_sysctl_table+0xc0/0x138
[<00000000401c1120>] kfree+0x238/0x258
[<00000000401c0f24>] kfree+0x3c/0x258
[<000000004015c548>] unregister_sysctl_table+0xc0/0x138
[<0000000040116384>] mutex_lock+0x14/0x20
[<0000000040148930>] partition_sched_domains+0x88/0x3e8
[<00000000401469fc>] wake_up_process+0x24/0x38
[<0000000040122324>] print_one_device+0xbc/0x160
[<00000000402e3d04>] next_device+0x14/0x30
[<00000000402e3e10>] device_for_each_child+0x90/0xb8
[<0000000040121dfc>] for_each_padev+0x34/0x48
[<000000004012005c>] pdc_pat_cell_module+0xf4/0x178

Kernel panic - not syncing: Attempted to kill init!

The first is the WARN_ON(1) here in kernel/sysctl.c:

if (!--header->parent->count) {
WARN_ON(1);
kfree(header->parent);
}

And the BUG is because this code is trying to kfree sd_ctl_root (as the
parent) which is in static memory.

I've no idea what this code is trying to accomplish, but, since in
practice a lot of sysfs roots are in static memory, it's clearly bogus.
Even if we'd put sd_ctl_root in kmalloc'd memory, we don't want it
freed. The hotplug is merely trying to release all its current children
before adding new ones (which naturally takes the parent refcount to
zero). I suggest dumping this whole if clause.

James

---

diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index fe47133..cbf0ebf 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -1925,10 +1925,8 @@ void unregister_sysctl_table(struct ctl_table_header * header)

spin_lock(&sysctl_lock);
start_unregistering(header);
- if (!--header->parent->count) {
- WARN_ON(1);
- kfree(header->parent);
- }
+ --header->parent->count;
+
if (!--header->count)
kfree(header);
spin_unlock(&sysctl_lock);


--
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/