scsi: smartpqi: Fix smp_processor_id() call trace for preemptible kernels
authorYi Zhang <yi.zhang@redhat.com>
Wed, 23 Apr 2025 18:32:28 +0000 (13:32 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 29 Apr 2025 01:43:26 +0000 (21:43 -0400)
Correct kernel call trace when calling smp_processor_id() when called in
preemptible kernels by using raw_smp_processor_id().

smp_processor_id() checks to see if preemption is disabled and if not,
issue an error message followed by a call to dump_stack().

Brief example of call trace:
kernel:  check_preemption_disabled: 436 callbacks suppressed
kernel:  BUG: using smp_processor_id() in preemptible [00000000]
         code: kworker/u1025:0/2354
kernel:  caller is pqi_scsi_queue_command+0x183/0x310 [smartpqi]
kernel:  CPU: 129 PID: 2354 Comm: kworker/u1025:0
kernel:  ...
kernel:  Workqueue: writeback wb_workfn (flush-253:0)
kernel:  Call Trace:
kernel:   <TASK>
kernel:   dump_stack_lvl+0x34/0x48
kernel:   check_preemption_disabled+0xdd/0xe0
kernel:   pqi_scsi_queue_command+0x183/0x310 [smartpqi]
kernel:  ...

Fixes: 283dcc1b142e ("scsi: smartpqi: add counter for parity write stream requests")
Reviewed-by: Scott Benesh <scott.benesh@microchip.com>
Reviewed-by: Mike McGowen <mike.mcgowen@microchip.com>
Tested-by: Don Brace <don.brace@microchip.com>
Signed-off-by: Yi Zhang <yi.zhang@redhat.com>
Signed-off-by: Don Brace <don.brace@microchip.com>
Link: https://lore.kernel.org/r/20250423183229.538572-5-don.brace@microchip.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/smartpqi/smartpqi_init.c

index efc042071ec097c6d65d56bf99df15a1152c3510..e8abfc56d0f030cc949b116ddbcda799ed88b1e9 100644 (file)
@@ -6003,7 +6003,7 @@ static bool pqi_is_parity_write_stream(struct pqi_ctrl_info *ctrl_info,
                        pqi_stream_data->next_lba = rmd.first_block +
                                rmd.block_cnt;
                        pqi_stream_data->last_accessed = jiffies;
-                       per_cpu_ptr(device->raid_io_stats, smp_processor_id())->write_stream_cnt++;
+                               per_cpu_ptr(device->raid_io_stats, raw_smp_processor_id())->write_stream_cnt++;
                        return true;
                }
 
@@ -6082,7 +6082,7 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost, struct scsi_cmnd *scm
                        rc = pqi_raid_bypass_submit_scsi_cmd(ctrl_info, device, scmd, queue_group);
                        if (rc == 0 || rc == SCSI_MLQUEUE_HOST_BUSY) {
                                raid_bypassed = true;
-                               per_cpu_ptr(device->raid_io_stats, smp_processor_id())->raid_bypass_cnt++;
+                               per_cpu_ptr(device->raid_io_stats, raw_smp_processor_id())->raid_bypass_cnt++;
                        }
                }
                if (!raid_bypassed)