Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4356d0b6 authored by Ram Vepa's avatar Ram Vepa Committed by Roland Dreier
Browse files

IB/qib: Fix potential deadlock with link down interrupt



There is a possibility of a deadlock due to the way locks are
acquired and released in qib_set_uevent_bits(). The function
qib_set_uevent_bits() is called in process context and it uses
spin_lock() and spin_unlock().  This same lock is acquired/released
in interrupt context which can lead to a deadlock when running on
the same cpu.

The fix is to replace spin_lock() and spin_unlock() with
spin_lock_irqsave() and spin_unlock_irqrestore() respectively in
qib_set_uevent_bits().

Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@qlogic.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 2df4f757
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1905,8 +1905,9 @@ int qib_set_uevent_bits(struct qib_pportdata *ppd, const int evtbit)
	struct qib_ctxtdata *rcd;
	unsigned ctxt;
	int ret = 0;
	unsigned long flags;

	spin_lock(&ppd->dd->uctxt_lock);
	spin_lock_irqsave(&ppd->dd->uctxt_lock, flags);
	for (ctxt = ppd->dd->first_user_ctxt; ctxt < ppd->dd->cfgctxts;
	     ctxt++) {
		rcd = ppd->dd->rcd[ctxt];
@@ -1925,7 +1926,7 @@ int qib_set_uevent_bits(struct qib_pportdata *ppd, const int evtbit)
		ret = 1;
		break;
	}
	spin_unlock(&ppd->dd->uctxt_lock);
	spin_unlock_irqrestore(&ppd->dd->uctxt_lock, flags);

	return ret;
}