[PATCHv3 for-4.7] nvme: Remove RCU namespace protection
Keith Busch
keith.busch at intel.com
Fri Jul 8 18:07:55 PDT 2016
On Wed, Jul 06, 2016 at 11:22:50AM -0600, Keith Busch wrote:
> We can't block with RCU read lock held, but we need to do potentially
> blocking stuff to namespace queues when iterating the list. This patch
> removes the rcu read locking.
>
> Any list iteration that does IO has to be done unlocked to allow recovery.
> The caller must ensure the list can not be manipulated under such
> conditions. List iterations that do not issue IO can safely use the lock
> since it wouldn't block recovery from missing IO completions.
Ping? Would hate to release a kernel with obvious bugs.
\
> This fixes these two BUGs:
>
> BUG: sleeping function called from invalid context at include/linux/writeback.h:185
> in_atomic(): 1, irqs_disabled(): 0, pid: 757, name: kworker/97:1
> CPU: 97 PID: 757 Comm: kworker/97:1 Tainted: G E 4.6.0-2016-06-14+ #1
> Workqueue: pciehp-2 pciehp_power_thread
> 0000000000000000 ffff880462377b38 ffffffff81310c61 ffff8804623704c0
> 00000000000000b9 ffff880462377b50 ffffffff8108fe14 ffffffff81809e2a
> ffff880462377b78 ffffffff8108fea9 ffff880469eb4800 ffffc900011824a0
> Call Trace:
> [<ffffffff81310c61>] dump_stack+0x63/0x82
> [<ffffffff8108fe14>] ___might_sleep+0xd4/0x120
> [<ffffffff8108fea9>] __might_sleep+0x49/0x80
> [<ffffffff8120d060>] iget5_locked+0xa0/0x210
> [<ffffffff8122ac80>] ? bdev_test+0x20/0x20
> [<ffffffff8122b5ce>] bdget+0x3e/0x130
> [<ffffffff812f2b24>] bdget_disk+0x24/0x40
> [<ffffffff8122bd3d>] revalidate_disk+0x3d/0x90
> [<ffffffffa0483208>] nvme_kill_queues+0x38/0xc0 [nvme_core]
> [<ffffffffa04833da>] nvme_remove_namespaces+0x5a/0x60 [nvme_core]
> [<ffffffffa048340d>] nvme_uninit_ctrl+0x2d/0xa0 [nvme_core]
> [<ffffffffa085c9eb>] nvme_remove+0x5b/0x100 [nvme]
> [<ffffffff8135bfc9>] pci_device_remove+0x39/0xc0
>
> And:
>
> BUG: sleeping function called from invalid context at kernel/workqueue.c:2783
> in_atomic(): 0, irqs_disabled(): 0, pid: 1696, name: kworker/u16:0
> CPU: 3 PID: 1696 Comm: kworker/u16:0 Tainted: G OE 4.6.0-rc3+ #197
> Hardware name: Dell Inc. OptiPlex 7010/0773VG, BIOS A12 01/10/2013
> Workqueue: nvme nvme_reset_work [nvme]
> 0000000000000000 ffff8800d94d3a48 ffffffff81379e4c ffff88011a639640
> ffffffff81a12688 ffff8800d94d3a70 ffffffff81094814 ffffffff81a12688
> 0000000000000adf 0000000000000000 ffff8800d94d3a98 ffffffff81094904
> Call Trace:
> [<ffffffff81379e4c>] dump_stack+0x85/0xc9
> [<ffffffff81094814>] ___might_sleep+0x144/0x1f0
> [<ffffffff81094904>] __might_sleep+0x44/0x80
> [<ffffffff81087b5e>] flush_work+0x6e/0x290
> [<ffffffff81087af0>] ? __queue_delayed_work+0x150/0x150
> [<ffffffff81126cf5>] ? irq_work_queue+0x75/0x90
> [<ffffffff810ca136>] ? wake_up_klogd+0x36/0x50
> [<ffffffff810b7fa6>] ? mark_held_locks+0x66/0x90
> [<ffffffff81088898>] ? __cancel_work_timer+0xf8/0x1c0
> [<ffffffff8108883b>] __cancel_work_timer+0x9b/0x1c0
> [<ffffffff810cadaa>] ? vprintk_default+0x1a/0x20
> [<ffffffff81142558>] ? printk+0x48/0x4a
> [<ffffffff8108896b>] cancel_work_sync+0xb/0x10
> [<ffffffff81350fb0>] blk_mq_cancel_requeue_work+0x10/0x20
> [<ffffffffc0813ae7>] nvme_stop_queues+0x167/0x1a0 [nvme_core]
> [<ffffffffc0813980>] ? nvme_kill_queues+0x190/0x190 [nvme_core]
> [<ffffffffc08cef51>] nvme_dev_disable+0x71/0x350 [nvme]
> [<ffffffff810b8f40>] ? __lock_acquire+0xa80/0x1ad0
> [<ffffffff810944b6>] ? finish_task_switch+0xa6/0x2c0
> [<ffffffffc08cffd4>] nvme_reset_work+0x214/0xd40 [nvme]
More information about the Linux-nvme
mailing list