From: Sasha Levin Date: Mon, 24 Jun 2019 20:23:17 +0000 (-0400) Subject: fixes for 4.4 X-Git-Tag: v5.1.15~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8a1fda3672ff4d42094c42571f895490763ae7bb;p=thirdparty%2Fkernel%2Fstable-queue.git fixes for 4.4 Signed-off-by: Sasha Levin --- diff --git a/queue-4.4/ib-hfi1-avoid-hardlockup-with-flushlist_lock.patch b/queue-4.4/ib-hfi1-avoid-hardlockup-with-flushlist_lock.patch new file mode 100644 index 00000000000..24ea5e804e5 --- /dev/null +++ b/queue-4.4/ib-hfi1-avoid-hardlockup-with-flushlist_lock.patch @@ -0,0 +1,62 @@ +From 90b648b15d12e81d307027414de915852ec0b558 Mon Sep 17 00:00:00 2001 +From: Mike Marciniszyn +Date: Mon, 24 Jun 2019 11:56:02 -0400 +Subject: IB/hfi1: Avoid hardlockup with flushlist_lock + +[ Upstream commit cf131a81967583ae737df6383a0893b9fee75b4e ] + +Heavy contention of the sde flushlist_lock can cause hard lockups at +extreme scale when the flushing logic is under stress. + +Mitigate by replacing the item at a time copy to the local list with +an O(1) list_splice_init() and using the high priority work queue to +do the flushes. + +Fixes: 7724105686e7 ("IB/hfi1: add driver files") +Cc: +Reviewed-by: Dennis Dalessandro +Signed-off-by: Mike Marciniszyn +Signed-off-by: Dennis Dalessandro +Signed-off-by: Doug Ledford +Signed-off-by: Sasha Levin +--- + drivers/staging/rdma/hfi1/sdma.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +diff --git a/drivers/staging/rdma/hfi1/sdma.c b/drivers/staging/rdma/hfi1/sdma.c +index 2a1da2189900..68df64b6c2e4 100644 +--- a/drivers/staging/rdma/hfi1/sdma.c ++++ b/drivers/staging/rdma/hfi1/sdma.c +@@ -390,10 +390,7 @@ static void sdma_flush(struct sdma_engine *sde) + sdma_flush_descq(sde); + spin_lock_irqsave(&sde->flushlist_lock, flags); + /* copy flush list */ +- list_for_each_entry_safe(txp, txp_next, &sde->flushlist, list) { +- list_del_init(&txp->list); +- list_add_tail(&txp->list, &flushlist); +- } ++ list_splice_init(&sde->flushlist, &flushlist); + spin_unlock_irqrestore(&sde->flushlist_lock, flags); + /* flush from flush list */ + list_for_each_entry_safe(txp, txp_next, &flushlist, list) { +@@ -2103,7 +2100,7 @@ int sdma_send_txreq(struct sdma_engine *sde, + wait->tx_count++; + wait->count += tx->num_desc; + } +- schedule_work(&sde->flush_worker); ++ queue_work_on(sde->cpu, system_highpri_wq, &sde->flush_worker); + ret = -ECOMM; + goto unlock; + nodesc: +@@ -2196,7 +2193,7 @@ int sdma_send_txlist(struct sdma_engine *sde, + } + } + spin_unlock(&sde->flushlist_lock); +- schedule_work(&sde->flush_worker); ++ queue_work_on(sde->cpu, system_highpri_wq, &sde->flush_worker); + ret = -ECOMM; + goto update_tail; + nodesc: +-- +2.20.1 + diff --git a/queue-4.4/series b/queue-4.4/series index 531057bc0b8..407a92fa43a 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -23,3 +23,4 @@ bluetooth-fix-regression-with-minimum-encryption-key-size-alignment.patch smb3-retry-on-status_insufficient_resources-instead-of-failing-write.patch cfg80211-fix-memory-leak-of-wiphy-device-name.patch mac80211-drop-robust-management-frames-from-unknown-ta.patch +ib-hfi1-avoid-hardlockup-with-flushlist_lock.patch