linux-rdma.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
To: Sagi Grimberg <sagi-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
Cc: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>,
	linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-nvme-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	Max Gurtuvoy <maxg-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
Subject: Re: [PATCH v2 2/3] nvme-rdma: don't complete requests before a send work request has completed
Date: Mon, 20 Nov 2017 09:31:31 +0100	[thread overview]
Message-ID: <20171120083130.GC27552@lst.de> (raw)
In-Reply-To: <0f368bc9-2e9f-4008-316c-46b85661a274-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>

On Thu, Nov 09, 2017 at 01:14:23PM +0200, Sagi Grimberg wrote:
>> Wouldn't it be better to use atomic bitops (test_and_set_bit and co)
>> for these flags instead of needing a irqsave lock?
>
> Here it will be better, but in the next patch, where we need to check
> also for MR invalidation atomically I don't know.
>
> The logic is:
> 1. on RECV: complete if (send completed and MR invalidated)
> 2. on SEND: complete if (recv completed and MR invalidated)
> 3. on INV: complete if (recv completed and send completed)
>
> We need the conditions to be atomic because the CQ can be processed
> from two contexts (and trust me, it falls apart fast if we don't protect
> it). Not sure I understand how I can achieve this with atomic bitops.
>
> We could relax the spinlock to _bh I think as we are only racing with
> irq-poll.

Both send and recv completed only ever go from not set to set on a live
requests, so that's easy.  need_inval only goes from set to cleared
so I'm not too worried about it either, but due to the lack of atomic
bitops there it will need better memory barries, or just a switch
to bitops..

But looking at this in a little more detail I wonder if we just want
a recount on the nvme_rdma_request, untested patch below.  With a little
more work we can probably also remove the need_inval flag, but I think
I want to wait for the mr pool patch from Israel for that.

diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
index ef3373e56602..5627d81735d2 100644
--- a/drivers/nvme/host/rdma.c
+++ b/drivers/nvme/host/rdma.c
@@ -60,9 +60,7 @@ struct nvme_rdma_request {
 	struct ib_mr		*mr;
 	struct nvme_rdma_qe	sqe;
 	struct nvme_completion	cqe;
-	spinlock_t		lock;
-	bool			send_completed;
-	bool			resp_completed;
+	atomic_t		ref;
 	struct ib_sge		sge[1 + NVME_RDMA_MAX_INLINE_SEGMENTS];
 	u32			num_sge;
 	int			nents;
@@ -315,8 +313,6 @@ static int nvme_rdma_init_request(struct blk_mq_tag_set *set,
 	struct ib_device *ibdev = dev->dev;
 	int ret;
 
-	spin_lock_init(&req->lock);
-
 	ret = nvme_rdma_alloc_qe(ibdev, &req->sqe, sizeof(struct nvme_command),
 			DMA_TO_DEVICE);
 	if (ret)
@@ -1025,19 +1021,13 @@ static void nvme_rdma_inv_rkey_done(struct ib_cq *cq, struct ib_wc *wc)
 	struct nvme_rdma_request *req =
 		container_of(wc->wr_cqe, struct nvme_rdma_request, reg_cqe);
 	struct request *rq = blk_mq_rq_from_pdu(req);
-	unsigned long flags;
-	bool end;
 
 	if (unlikely(wc->status != IB_WC_SUCCESS)) {
 		nvme_rdma_wr_error(cq, wc, "LOCAL_INV");
 		return;
 	}
 
-	spin_lock_irqsave(&req->lock, flags);
-	req->mr->need_inval = false;
-	end = (req->resp_completed && req->send_completed);
-	spin_unlock_irqrestore(&req->lock, flags);
-	if (end)
+	if (atomic_dec_and_test(&req->ref))
 		nvme_end_request(rq, req->cqe.status, req->cqe.result);
 
 }
@@ -1151,6 +1141,7 @@ static int nvme_rdma_map_sg_fr(struct nvme_rdma_queue *queue,
 			     IB_ACCESS_REMOTE_WRITE;
 
 	req->mr->need_inval = true;
+	atomic_inc(&req->ref);
 
 	sg->addr = cpu_to_le64(req->mr->iova);
 	put_unaligned_le24(req->mr->length, sg->length);
@@ -1172,8 +1163,7 @@ static int nvme_rdma_map_data(struct nvme_rdma_queue *queue,
 	req->num_sge = 1;
 	req->inline_data = false;
 	req->mr->need_inval = false;
-	req->send_completed = false;
-	req->resp_completed = false;
+	atomic_set(&req->ref, 2);
 
 	c->common.flags |= NVME_CMD_SGL_METABUF;
 
@@ -1215,19 +1205,13 @@ static void nvme_rdma_send_done(struct ib_cq *cq, struct ib_wc *wc)
 	struct nvme_rdma_request *req =
 		container_of(qe, struct nvme_rdma_request, sqe);
 	struct request *rq = blk_mq_rq_from_pdu(req);
-	unsigned long flags;
-	bool end;
 
 	if (unlikely(wc->status != IB_WC_SUCCESS)) {
 		nvme_rdma_wr_error(cq, wc, "SEND");
 		return;
 	}
 
-	spin_lock_irqsave(&req->lock, flags);
-	req->send_completed = true;
-	end = req->resp_completed && !req->mr->need_inval;
-	spin_unlock_irqrestore(&req->lock, flags);
-	if (end)
+	if (atomic_dec_and_test(&req->ref))
 		nvme_end_request(rq, req->cqe.status, req->cqe.result);
 }
 
@@ -1330,8 +1314,6 @@ static int nvme_rdma_process_nvme_rsp(struct nvme_rdma_queue *queue,
 	struct request *rq;
 	struct nvme_rdma_request *req;
 	int ret = 0;
-	unsigned long flags;
-	bool end;
 
 	rq = blk_mq_tag_to_rq(nvme_rdma_tagset(queue), cqe->command_id);
 	if (!rq) {
@@ -1348,7 +1330,7 @@ static int nvme_rdma_process_nvme_rsp(struct nvme_rdma_queue *queue,
 
 	if ((wc->wc_flags & IB_WC_WITH_INVALIDATE) &&
 	    wc->ex.invalidate_rkey == req->mr->rkey) {
-		req->mr->need_inval = false;
+		atomic_dec(&req->ref);
 	} else if (req->mr->need_inval) {
 		ret = nvme_rdma_inv_rkey(queue, req);
 		if (unlikely(ret < 0)) {
@@ -1359,11 +1341,7 @@ static int nvme_rdma_process_nvme_rsp(struct nvme_rdma_queue *queue,
 		}
 	}
 
-	spin_lock_irqsave(&req->lock, flags);
-	req->resp_completed = true;
-	end = req->send_completed && !req->mr->need_inval;
-	spin_unlock_irqrestore(&req->lock, flags);
-	if (end) {
+	if (atomic_dec_and_test(&req->ref)) {
 		if (rq->tag == tag)
 			ret = 1;
 		nvme_end_request(rq, req->cqe.status, req->cqe.result);
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2017-11-20  8:31 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-08 10:06 [PATCH v2 0/3] Fix request completion holes Sagi Grimberg
     [not found] ` <20171108100616.26605-1-sagi-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-08 10:06   ` [PATCH v2 1/3] nvme-rdma: don't suppress send completions Sagi Grimberg
     [not found]     ` <20171108100616.26605-2-sagi-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-09  9:18       ` Christoph Hellwig
     [not found]         ` <20171109091858.GA16966-jcswGhMUV9g@public.gmane.org>
2017-11-09 11:08           ` Sagi Grimberg
     [not found]             ` <921c4331-9456-3783-423a-9c5c5e405131-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-20  8:18               ` Christoph Hellwig
     [not found]                 ` <20171120081809.GB27552-jcswGhMUV9g@public.gmane.org>
2017-11-20  8:33                   ` Sagi Grimberg
     [not found]                     ` <4ac0bc2e-498b-0fc1-4e30-7ff76bd036f1-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-20  9:32                       ` Christoph Hellwig
2017-11-08 10:06   ` [PATCH v2 2/3] nvme-rdma: don't complete requests before a send work request has completed Sagi Grimberg
     [not found]     ` <20171108100616.26605-3-sagi-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-09  9:21       ` Christoph Hellwig
     [not found]         ` <20171109092110.GB16966-jcswGhMUV9g@public.gmane.org>
2017-11-09 11:14           ` Sagi Grimberg
     [not found]             ` <0f368bc9-2e9f-4008-316c-46b85661a274-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-20  8:31               ` Christoph Hellwig [this message]
     [not found]                 ` <20171120083130.GC27552-jcswGhMUV9g@public.gmane.org>
2017-11-20  8:37                   ` Sagi Grimberg
     [not found]                     ` <384d8a51-aa2f-5954-c9fd-a0c88d7e5364-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-20  8:41                       ` Christoph Hellwig
     [not found]                         ` <20171120084102.GA28456-jcswGhMUV9g@public.gmane.org>
2017-11-20  9:04                           ` Sagi Grimberg
2017-11-20  9:28                           ` Sagi Grimberg
     [not found]                             ` <58bdc9c0-f98e-9d9f-f81e-fbed572f922e-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-20 10:49                               ` Christoph Hellwig
     [not found]                                 ` <20171120104921.GA31309-jcswGhMUV9g@public.gmane.org>
2017-11-20 11:12                                   ` Sagi Grimberg
     [not found]                                     ` <df9c9545-7c00-328b-9f98-535d8e889715-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-20 11:16                                       ` Christoph Hellwig
2017-11-08 10:06   ` [PATCH v2 3/3] nvme-rdma: wait for local invalidation before completing a request Sagi Grimberg
     [not found]     ` <20171108100616.26605-4-sagi-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-09  9:39       ` Christoph Hellwig
2017-11-13 22:10   ` [PATCH v2 0/3] Fix request completion holes Doug Ledford
     [not found]     ` <1510611044.3735.49.camel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2017-11-16 15:39       ` Sagi Grimberg
     [not found]         ` <e89f72c6-12ce-c149-c81e-f3adb43a8e9e-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-16 15:58           ` Doug Ledford
2017-11-20  7:37           ` Christoph Hellwig
     [not found]             ` <20171120073755.GA2236-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2017-11-20  8:33               ` Sagi Grimberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171120083130.GC27552@lst.de \
    --to=hch-jcswghmuv9g@public.gmane.org \
    --cc=linux-nvme-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
    --cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=maxg-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org \
    --cc=sagi-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).