• M
    Bluetooth: Move dev_set_name() to a context that can sleep · 457ca7bb
    Marcel Holtmann 提交于
    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: NMarcel Holtmann <marcel@holtmann.org>
    Tested-by: NHugo Mildenberger <hugo.mildenberger@namir.de>
    Tested-by: NBing Zhao <bzhao@marvell.com>
    457ca7bb
hci_sysfs.c 11.1 KB