FAILED: patch "[PATCH] IB/hfi1: Avoid hardlockup with flushlist_lock" failed to apply to 4.9-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.9-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 cf131a81967583ae737df6383a0893b9fee75b4e Mon Sep 17 00:00:00 2001
From: Mike Marciniszyn <[email protected]>
Date: Fri, 14 Jun 2019 12:32:26 -0400
Subject: [PATCH] IB/hfi1: Avoid hardlockup with flushlist_lock
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.
drivers/infiniband/hw/hfi1/sdma.c +3 -6
@@ -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)
@@ -2413,7 +2410,7 @@ int sdma_send_txreq(struct sdma_engine *sde,list_add_tail (&tx->list, &sde->flushlist);spin_unlock (&sde->flushlist_lock);iowait_inc_wait_count (wait, tx->num_desc); -schedule_work (&sde->flush_worker); +queue_work_on (sde->cpu, system_highpri_wq, &sde->flush_worker); ret = -ECOMM ; goto unlock; nodesc:
@@ -2511,7 +2508,7 @@ int sdma_send_txlist(struct sdma_engine *sde, struct iowait_work *wait,iowait_inc_wait_count (wait, tx->num_desc); }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: