FAILED: patch "[PATCH] IB/hfi1: Close PSM sdma_progress sleep window" failed to apply to 4.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From da9de5f8527f4b9efc82f967d29a583318c034c7 Mon Sep 17 00:00:00 2001
From: Mike Marciniszyn <[email protected]>
Date: Fri, 7 Jun 2019 08:25:31 -0400
Subject: [PATCH] IB/hfi1: Close PSM sdma_progress sleep window
The call to sdma_progress() is called outside the wait lock.
In this case, there is a race condition where sdma_progress() can return false and the sdma_engine can idle. If that happens, there will be no more sdma interrupts to cause the wakeup and the user_sdma xmit will hang.
Fix by moving the lock to enclose the sdma_progress() call.
Also, delete busycount. The need for this was removed by:
commit bcad29137a97 ("IB/hfi1: Serve the most starved iowait entry first")
drivers/infiniband/hw/hfi1/user_sdma.c +4 -8
@@ -130,20 +130,16 @@ static int defer_packet_queue( {struct hfi1_user_sdma_pkt_q *pq = container_of(wait->iow, struct hfi1_user_sdma_pkt_q, busy); -struct user_sdma_txreq *tx = - container_of(txreq, struct user_sdma_txreq, txreq); -if (sdma_progress (sde, seq, txreq)) { -if (tx->busycount++ <MAX_DEFER_RETRY_COUNT ) - goto eagain; - } +write_seqlock (&sde->waitlock); +if (sdma_progress (sde, seq, txreq)) + goto eagain;/* * We are assuming that if the list is enqueued somewhere, it * is to the dmawait list since that is the only place where * it is supposed to be enqueued. */ xchg (&pq->state,SDMA_PKT_Q_DEFERRED ); -write_seqlock (&sde->waitlock);if (list_empty (&pq->busy.list)) {iowait_get_priority (&pq->busy);iowait_queue (pkts_sent, &pq->busy, &sde->dmawait);
@@ -151,6 +147,7 @@ static int defer_packet_queue(write_sequnlock (&sde->waitlock);return -EBUSY ; eagain: +write_sequnlock (&sde->waitlock);return -EAGAIN ; }
@@ -804,7 +801,6 @@ static int user_sdma_send_pkts(struct user_sdma_request *req, u16 maxpkts) tx->flags =0 ; tx->req = req; - tx->busycount =0 ;INIT_LIST_HEAD (&tx->list);/*
drivers/infiniband/hw/hfi1/user_sdma.h +0 -1
@@ -245,7 +245,6 @@ struct user_sdma_txreq {struct list_head list;struct user_sdma_request *req;u16 flags; -unsigned int busycount;u16 seqnum; };