scsi: smartpqi: enhance kdump
constrain resource usage during kdump to avoid kdump failures Reviewed-by: Scott Benesh <scott.benesh@microsemi.com> Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com> Signed-off-by: Don Brace <don.brace@microsemi.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
4e8415e386
commit
d727a776d7
@ -686,8 +686,10 @@ struct pqi_config_table_heartbeat {
|
||||
__le32 heartbeat_counter;
|
||||
};
|
||||
|
||||
#define PQI_MAX_OUTSTANDING_REQUESTS ((u32)~0)
|
||||
#define PQI_MAX_TRANSFER_SIZE (4 * 1024U * 1024U)
|
||||
#define PQI_MAX_OUTSTANDING_REQUESTS ((u32)~0)
|
||||
#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
|
||||
|
||||
|
@ -4353,8 +4353,12 @@ 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;
|
||||
|
||||
max_transfer_size =
|
||||
min(ctrl_info->max_transfer_size, PQI_MAX_TRANSFER_SIZE);
|
||||
if (reset_devices)
|
||||
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;
|
||||
|
||||
@ -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)
|
||||
{
|
||||
int num_cpus;
|
||||
int max_queue_groups;
|
||||
int num_queue_groups;
|
||||
u16 num_elements_per_iq;
|
||||
u16 num_elements_per_oq;
|
||||
|
||||
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);
|
||||
if (reset_devices) {
|
||||
num_queue_groups = 1;
|
||||
} else {
|
||||
int num_cpus;
|
||||
int max_queue_groups;
|
||||
|
||||
num_cpus = num_online_cpus();
|
||||
num_queue_groups = min(num_cpus, ctrl_info->max_msix_vectors);
|
||||
num_queue_groups = min(num_queue_groups, 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_queue_groups = min(num_cpus, ctrl_info->max_msix_vectors);
|
||||
num_queue_groups = min(num_queue_groups, max_queue_groups);
|
||||
}
|
||||
|
||||
ctrl_info->num_queue_groups = num_queue_groups;
|
||||
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)
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (ctrl_info->max_outstanding_requests > PQI_MAX_OUTSTANDING_REQUESTS)
|
||||
ctrl_info->max_outstanding_requests =
|
||||
PQI_MAX_OUTSTANDING_REQUESTS;
|
||||
if (reset_devices) {
|
||||
if (ctrl_info->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);
|
||||
|
||||
@ -7110,4 +7127,6 @@ static void __attribute__((unused)) verify_structures(void)
|
||||
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_KDUMP);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user