[PATCH WIP/RFC v2 6/6] nvme-rdma: use ib_client API to detect device removal

Steve Wise swise at opengridcomputing.com
Tue Aug 30 08:48:50 PDT 2016


> > +static void nvme_rdma_remove_one(struct ib_device *ib_device, void
> *client_data)
> > +{
> > +	struct nvme_rdma_ctrl *ctrl, *tmp;
> > +
> > +	pr_info("Removing resources for device %s\n", ib_device->name);
> > +
> > +	mutex_lock(&nvme_rdma_ctrl_mutex);
> > +	list_for_each_entry_safe(ctrl, tmp, &nvme_rdma_ctrl_list, list) {
> > +		int delete_ctrl;
> > +
> > +		if (ctrl->device->dev != ib_device)
> > +			continue;
> > +
> > +		/*
> > +		 * Keep a reference until all work is flushed since
> > +		 * __nvme_rdma_del_ctrl can free the ctrl mem
> > +		 */
> > +		kref_get(&ctrl->ctrl.kref);
> > +		delete_ctrl = nvme_change_ctrl_state(&ctrl->ctrl,
> > +				NVME_CTRL_DELETING);
> > +		mutex_unlock(&nvme_rdma_ctrl_mutex);
> > +
> > +		dev_info(ctrl->ctrl.device,
> > +			"Removing ctrl: NQN \"%s\", addr %pISp\n",
> > +			ctrl->ctrl.opts->subsysnqn, &ctrl->addr);
> > +
> > +		if (delete_ctrl) {
> > +
> > +			/* Get rid of reconnect work if its running */
> > +			cancel_delayed_work_sync(&ctrl->reconnect_work);
> > +
> > +			/* queue controller deletion */
> > +			queue_work(nvme_rdma_wq, &ctrl->delete_work);
> > +		}
> > +
> > +		/* wait for deletion work to complete */
> > +		flush_work(&ctrl->delete_work);
> > +		nvme_put_ctrl(&ctrl->ctrl);
> > +		mutex_lock(&nvme_rdma_ctrl_mutex);
> > +	}
> > +	mutex_unlock(&nvme_rdma_ctrl_mutex);
> > +}
> 
> Will this code work?
> 
> 	mutex_lock(&nvme_rdma_ctrl_mutex);
> 	list_for_each_entry(ctrl, &nvme_rdma_ctrl_list, list) {
> 		if (ctrl->device->dev != ib_device)
> 			continue;
> 
> 		__nvme_rdma_del_ctrl(ctrl);
> 	}
> 	mutex_unlock(&nvme_rdma_ctrl_mutex);
> 
> 	flush_workqueue(nvme_rdma_wq);

I'll try this.  It is cleaner/easier to understand.

I'm also moving the controller list to per-device as Christoph recommends.

Steve.




More information about the Linux-nvme mailing list