Hannes Reinecke 24a328
From: Davidlohr Bueso <dave@stgolabs.net>
Hannes Reinecke 24a328
Date: Fri, 6 May 2022 12:57:57 +0200
Hannes Reinecke 24a328
Subject: [PATCH] scsi: libfc: Remove get_cpu() semantics in fc_exch_em_alloc()
Hannes Reinecke 24a328
Git-commit: a0548edf852a8776dade1e511694b2980c674e2a
Hannes Reinecke 24a328
Patch-mainline: v5.19-rc1
Hannes Reinecke 24a328
References: jsc#PED-1559
Hannes Reinecke 24a328
Hannes Reinecke 24a328
The get_cpu() in fc_exch_em_alloc() was introduced in commit f018b73af6db
Hannes Reinecke 24a328
("[SCSI] libfc, libfcoe, fcoe: use smp_processor_id() only when preempt
Hannes Reinecke 24a328
disabled") for no other reason than to simply use smp_processor_id()
Hannes Reinecke 24a328
without getting a warning, because everything is done with the pool->lock
Hannes Reinecke 24a328
held anyway.  However, get_cpu(), by disabling preemption, does not play
Hannes Reinecke 24a328
well with PREEMPT_RT, particularly when acquiring a regular (and thus
Hannes Reinecke 24a328
sleepable) spinlock.
Hannes Reinecke 24a328
Hannes Reinecke 24a328
Therefore remove the get_cpu() and just use the unstable value as we will
Hannes Reinecke 24a328
have CPU locality guarantees next by taking the lock.  The window of
Hannes Reinecke 24a328
migration, as noted by Sebastian, is small and even if it happens the
Hannes Reinecke 24a328
result is correct.
Hannes Reinecke 24a328
Hannes Reinecke 24a328
Link: https://lore.kernel.org/r/20211117025956.79616-2-dave@stgolabs.net
Hannes Reinecke 24a328
Link: https://lore.kernel.org/r/20220506105758.283887-4-bigeasy@linutronix.de
Hannes Reinecke 24a328
Acked-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Hannes Reinecke 24a328
Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
Hannes Reinecke 24a328
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Hannes Reinecke 24a328
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Hannes Reinecke 24a328
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke 24a328
---
Hannes Reinecke 24a328
 drivers/scsi/libfc/fc_exch.c | 3 +--
Hannes Reinecke 24a328
 1 file changed, 1 insertion(+), 2 deletions(-)
Hannes Reinecke 24a328
Hannes Reinecke 24a328
diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c
Hannes Reinecke 24a328
index aa223db4cf53..1d91c457527f 100644
Hannes Reinecke 24a328
--- a/drivers/scsi/libfc/fc_exch.c
Hannes Reinecke 24a328
+++ b/drivers/scsi/libfc/fc_exch.c
Hannes Reinecke 24a328
@@ -825,10 +825,9 @@ static struct fc_exch *fc_exch_em_alloc(struct fc_lport *lport,
Hannes Reinecke 24a328
 	}
Hannes Reinecke 24a328
 	memset(ep, 0, sizeof(*ep));
Hannes Reinecke 24a328
 
Hannes Reinecke 24a328
-	cpu = get_cpu();
Hannes Reinecke 24a328
+	cpu = raw_smp_processor_id();
Hannes Reinecke 24a328
 	pool = per_cpu_ptr(mp->pool, cpu);
Hannes Reinecke 24a328
 	spin_lock_bh(&pool->lock);
Hannes Reinecke 24a328
-	put_cpu();
Hannes Reinecke 24a328
 
Hannes Reinecke 24a328
 	/* peek cache of free slot */
Hannes Reinecke 24a328
 	if (pool->left != FC_XID_UNKNOWN) {
Hannes Reinecke 24a328
-- 
Hannes Reinecke 24a328
2.35.3
Hannes Reinecke 24a328