提交 a0548edf 编写于 作者: D Davidlohr Bueso 提交者: Martin K. Petersen

scsi: libfc: Remove get_cpu() semantics in fc_exch_em_alloc()

The get_cpu() in fc_exch_em_alloc() was introduced in commit f018b73a
("[SCSI] libfc, libfcoe, fcoe: use smp_processor_id() only when preempt
disabled") for no other reason than to simply use smp_processor_id()
without getting a warning, because everything is done with the pool->lock
held anyway.  However, get_cpu(), by disabling preemption, does not play
well with PREEMPT_RT, particularly when acquiring a regular (and thus
sleepable) spinlock.

Therefore remove the get_cpu() and just use the unstable value as we will
have CPU locality guarantees next by taking the lock.  The window of
migration, as noted by Sebastian, is small and even if it happens the
result is correct.

Link: https://lore.kernel.org/r/20211117025956.79616-2-dave@stgolabs.net
Link: https://lore.kernel.org/r/20220506105758.283887-4-bigeasy@linutronix.deAcked-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: NDavidlohr Bueso <dbueso@suse.de>
Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
上级 a912460e
...@@ -825,10 +825,9 @@ static struct fc_exch *fc_exch_em_alloc(struct fc_lport *lport, ...@@ -825,10 +825,9 @@ static struct fc_exch *fc_exch_em_alloc(struct fc_lport *lport,
} }
memset(ep, 0, sizeof(*ep)); memset(ep, 0, sizeof(*ep));
cpu = get_cpu(); cpu = raw_smp_processor_id();
pool = per_cpu_ptr(mp->pool, cpu); pool = per_cpu_ptr(mp->pool, cpu);
spin_lock_bh(&pool->lock); spin_lock_bh(&pool->lock);
put_cpu();
/* peek cache of free slot */ /* peek cache of free slot */
if (pool->left != FC_XID_UNKNOWN) { if (pool->left != FC_XID_UNKNOWN) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册