Message ID | 20250321223319.109250-1-mwilck@suse.com |
---|---|
State | New |
Headers | show |
Series | scsi: smartpqi: use is_kdump_kernel() to check for kdump | expand |
On Fri, Mar 21, 2025 at 3:33 PM Martin Wilck <martin.wilck@suse.com> wrote: > > The smartpqi driver checks the reset_devices variable to determine whether > special adjustments need to be made for kdump. This has the effect that > after a regular kexec reboot, some driver parameters such as > max_transfer_size are much lower than usual. More importantly, kexec reboot > tests have revealed memory corruption caused by the driver log being > written to system memory after a kexec. > > Fix this by testing is_kdump_kernel() rather than reset_devices where > appropriate. > > Fixes: 058311b72f54 ("scsi: smartpqi: Add fw log to kdump") > Signed-off-by: Martin Wilck <mwilck@suse.com> > Acked-by: Don Brace <don.brace@microchip.com> > Tested-by: Don Brace <con.brace@microchip.com> > Cc: Randy Wright <rwright@hpe.com> > --- > drivers/scsi/smartpqi/smartpqi_init.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c > index 0da7be40c925..e790b5d4e3c7 100644 > --- a/drivers/scsi/smartpqi/smartpqi_init.c > +++ b/drivers/scsi/smartpqi/smartpqi_init.c > @@ -19,6 +19,7 @@ > #include <linux/bcd.h> > #include <linux/reboot.h> > #include <linux/cciss_ioctl.h> > +#include <linux/crash_dump.h> > #include <scsi/scsi_host.h> > #include <scsi/scsi_cmnd.h> > #include <scsi/scsi_device.h> > @@ -5246,7 +5247,7 @@ static void pqi_calculate_io_resources(struct pqi_ctrl_info *ctrl_info) > ctrl_info->error_buffer_length = > ctrl_info->max_io_slots * PQI_ERROR_BUFFER_ELEMENT_LENGTH; > > - if (reset_devices) > + if (is_kdump_kernel()) > max_transfer_size = min(ctrl_info->max_transfer_size, > PQI_MAX_TRANSFER_SIZE_KDUMP); > else > @@ -5275,7 +5276,7 @@ static void pqi_calculate_queue_resources(struct pqi_ctrl_info *ctrl_info) > u16 num_elements_per_iq; > u16 num_elements_per_oq; > > - if (reset_devices) { > + if (is_kdump_kernel()) { > num_queue_groups = 1; > } else { > int num_cpus; > @@ -8288,12 +8289,12 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info) > u32 product_id; > > if (reset_devices) { > - if (pqi_is_fw_triage_supported(ctrl_info)) { > + if (is_kdump_kernel() && pqi_is_fw_triage_supported(ctrl_info)) { > rc = sis_wait_for_fw_triage_completion(ctrl_info); > if (rc) > return rc; > } > - if (sis_is_ctrl_logging_supported(ctrl_info)) { > + if (is_kdump_kernel() && sis_is_ctrl_logging_supported(ctrl_info)) { > sis_notify_kdump(ctrl_info); > rc = sis_wait_for_ctrl_logging_completion(ctrl_info); > if (rc) > @@ -8344,7 +8345,7 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info) > ctrl_info->product_id = (u8)product_id; > ctrl_info->product_revision = (u8)(product_id >> 8); > > - if (reset_devices) { > + if (is_kdump_kernel()) { > if (ctrl_info->max_outstanding_requests > > PQI_MAX_OUTSTANDING_REQUESTS_KDUMP) > ctrl_info->max_outstanding_requests = > @@ -8480,7 +8481,7 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info) > if (rc) > return rc; > > - if (ctrl_info->ctrl_logging_supported && !reset_devices) { > + if (ctrl_info->ctrl_logging_supported && !is_kdump_kernel()) { > pqi_host_setup_buffer(ctrl_info, &ctrl_info->ctrl_log_memory, PQI_CTRL_LOG_TOTAL_SIZE, PQI_CTRL_LOG_MIN_SIZE); > pqi_host_memory_update(ctrl_info, &ctrl_info->ctrl_log_memory, PQI_VENDOR_GENERAL_CTRL_LOG_MEMORY_UPDATE); > } > -- > 2.49.0 > > Reviewed-by: Lee Duncan <lduncan@suse.com>
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c index 0da7be40c925..e790b5d4e3c7 100644 --- a/drivers/scsi/smartpqi/smartpqi_init.c +++ b/drivers/scsi/smartpqi/smartpqi_init.c @@ -19,6 +19,7 @@ #include <linux/bcd.h> #include <linux/reboot.h> #include <linux/cciss_ioctl.h> +#include <linux/crash_dump.h> #include <scsi/scsi_host.h> #include <scsi/scsi_cmnd.h> #include <scsi/scsi_device.h> @@ -5246,7 +5247,7 @@ static void pqi_calculate_io_resources(struct pqi_ctrl_info *ctrl_info) ctrl_info->error_buffer_length = ctrl_info->max_io_slots * PQI_ERROR_BUFFER_ELEMENT_LENGTH; - if (reset_devices) + if (is_kdump_kernel()) max_transfer_size = min(ctrl_info->max_transfer_size, PQI_MAX_TRANSFER_SIZE_KDUMP); else @@ -5275,7 +5276,7 @@ static void pqi_calculate_queue_resources(struct pqi_ctrl_info *ctrl_info) u16 num_elements_per_iq; u16 num_elements_per_oq; - if (reset_devices) { + if (is_kdump_kernel()) { num_queue_groups = 1; } else { int num_cpus; @@ -8288,12 +8289,12 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info) u32 product_id; if (reset_devices) { - if (pqi_is_fw_triage_supported(ctrl_info)) { + if (is_kdump_kernel() && pqi_is_fw_triage_supported(ctrl_info)) { rc = sis_wait_for_fw_triage_completion(ctrl_info); if (rc) return rc; } - if (sis_is_ctrl_logging_supported(ctrl_info)) { + if (is_kdump_kernel() && sis_is_ctrl_logging_supported(ctrl_info)) { sis_notify_kdump(ctrl_info); rc = sis_wait_for_ctrl_logging_completion(ctrl_info); if (rc) @@ -8344,7 +8345,7 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info) ctrl_info->product_id = (u8)product_id; ctrl_info->product_revision = (u8)(product_id >> 8); - if (reset_devices) { + if (is_kdump_kernel()) { if (ctrl_info->max_outstanding_requests > PQI_MAX_OUTSTANDING_REQUESTS_KDUMP) ctrl_info->max_outstanding_requests = @@ -8480,7 +8481,7 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info) if (rc) return rc; - if (ctrl_info->ctrl_logging_supported && !reset_devices) { + if (ctrl_info->ctrl_logging_supported && !is_kdump_kernel()) { pqi_host_setup_buffer(ctrl_info, &ctrl_info->ctrl_log_memory, PQI_CTRL_LOG_TOTAL_SIZE, PQI_CTRL_LOG_MIN_SIZE); pqi_host_memory_update(ctrl_info, &ctrl_info->ctrl_log_memory, PQI_VENDOR_GENERAL_CTRL_LOG_MEMORY_UPDATE); }