From d6e8b1fcd779c76b17c0f7e387d21240b74abe79 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Mon, 24 Jun 2019 16:23:16 -0400 Subject: [PATCH] fixes for 4.19 Signed-off-by: Sasha Levin --- ...avoid-hardlockup-with-flushlist_lock.patch | 64 +++++++++++++++++++ queue-4.19/series | 1 + 2 files changed, 65 insertions(+) create mode 100644 queue-4.19/ib-hfi1-avoid-hardlockup-with-flushlist_lock.patch diff --git a/queue-4.19/ib-hfi1-avoid-hardlockup-with-flushlist_lock.patch b/queue-4.19/ib-hfi1-avoid-hardlockup-with-flushlist_lock.patch new file mode 100644 index 0000000000..aeddaa9e07 --- /dev/null +++ b/queue-4.19/ib-hfi1-avoid-hardlockup-with-flushlist_lock.patch @@ -0,0 +1,64 @@ +From 5b1058c9eafcafe88a8bd4c664fc904a44d21aca Mon Sep 17 00:00:00 2001 +From: Mike Marciniszyn +Date: Mon, 24 Jun 2019 12:14:29 -0400 +Subject: IB/hfi1: Avoid hardlockup with flushlist_lock + +commit cf131a81967583ae737df6383a0893b9fee75b4e upstream. + +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. + +Ported to linux-4.14.y. + +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/infiniband/hw/hfi1/sdma.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +diff --git a/drivers/infiniband/hw/hfi1/sdma.c b/drivers/infiniband/hw/hfi1/sdma.c +index 88e326d6cc49..d648a4167832 100644 +--- a/drivers/infiniband/hw/hfi1/sdma.c ++++ b/drivers/infiniband/hw/hfi1/sdma.c +@@ -410,10 +410,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) +@@ -2426,7 +2423,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: +@@ -2526,7 +2523,7 @@ int sdma_send_txlist(struct sdma_engine *sde, struct iowait *wait, + } + } + 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.19/series b/queue-4.19/series index 70e46d9524..7b3bb8bd03 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -89,3 +89,4 @@ nl80211-fix-station_info-pertid-memory-leak.patch mac80211-do-not-use-stack-memory-with-scatterlist-for-gmac.patch x86-resctrl-don-t-stop-walking-closids-when-a-locksetup-group-is-found.patch powerpc-mm-64s-hash-reallocate-context-ids-on-fork.patch +ib-hfi1-avoid-hardlockup-with-flushlist_lock.patch -- 2.39.2