diff mbox series

scsi: smartpqi: use is_kdump_kernel() to check for kdump

Message ID 20250321223319.109250-1-mwilck@suse.com
State New
Headers show
Series scsi: smartpqi: use is_kdump_kernel() to check for kdump | expand

Commit Message

Martin Wilck March 21, 2025, 10:33 p.m. UTC
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(-)

Comments

Lee Duncan March 25, 2025, 10:45 p.m. UTC | #1
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 mbox series

Patch

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);
 	}