Thread (12 messages) 12 messages, 2 authors, 2017-12-13

Re: [PATCH 6/6] nvme: remove .init_request callback

From: Ming Lei <hidden>
Date: 2017-12-13 06:43:29
Also in: linux-nvme

On Tue, Dec 12, 2017 at 11:10:32PM +0800, Ming Lei wrote:
On Tue, Dec 12, 2017 at 03:13:58PM +0100, Christoph Hellwig wrote:
quoted
On Tue, Dec 12, 2017 at 07:02:32PM +0800, Ming Lei wrote:
quoted
It may cause race by setting 'nvmeq' in nvme_init_request()
because .init_request is called inside switching io scheduler, which
may happen when the NVMe device is being resetted and its nvme queues
are being freed and created. We don't have any sync between the two
pathes.

This patch removes the .init_request callback and sets the nvmeq runtime,
and fixes the following bug:
If ->init_request doesn't work for NVMe it won't work for any other
driver either, so we need to remove it entirely if we can't fix it.

I'd much rather try to fix it first, though.
Just checked all this uses, and it is a NVMe specific issue, because only
NVMe's .init_request() associates reference of one variable to the request,
and the variable itself may change during the request's lifetime.

And all the following .init_request() have this issue:

	nvme_fc_init_request()
	nvme_rdma_init_request()
	nvme_loop_init_request()
After taking a close look, there isn't such issue actually on the above
three cases because the lifetime of ctl->queues(and each element) are
same with 'nvme_ctr/nvme_rdma_ctrl/nvme_loop_ctrl'. Not like nvme-pci,
->queues(and each element) won't be reallocated.

So it is a nvme-pci specific issue.

Thanks,
Ming
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help