Marcel Holtmann
457ca7bb6b
Bluetooth: Move dev_set_name() to a context that can sleep
...
Setting the name of a sysfs device has to be done in a context that can
actually sleep. It allocates its memory with GFP_KERNEL. Previously it
was a static (size limited) string and that got changed to accommodate
longer device names. So move the dev_set_name() just before calling
device_add() which is executed in a work queue.
This fixes the following error:
[ 110.012125] BUG: sleeping function called from invalid context at mm/slub.c:1595
[ 110.012135] in_atomic(): 1, irqs_disabled(): 0, pid: 0, name: swapper
[ 110.012141] 2 locks held by swapper/0:
[ 110.012145] #0 : (hci_task_lock){++.-.+}, at: [<ffffffffa01f822f>] hci_rx_task+0x2f/0x2d0 [bluetooth]
[ 110.012173] #1 : (&hdev->lock){+.-.+.}, at: [<ffffffffa01fb9e2>] hci_event_packet+0x72/0x25c0 [bluetooth]
[ 110.012198] Pid: 0, comm: swapper Tainted: G W 2.6.30-rc4-g953cdaa #1
[ 110.012203] Call Trace:
[ 110.012207] <IRQ> [<ffffffff8023eabd>] __might_sleep+0x14d/0x170
[ 110.012228] [<ffffffff802cfbe1>] __kmalloc+0x111/0x170
[ 110.012239] [<ffffffff803c2094>] kvasprintf+0x64/0xb0
[ 110.012248] [<ffffffff803b7a5b>] kobject_set_name_vargs+0x3b/0xa0
[ 110.012257] [<ffffffff80465326>] dev_set_name+0x76/0xa0
[ 110.012273] [<ffffffffa01fb9e2>] ? hci_event_packet+0x72/0x25c0 [bluetooth]
[ 110.012289] [<ffffffffa01ffc1d>] hci_conn_add_sysfs+0x3d/0x70 [bluetooth]
[ 110.012303] [<ffffffffa01fba2c>] hci_event_packet+0xbc/0x25c0 [bluetooth]
[ 110.012312] [<ffffffff80516eb0>] ? sock_def_readable+0x80/0xa0
[ 110.012328] [<ffffffffa01fee0c>] ? hci_send_to_sock+0xfc/0x1c0 [bluetooth]
[ 110.012343] [<ffffffff80516eb0>] ? sock_def_readable+0x80/0xa0
[ 110.012347] [<ffffffff805e88c5>] ? _read_unlock+0x75/0x80
[ 110.012354] [<ffffffffa01fee0c>] ? hci_send_to_sock+0xfc/0x1c0 [bluetooth]
[ 110.012360] [<ffffffffa01f8403>] hci_rx_task+0x203/0x2d0 [bluetooth]
[ 110.012365] [<ffffffff80250ab5>] tasklet_action+0xb5/0x160
[ 110.012369] [<ffffffff8025116c>] __do_softirq+0x9c/0x150
[ 110.012372] [<ffffffff805e850f>] ? _spin_unlock+0x3f/0x80
[ 110.012376] [<ffffffff8020cbbc>] call_softirq+0x1c/0x30
[ 110.012380] [<ffffffff8020f01d>] do_softirq+0x8d/0xe0
[ 110.012383] [<ffffffff80250df5>] irq_exit+0xc5/0xe0
[ 110.012386] [<ffffffff8020e71d>] do_IRQ+0x9d/0x120
[ 110.012389] [<ffffffff8020c3d3>] ret_from_intr+0x0/0xf
[ 110.012391] <EOI> [<ffffffff80431832>] ? acpi_idle_enter_bm+0x264/0x2a6
[ 110.012399] [<ffffffff80431828>] ? acpi_idle_enter_bm+0x25a/0x2a6
[ 110.012403] [<ffffffff804f50d5>] ? cpuidle_idle_call+0xc5/0x130
[ 110.012407] [<ffffffff8020a4b4>] ? cpu_idle+0xc4/0x130
[ 110.012411] [<ffffffff805d2268>] ? rest_init+0x88/0xb0
[ 110.012416] [<ffffffff807e2fbd>] ? start_kernel+0x3b5/0x412
[ 110.012420] [<ffffffff807e2281>] ? x86_64_start_reservations+0x91/0xb5
[ 110.012424] [<ffffffff807e2394>] ? x86_64_start_kernel+0xef/0x11b
Based on a report by Davide Pesavento <davidepesa@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Tested-by: Hugo Mildenberger <hugo.mildenberger@namir.de>
Tested-by: Bing Zhao <bzhao@marvell.com>
2009-05-05 13:26:08 -07:00
..
2009-02-26 23:13:32 -08:00
2009-04-11 01:43:17 -07:00
2009-04-25 18:03:35 -07:00
2009-03-31 01:14:44 +04:00
2009-05-02 13:49:36 -07:00
2009-04-20 02:14:59 -07:00
2009-05-05 13:26:08 -07:00
2009-04-20 17:12:35 +02:00
2009-04-17 01:38:46 -07:00
2009-05-01 09:05:06 -07:00
2009-01-04 17:29:21 -08:00
2009-03-02 03:07:23 -08:00
2009-03-21 13:36:17 -07:00
2009-03-21 19:06:54 -07:00
2009-03-10 05:22:43 -07:00
2008-11-23 23:24:32 -08:00
2009-05-04 11:11:01 -07:00
2009-05-05 12:00:53 -07:00
2009-03-21 19:06:51 -07:00
2009-04-01 08:59:10 -07:00
2009-04-21 23:43:15 -07:00
2009-02-26 23:07:32 -08:00
2008-01-28 14:56:52 -08:00
2009-03-31 01:14:44 +04:00
2009-05-04 16:22:16 -04:00
2009-05-05 12:00:53 -07:00
2009-04-22 00:46:09 -07:00
2009-03-26 15:23:24 -07:00
2009-04-22 00:49:51 -07:00
2009-04-15 03:39:52 -07:00
2009-03-30 15:22:01 +02:00
2009-04-02 00:52:22 -07:00
2009-01-04 17:11:24 -08:00
2009-04-14 20:28:00 -07:00
2009-02-06 21:50:52 -08:00
2009-05-02 13:48:32 -07:00
2009-03-31 01:14:44 +04:00
2009-04-06 13:25:56 -07:00
2009-03-18 19:11:29 -07:00
2009-03-31 23:00:26 -04:00
2009-02-26 23:13:36 -08:00
2009-03-30 15:22:01 +02:00
2009-05-04 16:22:14 -04:00
2009-03-27 00:28:21 -07:00
2009-04-27 02:58:59 -07:00
2009-02-15 22:43:35 -08:00
2009-03-30 15:22:01 +02:00
2009-02-26 23:43:35 -08:00
2009-04-06 18:05:43 -07:00
2009-03-16 16:23:30 +01:00