scsi: smartpqi: Use is_kdump_kernel() to check for kdump
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: 058311b72f ("scsi: smartpqi: Add fw log to kdump")
Signed-off-by: Martin Wilck <mwilck@suse.com>
Link: https://lore.kernel.org/r/20250321223319.109250-1-mwilck@suse.com
Cc: Randy Wright <rwright@hpe.com>
Acked-by: Don Brace <don.brace@microchip.com>
Tested-by: Don Brace <don.brace@microchip.com>
Reviewed-by: Lee Duncan <lduncan@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
committed by
Martin K. Petersen
parent
f7b705c238
commit
a2d5a00722
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user