[PATCH] NVMe: Avoid interrupt disable during queue init.

Parav Pandit parav.pandit at avagotech.com
Fri May 22 09:48:43 PDT 2015

On Fri, May 22, 2015 at 9:53 PM, Keith Busch <keith.busch at intel.com> wrote:
> On Fri, 22 May 2015, Parav Pandit wrote:
>> During normal positive path probe,
>> (a) device is added to dev_list in nvme_dev_start()
>> (b) nvme_kthread got created, which will eventually refers to
>> dev->queues[qid] to check for NULL.
>> (c) dev_start() worker thread has started probing device and creating
>> the queue using nvme_alloc_queue
>> This is is assigning the dev->queue[qid] new pointer.
>> If this is done out of order, nvme_kthread will pickup uninitialized
>> q_lock, cq_phase, q_db.
> A memory barrier before incrementing the dev->queue_count (and assigning
> the pointer in the array before that) should address this concern.

Sure. mb() will solve the publisher side problem. RCU is wrapper around mb().
However mb() doesn't solve the issue of q_lock variable getting
fetched before if (!nvmeq) condition being executed, by value
compilation optimizations in nvme_kthread().
So I was inclined towards more preferred method of rcu.

>> Other thoughts to not create nvme_kthread until all the queues are active.
> No good, we want to poll during queue creation to detect controller
> errors and broken interrupts.

More information about the Linux-nvme mailing list