Merge patch series "smartpqi updates"
Don Brace <don.brace@microchip.com> says: These patches are based on Martin Petersen's 6.19/scsi-queue tree https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git 6.19/scsi-queue This patch series includes four patches, with two main functional changes: 1. smartpqi-Add-timeout-value-to-RAID-path-requests-to-physical-devices Sets a timeout value for requests sent to physical devices via the RAID path. This prevents the controller firmware from waiting indefinitely and allows it to time out requests a few seconds before the OS issues Target Management Function (TMF) commands. The timeout value sent to the firmware is set to 3 seconds less than the OS timeout, which significantly reduces TMF invocations. 2. smartpqi-fix-Device-resources-accessed-after-device-removal Fixes a race condition during device removal by: * Checking for device removal in the reset handler and canceling any pending reset work if the device is no longer present. * Canceling outstanding TMF work items in the .sdev_destroy handler. Together, these changes eliminate races between reset operations and device removal. The other two patches: 3. smartpqi-add-new-Hurray-Data-pci-device Adds support for new Hurray Data PCI device. No functional changes. 4. smartpqi-update-driver-version-to-2.1.36-026 Updates the driver version string. No functional changes. Link: https://patch.msgid.link/20251106163823.786828-1-don.brace@microchip.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
@@ -34,11 +34,11 @@
|
||||
#define BUILD_TIMESTAMP
|
||||
#endif
|
||||
|
||||
#define DRIVER_VERSION "2.1.34-035"
|
||||
#define DRIVER_VERSION "2.1.36-026"
|
||||
#define DRIVER_MAJOR 2
|
||||
#define DRIVER_MINOR 1
|
||||
#define DRIVER_RELEASE 34
|
||||
#define DRIVER_REVISION 35
|
||||
#define DRIVER_RELEASE 36
|
||||
#define DRIVER_REVISION 26
|
||||
|
||||
#define DRIVER_NAME "Microchip SmartPQI Driver (v" \
|
||||
DRIVER_VERSION BUILD_TIMESTAMP ")"
|
||||
@@ -5555,14 +5555,25 @@ static void pqi_raid_io_complete(struct pqi_io_request *io_request,
|
||||
pqi_scsi_done(scmd);
|
||||
}
|
||||
|
||||
/*
|
||||
* Adjust the timeout value for physical devices sent to the firmware
|
||||
* by subtracting 3 seconds for timeouts greater than or equal to 8 seconds.
|
||||
*
|
||||
* This provides the firmware with additional time to attempt early recovery
|
||||
* before the OS-level timeout occurs.
|
||||
*/
|
||||
#define ADJUST_SECS_TIMEOUT_VALUE(tv) (((tv) >= 8) ? ((tv) - 3) : (tv))
|
||||
|
||||
static int pqi_raid_submit_io(struct pqi_ctrl_info *ctrl_info,
|
||||
struct pqi_scsi_dev *device, struct scsi_cmnd *scmd,
|
||||
struct pqi_queue_group *queue_group, bool io_high_prio)
|
||||
{
|
||||
int rc;
|
||||
u32 timeout;
|
||||
size_t cdb_length;
|
||||
struct pqi_io_request *io_request;
|
||||
struct pqi_raid_path_request *request;
|
||||
struct request *rq;
|
||||
|
||||
io_request = pqi_alloc_io_request(ctrl_info, scmd);
|
||||
if (!io_request)
|
||||
@@ -5634,6 +5645,12 @@ static int pqi_raid_submit_io(struct pqi_ctrl_info *ctrl_info,
|
||||
return SCSI_MLQUEUE_HOST_BUSY;
|
||||
}
|
||||
|
||||
if (device->is_physical_device) {
|
||||
rq = scsi_cmd_to_rq(scmd);
|
||||
timeout = rq->timeout / HZ;
|
||||
put_unaligned_le32(ADJUST_SECS_TIMEOUT_VALUE(timeout), &request->timeout);
|
||||
}
|
||||
|
||||
pqi_start_io(ctrl_info, queue_group, RAID_PATH, io_request);
|
||||
|
||||
return 0;
|
||||
@@ -6410,10 +6427,22 @@ static int pqi_device_reset(struct pqi_ctrl_info *ctrl_info, struct pqi_scsi_dev
|
||||
|
||||
static int pqi_device_reset_handler(struct pqi_ctrl_info *ctrl_info, struct pqi_scsi_dev *device, u8 lun, struct scsi_cmnd *scmd, u8 scsi_opcode)
|
||||
{
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
mutex_lock(&ctrl_info->lun_reset_mutex);
|
||||
|
||||
spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
|
||||
if (pqi_find_scsi_dev(ctrl_info, device->bus, device->target, device->lun) == NULL) {
|
||||
dev_warn(&ctrl_info->pci_dev->dev,
|
||||
"skipping reset of scsi %d:%d:%d:%u, device has been removed\n",
|
||||
ctrl_info->scsi_host->host_no, device->bus, device->target, device->lun);
|
||||
spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
|
||||
mutex_unlock(&ctrl_info->lun_reset_mutex);
|
||||
return 0;
|
||||
}
|
||||
spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
|
||||
|
||||
dev_err(&ctrl_info->pci_dev->dev,
|
||||
"resetting scsi %d:%d:%d:%u SCSI cmd at %p due to cmd opcode 0x%02x\n",
|
||||
ctrl_info->scsi_host->host_no, device->bus, device->target, lun, scmd, scsi_opcode);
|
||||
@@ -6594,7 +6623,9 @@ static void pqi_sdev_destroy(struct scsi_device *sdev)
|
||||
{
|
||||
struct pqi_ctrl_info *ctrl_info;
|
||||
struct pqi_scsi_dev *device;
|
||||
struct pqi_tmf_work *tmf_work;
|
||||
int mutex_acquired;
|
||||
unsigned int lun;
|
||||
unsigned long flags;
|
||||
|
||||
ctrl_info = shost_to_hba(sdev->host);
|
||||
@@ -6621,8 +6652,13 @@ static void pqi_sdev_destroy(struct scsi_device *sdev)
|
||||
|
||||
mutex_unlock(&ctrl_info->scan_mutex);
|
||||
|
||||
for (lun = 0, tmf_work = device->tmf_work; lun < PQI_MAX_LUNS_PER_DEVICE; lun++, tmf_work++)
|
||||
cancel_work_sync(&tmf_work->work_struct);
|
||||
|
||||
mutex_lock(&ctrl_info->lun_reset_mutex);
|
||||
pqi_dev_info(ctrl_info, "removed", device);
|
||||
pqi_free_device(device);
|
||||
mutex_unlock(&ctrl_info->lun_reset_mutex);
|
||||
}
|
||||
|
||||
static int pqi_getpciinfo_ioctl(struct pqi_ctrl_info *ctrl_info, void __user *arg)
|
||||
@@ -10109,6 +10145,10 @@ static const struct pci_device_id pqi_pci_id_table[] = {
|
||||
PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
|
||||
0x207d, 0x4240)
|
||||
},
|
||||
{
|
||||
PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
|
||||
0x207d, 0x4840)
|
||||
},
|
||||
{
|
||||
PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
|
||||
PCI_VENDOR_ID_ADVANTECH, 0x8312)
|
||||
|
||||
Reference in New Issue
Block a user