From: Mike Marciniszyn <mike.marciniszyn@xxxxxxxxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxxx Fixes: 0cb2aa690c7e ("IB/hfi1: Add sysfs interface for affinity setup") Signed-off-by: Mike Marciniszyn <mike.marciniszyn@xxxxxxxxxxxxxxxxxxxx> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@xxxxxxxxxxxxxxxxxxxx> --- drivers/infiniband/hw/hfi1/sdma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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);