[PATCH V2 1/2] nvme-core: use xarray for ctrl ns tracking
Keith Busch
kbusch at kernel.org
Wed Jul 1 14:29:26 EDT 2020
On Wed, Jul 01, 2020 at 06:19:50PM +0000, Chaitanya Kulkarni wrote:
> On 7/1/20 6:12 AM, Christoph Hellwig wrote:
> > [willy: a comment/request on the xa_load API below]
> > On Tue, Jun 30, 2020 at 07:25:16PM -0700, Chaitanya Kulkarni wrote:
> >> + if (le32_to_cpu(id->nn) > 1) {
> >> + dev_warn(ctrl->device,
> >> + "NVME_IOCTL_IO_CMD not supported when multiple namespaces present!\n");
> >> + goto out;
> >> }
> >
> > This code doesn't make any sense at all. Why does a patch changing
> > data structures add new calls that go out on the wire?
> >
> Yes, this should not be here, I'll remove that and only keep the code to
> check multiple namespaces and if needed this needs to be a separate
> patch.
This isn't actually checking for multiple namespaces, though. It's just
getting the highest nsid, which doesn't tell us how many namespaces the
driver is bound to.
> >> - down_write(&ns->ctrl->namespaces_rwsem);
> >> - list_del_init(&ns->list);
> >> - up_write(&ns->ctrl->namespaces_rwsem);
> >> + xa_lock(xa);
> >> + __xa_erase(xa, ns->head->ns_id);
> >> + free = refcount_dec_and_test(&ns->kref.refcount) ? true : false;
> >> + xa_unlock(xa);
> >>
> >> nvme_mpath_check_last_path(ns);
> >> - nvme_put_ns(ns);
> >> + if (free)
> >> + __nvme_free_ns(ns);
> >
> > This looks very strange to me. Shoudn't this be a normal xa_erase
> > followed by a normal nvme_put_ns? For certain the driver code has
> > no business poking into the kref internals.
> >
>
> There is a race when kref is manipulated in nvme_find_get_ns() and
> nvme _ns_remove() pointed by Keith which needs ns->kref to be guarded
> with locks. Let me know I'll share a detail scenario.
That wasn't the race I was pointing out. In your earlier internal
implementation, you had the xa_erase done after the final put, and I was
warning against that. The erase needs to happen where you have it, but I
don't see a need for protecting the kref like this.
More information about the Linux-nvme
mailing list