[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAGgvQNQHaZBRzedkLmYxCBtDyxq7j2wr=e0vAYfw5r+KKeVbxg@mail.gmail.com>
Date: Fri, 22 May 2015 09:45:16 +0530
From: Parav Pandit <parav.pandit@...gotech.com>
To: Keith Busch <keith.busch@...el.com>
Cc: linux-nvme@...ts.infradead.org,
Matthew Wilcox <willy@...ux.intel.com>,
Jens Axboe <axboe@...nel.dk>, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] NVMe: Avoid interrupt disable during queue init.
On Fri, May 22, 2015 at 1:04 AM, Keith Busch <keith.busch@...el.com> wrote:
> On Thu, 21 May 2015, Parav Pandit wrote:
>>
>> Avoid diabling interrupt and holding q_lock for the queue
>> which is just getting initialized.
>>
>> With this change, online_queues is also incremented without
>> lock during queue setup stage.
>> if Power management nvme_suspend() kicks in during queue setup time,
>> per nvmeq based q_lock spinlock cannot protect device wide
>> online_queues variable anyway.
>
>
> The q_lock is held to protect polling from reading inconsistent data.
ah, yes. I can see the nvme_kthread can poll the CQ while its getting
created through the nvme_resume().
I think this opens up other issue.
nvme_kthread() should,
Instead of,
struct nvme_queue *nvmeq = dev->queues[i];
it should do,
struct nvme_queue *nvmeq = rcu_dereference(dev->queues[i]);
And,
nvme_alloc_queue()
dev->queues[qid] = nvmeq;
should be,
rcu_assign_pointer(dev->queues[qid], nvmeq);
Otherwise nvme_kthread could get stale value for elements of nvmeq.
I will send patch for fix.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists