[PATCH 2/2] nvme-rdma: move admin queue cleanup to nvme_rdma_free_ctrl
Ming Lin
mlin at kernel.org
Thu Jul 14 11:04:05 PDT 2016
On Thu, Jul 14, 2016 at 10:09 AM, J Freyensee
<james_p_freyensee at linux.intel.com> wrote:
> On Wed, 2016-07-13 at 23:39 -0700, Ming Lin wrote:
>> On Wed, 2016-07-13 at 16:59 -0700, J Freyensee wrote:
>> > On Wed, 2016-07-13 at 16:36 -0700, Ming Lin wrote:
>> > > On Wed, Jul 13, 2016 at 4:19 PM, J Freyensee
>> > > <james_p_freyensee at linux.intel.com> wrote:
>> > > >
>> > > > > static void nvme_rdma_free_ctrl(struct nvme_ctrl *nctrl)
>> > > > > @@ -687,6 +684,10 @@ static void nvme_rdma_free_ctrl(struct
>> > > > > nvme_ctrl
>> > > > > *nctrl)
>> > > > > list_del(&ctrl->list);
>> > > > > mutex_unlock(&nvme_rdma_ctrl_mutex);
>> > > > >
>> > > > > + blk_cleanup_queue(ctrl->ctrl.admin_q);
>> > > > > + blk_mq_free_tag_set(&ctrl->admin_tag_set);
>> > > > > + nvme_rdma_dev_put(ctrl->device);
>> > > > > +
>> > > > > if (ctrl->ctrl.tagset) {
>> > > > > blk_cleanup_queue(ctrl->ctrl.connect_q);
>> > > > > blk_mq_free_tag_set(&ctrl->tag_set);
>> > > >
>> > > > This patch does not remove the second
>> > > >
>> > > > nvme_rdma_dev_put(ctrl->device);
>> > > >
>> > > > call that happens within the if() statement above if it
>> > > > evaluates
>> > > > to
>> > > > TRUE. Should that have been removed or moved elsewhere?
>> > >
>> > > Not sure I understand your question.
>> > > Did you mean line 694?
>> >
>> > Yes I mean line 694.
>> >
>> > >
>> > > For discovery controller, there is no IO queues. So ctrl-
>> > > > ctrl.tagset
>> > > is NULL.
>> > >
>> > > The first bulk of
>> > > "blk_cleanup_queue/blk_mq_free_tag_set/nvme_rdma_dev_put" is for
>> > > admin
>> > > queue.
>> > > And the second is for IO queues.
>> >
>> > I'm just confused when nvme_free_ctrl() in core.c calls:
>> >
>> > ctrl->ops->free_ctrl(ctrl);
>> >
>> > which looks like would be the only call that would free both the
>> > admin
>> > and I/O rdma queues, why there would be the potential to do a
>> > _put()
>> > twice in nvme_rdma_free_ctrl() via:
>> >
>> > nvme_rdma_dev_put(ctrl->device);
>> >
>> > one for the admin section:
>> >
>> > 687 blk_cleanup_queue(ctrl>ctrl.admin_q);
>> > 688 blk_mq_free_tag_set(&ctrl->admin_tag_set);
>> > 689 nvme_rdma_dev_put(ctrl->device);
>>
>> This put paired with the get in nvme_rdma_configure_admin_queue()
>>
>> >
>> > and one for the I/O section (assuming "if (ctrl->ctrl.tagset)"
>> > evaluate
>> > s to TRUE in that call):
>> >
>> > 691 if (ctrl->ctrl.tagset) {
>> > 692 blk_cleanup_queue(ctrl->ctrl.connect_q);
>> > 693 blk_mq_free_tag_set(&ctrl->tag_set);
>> > 694 nvme_rdma_dev_put(ctrl->device);
>>
>> This put paired with the get in nvme_rdma_create_io_queues()
>>
>> > 695 }
>> >
>> >
>> > My assumption would be that the correct path for this case would be
>> > such that
>> >
>> > nvme_rdma_dev_put(ctrl->device);
>> >
>> > would only be called one time, for a single device.
>>
>> As above, need put for each get.
>
> OK, thanks for the clarification on this.
>
> Would it then be worth to have an if() check around the new admin
> logic, as the assumption with the added code is it will always need to
> free the admin_queue when called, something like:
No, because admin_tag_set is always not NULL.
>
> if (ctrl->admin_tag_set) {
> blk_cleanup_queue(ctrl->ctrl.admin_q);
> blk_mq_free_tag_set(&ctrl->admin_tag_set);
> nvme_rdma_dev_put(ctrl->device);
> }
>
> blk_mq_free_tag_set() does assume its parameter is not NULL.
Sagi's patch is better than these two.
We'll go for it.
More information about the Linux-nvme
mailing list