diff mbox series

[for-rc] IB/hfi1: Fix another case where pq is left on waitlist

Message ID 20200504130917.175613.43231.stgit@awfm-01.aw.intel.com (mailing list archive)
State Mainlined
Commit fa8dac3968635dec8518a13ac78d662f2aa88e4d
Delegated to: Jason Gunthorpe
Headers show
Series [for-rc] IB/hfi1: Fix another case where pq is left on waitlist | expand

Commit Message

Marciniszyn, Mike May 4, 2020, 1:09 p.m. UTC
The commit noted below fixed a case where a pq is left on
the sdma wait list.

It however missed another case.

user_sdma_send_pkts() has two calls from hfi1_user_sdma_process_request().

If the first one fails as indicated by -EBUSY, the pq will be placed on
the waitlist as by design.

If the second call then succeeds, the pq is still on the waitlist
setting up a race with the interrupt handler if a subsequent request uses
a different SDMA engine

Fix by deleting the first call.

The use of pcount and the intent to send a short burst of packets followed
by the larger balance of packets was never correctly implemented, because
the two calls always send pcount packets no matter what.  A subsequent
patch will correct that issue.

Fixes: 9a293d1e21a6 ("IB/hfi1: Ensure pq is not left on waitlist")
Cc: <stable@vger.kernel.org>
Reviewed-by: Kaike Wan <kaike.wan@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
---
 drivers/infiniband/hw/hfi1/user_sdma.c |    4 ----
 1 file changed, 4 deletions(-)

Comments

Jason Gunthorpe May 6, 2020, 2:46 p.m. UTC | #1
On Mon, May 04, 2020 at 09:09:17AM -0400, Mike Marciniszyn wrote:
> The commit noted below fixed a case where a pq is left on
> the sdma wait list.
> 
> It however missed another case.
> 
> user_sdma_send_pkts() has two calls from hfi1_user_sdma_process_request().
> 
> If the first one fails as indicated by -EBUSY, the pq will be placed on
> the waitlist as by design.
> 
> If the second call then succeeds, the pq is still on the waitlist
> setting up a race with the interrupt handler if a subsequent request uses
> a different SDMA engine
> 
> Fix by deleting the first call.
> 
> The use of pcount and the intent to send a short burst of packets followed
> by the larger balance of packets was never correctly implemented, because
> the two calls always send pcount packets no matter what.  A subsequent
> patch will correct that issue.
> 
> Fixes: 9a293d1e21a6 ("IB/hfi1: Ensure pq is not left on waitlist")
> Cc: <stable@vger.kernel.org>
> Reviewed-by: Kaike Wan <kaike.wan@intel.com>
> Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
> ---
>  drivers/infiniband/hw/hfi1/user_sdma.c |    4 ----
>  1 file changed, 4 deletions(-)

Applied to for-rc, thanks

Jason
diff mbox series

Patch

diff --git a/drivers/infiniband/hw/hfi1/user_sdma.c b/drivers/infiniband/hw/hfi1/user_sdma.c
index 13e4203..a92346e 100644
--- a/drivers/infiniband/hw/hfi1/user_sdma.c
+++ b/drivers/infiniband/hw/hfi1/user_sdma.c
@@ -589,10 +589,6 @@  int hfi1_user_sdma_process_request(struct hfi1_filedata *fd,
 
 	set_comp_state(pq, cq, info.comp_idx, QUEUED, 0);
 	pq->state = SDMA_PKT_Q_ACTIVE;
-	/* Send the first N packets in the request to buy us some time */
-	ret = user_sdma_send_pkts(req, pcount);
-	if (unlikely(ret < 0 && ret != -EBUSY))
-		goto free_req;
 
 	/*
 	 * This is a somewhat blocking send implementation.