scsi: mpi3mr: Switch to using ->device_configure
authorChristoph Hellwig <hch@lst.de>
Wed, 10 Apr 2024 04:27:59 +0000 (06:27 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 12 Apr 2024 01:37:50 +0000 (21:37 -0400)
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>
drivers/scsi/mpi3mr/mpi3mr_os.c

index 5f975e0db38831328e48798c265318def3d0b6bc..71f2c62db1117465dad2489e13f4afb261113aee 100644 (file)
@@ -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,