diff mbox series

[for-rc,2/4] IB/hfi1: Insure use of smp_processor_id() is preempt disabled

Message ID 20211129191958.101968.87329.stgit@awfm-01.cornelisnetworks.com (mailing list archive)
State Accepted
Delegated to: Jason Gunthorpe
Headers show
Series Some more RC fixes for 5.16 | expand

Commit Message

Dennis Dalessandro Nov. 29, 2021, 7:19 p.m. UTC
From: Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>

The following BUG has just surfaced with our 5.16 testing:

[27140.581296] BUG: using smp_processor_id() in preemptible [00000000] code: mpicheck/1581081
[27140.590987] caller is sdma_select_user_engine+0x72/0x210 [hfi1]
[27140.597999] CPU: 0 PID: 1581081 Comm: mpicheck Tainted: G S                5.16.0-rc1+ #1
[27140.607454] Hardware name: Intel Corporation S2600WT2R/S2600WT2R, BIOS SE5C610.86B.01.01.0016.033120161139 03/31/2016
[27140.619628] Call Trace:
[27140.622682]  <TASK>
[27140.625350]  dump_stack_lvl+0x33/0x42
[27140.629760]  check_preemption_disabled+0xbf/0xe0
[27140.635222]  sdma_select_user_engine+0x72/0x210 [hfi1]
[27140.641299]  ? _raw_spin_unlock_irqrestore+0x1f/0x31
[27140.647140]  ? hfi1_mmu_rb_insert+0x6b/0x200 [hfi1]
[27140.652909]  hfi1_user_sdma_process_request+0xa02/0x1120 [hfi1]
[27140.659857]  ? hfi1_write_iter+0xb8/0x200 [hfi1]
[27140.665348]  hfi1_write_iter+0xb8/0x200 [hfi1]
[27140.670650]  do_iter_readv_writev+0x163/0x1c0
[27140.675827]  do_iter_write+0x80/0x1c0
[27140.680214]  vfs_writev+0x88/0x1a0
[27140.684315]  ? recalibrate_cpu_khz+0x10/0x10
[27140.689388]  ? ktime_get+0x3e/0xa0
[27140.693473]  ? __fget_files+0x66/0xa0
[27140.697853]  do_writev+0x65/0x100
[27140.701842]  do_syscall_64+0x3a/0x80

Fix this long standing bug by moving the smp_processor_id() to
after the rcu_read_lock().

The rcu_read_lock() implicitly disables preemption.

Cc: stable@vger.kernel.org
Fixes: 0cb2aa690c7e ("IB/hfi1: Add sysfs interface for affinity setup")
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
---
 drivers/infiniband/hw/hfi1/sdma.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/drivers/infiniband/hw/hfi1/sdma.c b/drivers/infiniband/hw/hfi1/sdma.c
index 2b6c24b..f07d328 100644
--- a/drivers/infiniband/hw/hfi1/sdma.c
+++ b/drivers/infiniband/hw/hfi1/sdma.c
@@ -838,8 +838,8 @@  struct sdma_engine *sdma_select_user_engine(struct hfi1_devdata *dd,
 	if (current->nr_cpus_allowed != 1)
 		goto out;
 
-	cpu_id = smp_processor_id();
 	rcu_read_lock();
+	cpu_id = smp_processor_id();
 	rht_node = rhashtable_lookup(dd->sdma_rht, &cpu_id,
 				     sdma_rht_params);