scsi: mpi3mr: Switch to using ->device_configure
Switch to the ->device_configure method instead of ->slave_configure and update the block limits on the passed in queue_limits instead of using the per-limit accessors. Note that mpi3mr also updates the limits from an event handler that iterates all SCSI devices. This is also updated to use the queue_limits, but the complete locking of this path probably means it already is completely broken and needs a proper audit. Signed-off-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20240410042759.GA2637@lst.de Reviewed-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
a25a9c85d1
commit
310887f688
@ -986,6 +986,25 @@ static int mpi3mr_change_queue_depth(struct scsi_device *sdev,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void mpi3mr_configure_nvme_dev(struct mpi3mr_tgt_dev *tgt_dev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
u8 pgsz = tgt_dev->dev_spec.pcie_inf.pgsz ? : MPI3MR_DEFAULT_PGSZEXP;
|
||||
|
||||
lim->max_hw_sectors = tgt_dev->dev_spec.pcie_inf.mdts / 512;
|
||||
lim->virt_boundary_mask = (1 << pgsz) - 1;
|
||||
}
|
||||
|
||||
static void mpi3mr_configure_tgt_dev(struct mpi3mr_tgt_dev *tgt_dev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
if (tgt_dev->dev_type == MPI3_DEVICE_DEVFORM_PCIE &&
|
||||
(tgt_dev->dev_spec.pcie_inf.dev_info &
|
||||
MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_MASK) ==
|
||||
MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_NVME_DEVICE)
|
||||
mpi3mr_configure_nvme_dev(tgt_dev, lim);
|
||||
}
|
||||
|
||||
/**
|
||||
* mpi3mr_update_sdev - Update SCSI device information
|
||||
* @sdev: SCSI device reference
|
||||
@ -1001,31 +1020,17 @@ static void
|
||||
mpi3mr_update_sdev(struct scsi_device *sdev, void *data)
|
||||
{
|
||||
struct mpi3mr_tgt_dev *tgtdev;
|
||||
struct queue_limits lim;
|
||||
|
||||
tgtdev = (struct mpi3mr_tgt_dev *)data;
|
||||
if (!tgtdev)
|
||||
return;
|
||||
|
||||
mpi3mr_change_queue_depth(sdev, tgtdev->q_depth);
|
||||
switch (tgtdev->dev_type) {
|
||||
case MPI3_DEVICE_DEVFORM_PCIE:
|
||||
/*The block layer hw sector size = 512*/
|
||||
if ((tgtdev->dev_spec.pcie_inf.dev_info &
|
||||
MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_MASK) ==
|
||||
MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_NVME_DEVICE) {
|
||||
blk_queue_max_hw_sectors(sdev->request_queue,
|
||||
tgtdev->dev_spec.pcie_inf.mdts / 512);
|
||||
if (tgtdev->dev_spec.pcie_inf.pgsz == 0)
|
||||
blk_queue_virt_boundary(sdev->request_queue,
|
||||
((1 << MPI3MR_DEFAULT_PGSZEXP) - 1));
|
||||
else
|
||||
blk_queue_virt_boundary(sdev->request_queue,
|
||||
((1 << tgtdev->dev_spec.pcie_inf.pgsz) - 1));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
lim = queue_limits_start_update(sdev->request_queue);
|
||||
mpi3mr_configure_tgt_dev(tgtdev, &lim);
|
||||
WARN_ON_ONCE(queue_limits_commit_update(sdev->request_queue, &lim));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -4393,15 +4398,17 @@ static void mpi3mr_target_destroy(struct scsi_target *starget)
|
||||
}
|
||||
|
||||
/**
|
||||
* mpi3mr_slave_configure - Slave configure callback handler
|
||||
* mpi3mr_device_configure - Slave configure callback handler
|
||||
* @sdev: SCSI device reference
|
||||
* @lim: queue limits
|
||||
*
|
||||
* Configure queue depth, max hardware sectors and virt boundary
|
||||
* as required
|
||||
*
|
||||
* Return: 0 always.
|
||||
*/
|
||||
static int mpi3mr_slave_configure(struct scsi_device *sdev)
|
||||
static int mpi3mr_device_configure(struct scsi_device *sdev,
|
||||
struct queue_limits *lim)
|
||||
{
|
||||
struct scsi_target *starget;
|
||||
struct Scsi_Host *shost;
|
||||
@ -4432,28 +4439,8 @@ static int mpi3mr_slave_configure(struct scsi_device *sdev)
|
||||
sdev->eh_timeout = MPI3MR_EH_SCMD_TIMEOUT;
|
||||
blk_queue_rq_timeout(sdev->request_queue, MPI3MR_SCMD_TIMEOUT);
|
||||
|
||||
switch (tgt_dev->dev_type) {
|
||||
case MPI3_DEVICE_DEVFORM_PCIE:
|
||||
/*The block layer hw sector size = 512*/
|
||||
if ((tgt_dev->dev_spec.pcie_inf.dev_info &
|
||||
MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_MASK) ==
|
||||
MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_NVME_DEVICE) {
|
||||
blk_queue_max_hw_sectors(sdev->request_queue,
|
||||
tgt_dev->dev_spec.pcie_inf.mdts / 512);
|
||||
if (tgt_dev->dev_spec.pcie_inf.pgsz == 0)
|
||||
blk_queue_virt_boundary(sdev->request_queue,
|
||||
((1 << MPI3MR_DEFAULT_PGSZEXP) - 1));
|
||||
else
|
||||
blk_queue_virt_boundary(sdev->request_queue,
|
||||
((1 << tgt_dev->dev_spec.pcie_inf.pgsz) - 1));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
mpi3mr_configure_tgt_dev(tgt_dev, lim);
|
||||
mpi3mr_tgtdev_put(tgt_dev);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -4921,7 +4908,7 @@ static const struct scsi_host_template mpi3mr_driver_template = {
|
||||
.queuecommand = mpi3mr_qcmd,
|
||||
.target_alloc = mpi3mr_target_alloc,
|
||||
.slave_alloc = mpi3mr_slave_alloc,
|
||||
.slave_configure = mpi3mr_slave_configure,
|
||||
.device_configure = mpi3mr_device_configure,
|
||||
.target_destroy = mpi3mr_target_destroy,
|
||||
.slave_destroy = mpi3mr_slave_destroy,
|
||||
.scan_finished = mpi3mr_scan_finished,
|
||||
|
Loading…
x
Reference in New Issue
Block a user