Commit d727a776 authored by Kevin Barnett's avatar Kevin Barnett Committed by Martin K. Petersen

scsi: smartpqi: enhance kdump

constrain resource usage during kdump to avoid kdump failures
Reviewed-by: default avatarScott Benesh <scott.benesh@microsemi.com>
Signed-off-by: default avatarKevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: default avatarDon Brace <don.brace@microsemi.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 4e8415e3
...@@ -686,8 +686,10 @@ struct pqi_config_table_heartbeat { ...@@ -686,8 +686,10 @@ struct pqi_config_table_heartbeat {
__le32 heartbeat_counter; __le32 heartbeat_counter;
}; };
#define PQI_MAX_OUTSTANDING_REQUESTS ((u32)~0) #define PQI_MAX_OUTSTANDING_REQUESTS ((u32)~0)
#define PQI_MAX_TRANSFER_SIZE (4 * 1024U * 1024U) #define PQI_MAX_OUTSTANDING_REQUESTS_KDUMP 32
#define PQI_MAX_TRANSFER_SIZE (4 * 1024U * 1024U)
#define PQI_MAX_TRANSFER_SIZE_KDUMP (512 * 1024U)
#define RAID_MAP_MAX_ENTRIES 1024 #define RAID_MAP_MAX_ENTRIES 1024
......
...@@ -4353,8 +4353,12 @@ static void pqi_calculate_io_resources(struct pqi_ctrl_info *ctrl_info) ...@@ -4353,8 +4353,12 @@ static void pqi_calculate_io_resources(struct pqi_ctrl_info *ctrl_info)
ctrl_info->error_buffer_length = ctrl_info->error_buffer_length =
ctrl_info->max_io_slots * PQI_ERROR_BUFFER_ELEMENT_LENGTH; ctrl_info->max_io_slots * PQI_ERROR_BUFFER_ELEMENT_LENGTH;
max_transfer_size = if (reset_devices)
min(ctrl_info->max_transfer_size, PQI_MAX_TRANSFER_SIZE); max_transfer_size = min(ctrl_info->max_transfer_size,
PQI_MAX_TRANSFER_SIZE_KDUMP);
else
max_transfer_size = min(ctrl_info->max_transfer_size,
PQI_MAX_TRANSFER_SIZE);
max_sg_entries = max_transfer_size / PAGE_SIZE; max_sg_entries = max_transfer_size / PAGE_SIZE;
...@@ -4374,19 +4378,24 @@ static void pqi_calculate_io_resources(struct pqi_ctrl_info *ctrl_info) ...@@ -4374,19 +4378,24 @@ static void pqi_calculate_io_resources(struct pqi_ctrl_info *ctrl_info)
static void pqi_calculate_queue_resources(struct pqi_ctrl_info *ctrl_info) static void pqi_calculate_queue_resources(struct pqi_ctrl_info *ctrl_info)
{ {
int num_cpus;
int max_queue_groups;
int num_queue_groups; int num_queue_groups;
u16 num_elements_per_iq; u16 num_elements_per_iq;
u16 num_elements_per_oq; u16 num_elements_per_oq;
max_queue_groups = min(ctrl_info->max_inbound_queues / 2, if (reset_devices) {
ctrl_info->max_outbound_queues - 1); num_queue_groups = 1;
max_queue_groups = min(max_queue_groups, PQI_MAX_QUEUE_GROUPS); } else {
int num_cpus;
int max_queue_groups;
max_queue_groups = min(ctrl_info->max_inbound_queues / 2,
ctrl_info->max_outbound_queues - 1);
max_queue_groups = min(max_queue_groups, PQI_MAX_QUEUE_GROUPS);
num_cpus = num_online_cpus(); num_cpus = num_online_cpus();
num_queue_groups = min(num_cpus, ctrl_info->max_msix_vectors); num_queue_groups = min(num_cpus, ctrl_info->max_msix_vectors);
num_queue_groups = min(num_queue_groups, max_queue_groups); num_queue_groups = min(num_queue_groups, max_queue_groups);
}
ctrl_info->num_queue_groups = num_queue_groups; ctrl_info->num_queue_groups = num_queue_groups;
ctrl_info->max_hw_queue_index = num_queue_groups - 1; ctrl_info->max_hw_queue_index = num_queue_groups - 1;
...@@ -5827,9 +5836,17 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info) ...@@ -5827,9 +5836,17 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info)
return rc; return rc;
} }
if (ctrl_info->max_outstanding_requests > PQI_MAX_OUTSTANDING_REQUESTS) if (reset_devices) {
ctrl_info->max_outstanding_requests = if (ctrl_info->max_outstanding_requests >
PQI_MAX_OUTSTANDING_REQUESTS; PQI_MAX_OUTSTANDING_REQUESTS_KDUMP)
ctrl_info->max_outstanding_requests =
PQI_MAX_OUTSTANDING_REQUESTS_KDUMP;
} else {
if (ctrl_info->max_outstanding_requests >
PQI_MAX_OUTSTANDING_REQUESTS)
ctrl_info->max_outstanding_requests =
PQI_MAX_OUTSTANDING_REQUESTS;
}
pqi_calculate_io_resources(ctrl_info); pqi_calculate_io_resources(ctrl_info);
...@@ -7110,4 +7127,6 @@ static void __attribute__((unused)) verify_structures(void) ...@@ -7110,4 +7127,6 @@ static void __attribute__((unused)) verify_structures(void)
PQI_QUEUE_ELEMENT_LENGTH_ALIGNMENT != 0); PQI_QUEUE_ELEMENT_LENGTH_ALIGNMENT != 0);
BUILD_BUG_ON(PQI_RESERVED_IO_SLOTS >= PQI_MAX_OUTSTANDING_REQUESTS); BUILD_BUG_ON(PQI_RESERVED_IO_SLOTS >= PQI_MAX_OUTSTANDING_REQUESTS);
BUILD_BUG_ON(PQI_RESERVED_IO_SLOTS >=
PQI_MAX_OUTSTANDING_REQUESTS_KDUMP);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment