Enable vlan (8021q) module
[kernel-power] / kernel-power-2.6.28 / debian / patches / bluetooth_scheduling_while_atomic_bug_fix.diff
1 commit f74c77cb1124a11acf69c98d10c0fdc22f322664
2 Author: Dave Young <hidave.darkstar@gmail.com>
3 Date:   Sun Oct 18 20:24:41 2009 +0000
4
5     bluetooth: scheduling while atomic bug fix
6     
7     Due to driver core changes dev_set_drvdata will call kzalloc which should be
8     in might_sleep context, but hci_conn_add will be called in atomic context
9     
10     Like dev_set_name move dev_set_drvdata to work queue function.
11     
12     oops as following:
13     
14     Oct  2 17:41:59 darkstar kernel: [  438.001341] BUG: sleeping function called from invalid context at mm/slqb.c:1546
15     Oct  2 17:41:59 darkstar kernel: [  438.001345] in_atomic(): 1, irqs_disabled(): 0, pid: 2133, name: sdptool
16     Oct  2 17:41:59 darkstar kernel: [  438.001348] 2 locks held by sdptool/2133:
17     Oct  2 17:41:59 darkstar kernel: [  438.001350]  #0:  (sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP){+.+.+.}, at: [<faa1d2f5>] lock_sock+0xa/0xc [l2cap]
18     Oct  2 17:41:59 darkstar kernel: [  438.001360]  #1:  (&hdev->lock){+.-.+.}, at: [<faa20e16>] l2cap_sock_connect+0x103/0x26b [l2cap]
19     Oct  2 17:41:59 darkstar kernel: [  438.001371] Pid: 2133, comm: sdptool Not tainted 2.6.31-mm1 #2
20     Oct  2 17:41:59 darkstar kernel: [  438.001373] Call Trace:
21     Oct  2 17:41:59 darkstar kernel: [  438.001381]  [<c022433f>] __might_sleep+0xde/0xe5
22     Oct  2 17:41:59 darkstar kernel: [  438.001386]  [<c0298843>] __kmalloc+0x4a/0x15a
23     Oct  2 17:41:59 darkstar kernel: [  438.001392]  [<c03f0065>] ? kzalloc+0xb/0xd
24     Oct  2 17:41:59 darkstar kernel: [  438.001396]  [<c03f0065>] kzalloc+0xb/0xd
25     Oct  2 17:41:59 darkstar kernel: [  438.001400]  [<c03f04ff>] device_private_init+0x15/0x3d
26     Oct  2 17:41:59 darkstar kernel: [  438.001405]  [<c03f24c5>] dev_set_drvdata+0x18/0x26
27     Oct  2 17:41:59 darkstar kernel: [  438.001414]  [<fa51fff7>] hci_conn_init_sysfs+0x40/0xd9 [bluetooth]
28     Oct  2 17:41:59 darkstar kernel: [  438.001422]  [<fa51cdc0>] ? hci_conn_add+0x128/0x186 [bluetooth]
29     Oct  2 17:41:59 darkstar kernel: [  438.001429]  [<fa51ce0f>] hci_conn_add+0x177/0x186 [bluetooth]
30     Oct  2 17:41:59 darkstar kernel: [  438.001437]  [<fa51cf8a>] hci_connect+0x3c/0xfb [bluetooth]
31     Oct  2 17:41:59 darkstar kernel: [  438.001442]  [<faa20e87>] l2cap_sock_connect+0x174/0x26b [l2cap]
32     Oct  2 17:41:59 darkstar kernel: [  438.001448]  [<c04c8df5>] sys_connect+0x60/0x7a
33     Oct  2 17:41:59 darkstar kernel: [  438.001453]  [<c024b703>] ? lock_release_non_nested+0x84/0x1de
34     Oct  2 17:41:59 darkstar kernel: [  438.001458]  [<c028804b>] ? might_fault+0x47/0x81
35     Oct  2 17:41:59 darkstar kernel: [  438.001462]  [<c028804b>] ? might_fault+0x47/0x81
36     Oct  2 17:41:59 darkstar kernel: [  438.001468]  [<c033361f>] ? __copy_from_user_ll+0x11/0xce
37     Oct  2 17:41:59 darkstar kernel: [  438.001472]  [<c04c9419>] sys_socketcall+0x82/0x17b
38     Oct  2 17:41:59 darkstar kernel: [  438.001477]  [<c020329d>] syscall_call+0x7/0xb
39     
40     Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
41     Signed-off-by: David S. Miller <davem@davemloft.net>
42
43 diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c
44 index 7f939ce..2bc6f6a 100644
45 --- a/net/bluetooth/hci_sysfs.c
46 +++ b/net/bluetooth/hci_sysfs.c
47 @@ -92,6 +92,8 @@ static void add_conn(struct work_struct *work)
48  
49         dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle);
50  
51 +       dev_set_drvdata(&conn->dev, conn);
52 +
53         if (device_add(&conn->dev) < 0) {
54                 BT_ERR("Failed to register connection device");
55                 return;
56 @@ -144,8 +146,6 @@ void hci_conn_init_sysfs(struct hci_conn *conn)
57         conn->dev.class = bt_class;
58         conn->dev.parent = &hdev->dev;
59  
60 -       dev_set_drvdata(&conn->dev, conn);
61 -
62         device_initialize(&conn->dev);
63  
64         INIT_WORK(&conn->work_add, add_conn);