From mboxrd@z Thu Jan 1 00:00:00 1970 From: keith.busch@intel.com (Keith Busch) Date: Fri, 22 May 2015 17:47:55 +0000 (UTC) Subject: [PATCH] NVMe: Avoid interrupt disable during queue init. In-Reply-To: References: <1432253553-17045-1-git-send-email-parav.pandit@avagotech.com> Message-ID: On Fri, 22 May 2015, Parav Pandit wrote: > I agree to it that nvmeq won't be null after mb(); That alone is not sufficient. > > What I have proposed in previous email is, > > Converting, > > struct nvme_queue *nvmeq = dev->queues[i]; > if (!nvmeq) > continue; > spin_lock_irq(nvmeq->q_lock); > > to replace with, > > struct nvme_queue *nvmeq = rcu_dereference(dev->queues[i]); > if (!nvmeq) > continue; > spin_lock_irq(nvmeq->q_lock); > > This will prevent fetching content of q_lock before checking for NULL > condition. Classic usage or RCU. What the heck are you talking about? The value of dev->queue_count won't even let the thread iterate an nvmeq before q_lock is initialized. We used to rcu protect queue access, but that was to make nvme's make_request_fn safe to surprise removal, not for the polling thread.