[PATCH 23/23] block: remove now unused queue limits helpers

2024-03-24 Thread Christoph Hellwig
Signed-off-by: Christoph Hellwig 
---
 block/blk-settings.c   | 245 -
 drivers/s390/block/dasd_eckd.c |   6 +-
 include/linux/blkdev.h |  13 --
 include/linux/mmc/host.h   |   4 +-
 4 files changed, 5 insertions(+), 263 deletions(-)

diff --git a/block/blk-settings.c b/block/blk-settings.c
index cdbaef159c4bc3..57cd1660815ec2 100644
--- a/block/blk-settings.c
+++ b/block/blk-settings.c
@@ -283,72 +283,6 @@ int queue_limits_set(struct request_queue *q, struct 
queue_limits *lim)
 }
 EXPORT_SYMBOL_GPL(queue_limits_set);
 
-/**
- * blk_queue_bounce_limit - set bounce buffer limit for queue
- * @q: the request queue for the device
- * @bounce: bounce limit to enforce
- *
- * Description:
- *Force bouncing for ISA DMA ranges or highmem.
- *
- *DEPRECATED, don't use in new code.
- **/
-void blk_queue_bounce_limit(struct request_queue *q, enum blk_bounce bounce)
-{
-   q->limits.bounce = bounce;
-}
-EXPORT_SYMBOL(blk_queue_bounce_limit);
-
-/**
- * blk_queue_max_hw_sectors - set max sectors for a request for this queue
- * @q:  the request queue for the device
- * @max_hw_sectors:  max hardware sectors in the usual 512b unit
- *
- * Description:
- *Enables a low level driver to set a hard upper limit,
- *max_hw_sectors, on the size of requests.  max_hw_sectors is set by
- *the device driver based upon the capabilities of the I/O
- *controller.
- *
- *max_dev_sectors is a hard limit imposed by the storage device for
- *READ/WRITE requests. It is set by the disk driver.
- *
- *max_sectors is a soft limit imposed by the block layer for
- *filesystem type requests.  This value can be overridden on a
- *per-device basis in /sys/block//queue/max_sectors_kb.
- *The soft limit can not exceed max_hw_sectors.
- **/
-void blk_queue_max_hw_sectors(struct request_queue *q, unsigned int 
max_hw_sectors)
-{
-   struct queue_limits *limits = >limits;
-   unsigned int max_sectors;
-
-   if ((max_hw_sectors << 9) < PAGE_SIZE) {
-   max_hw_sectors = 1 << (PAGE_SHIFT - 9);
-   pr_info("%s: set to minimum %u\n", __func__, max_hw_sectors);
-   }
-
-   max_hw_sectors = round_down(max_hw_sectors,
-   limits->logical_block_size >> SECTOR_SHIFT);
-   limits->max_hw_sectors = max_hw_sectors;
-
-   max_sectors = min_not_zero(max_hw_sectors, limits->max_dev_sectors);
-
-   if (limits->max_user_sectors)
-   max_sectors = min(max_sectors, limits->max_user_sectors);
-   else
-   max_sectors = min(max_sectors, BLK_DEF_MAX_SECTORS_CAP);
-
-   max_sectors = round_down(max_sectors,
-limits->logical_block_size >> SECTOR_SHIFT);
-   limits->max_sectors = max_sectors;
-
-   if (!q->disk)
-   return;
-   q->disk->bdi->io_pages = max_sectors >> (PAGE_SHIFT - 9);
-}
-EXPORT_SYMBOL(blk_queue_max_hw_sectors);
-
 /**
  * blk_queue_chunk_sectors - set size of the chunk for this queue
  * @q:  the request queue for the device
@@ -435,65 +369,6 @@ void blk_queue_max_zone_append_sectors(struct 
request_queue *q,
 }
 EXPORT_SYMBOL_GPL(blk_queue_max_zone_append_sectors);
 
-/**
- * blk_queue_max_segments - set max hw segments for a request for this queue
- * @q:  the request queue for the device
- * @max_segments:  max number of segments
- *
- * Description:
- *Enables a low level driver to set an upper limit on the number of
- *hw data segments in a request.
- **/
-void blk_queue_max_segments(struct request_queue *q, unsigned short 
max_segments)
-{
-   if (!max_segments) {
-   max_segments = 1;
-   pr_info("%s: set to minimum %u\n", __func__, max_segments);
-   }
-
-   q->limits.max_segments = max_segments;
-}
-EXPORT_SYMBOL(blk_queue_max_segments);
-
-/**
- * blk_queue_max_discard_segments - set max segments for discard requests
- * @q:  the request queue for the device
- * @max_segments:  max number of segments
- *
- * Description:
- *Enables a low level driver to set an upper limit on the number of
- *segments in a discard request.
- **/
-void blk_queue_max_discard_segments(struct request_queue *q,
-   unsigned short max_segments)
-{
-   q->limits.max_discard_segments = max_segments;
-}
-EXPORT_SYMBOL_GPL(blk_queue_max_discard_segments);
-
-/**
- * blk_queue_max_segment_size - set max segment size for blk_rq_map_sg
- * @q:  the request queue for the device
- * @max_size:  max size of segment in bytes
- *
- * Description:
- *Enables a low level driver to set an upper limit on the size of a
- *coalesced segment
- **/
-void blk_queue_max_segment_size(struct request_queue *q, unsigned int max_size)
-{
-   if (max_size < PAGE_SIZE) {
-   max_size = PAGE_SIZE;
-   pr_info("%s: set to minimum %u\n", __func__, max_size);
-   }
-
-   /* see blk_queue_virt_boundary() for the 

[PATCH 22/23] uas: switch to using ->device_configure to configure queue limits

2024-03-24 Thread Christoph Hellwig
Switch to the ->device_configure method instead of ->slave_alloc
and update the block limits on the passed in queue_limits instead
of using the per-limit accessors.

Note that uas was the only driver setting these size limits from
->slave_alloc and not ->slave_configure and this makes it match
everyone else.

Signed-off-by: Christoph Hellwig 
---
 drivers/usb/storage/uas.c | 16 
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index 0668182e1c469c..738c183ccada8d 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -823,19 +823,19 @@ static int uas_slave_alloc(struct scsi_device *sdev)
(struct uas_dev_info *)sdev->host->hostdata;
 
sdev->hostdata = devinfo;
-
-   if (devinfo->flags & US_FL_MAX_SECTORS_64)
-   blk_queue_max_hw_sectors(sdev->request_queue, 64);
-   else if (devinfo->flags & US_FL_MAX_SECTORS_240)
-   blk_queue_max_hw_sectors(sdev->request_queue, 240);
-
return 0;
 }
 
-static int uas_slave_configure(struct scsi_device *sdev)
+static int uas_device_configure(struct scsi_device *sdev,
+   struct queue_limits *lim)
 {
struct uas_dev_info *devinfo = sdev->hostdata;
 
+   if (devinfo->flags & US_FL_MAX_SECTORS_64)
+   lim->max_hw_sectors = 64;
+   else if (devinfo->flags & US_FL_MAX_SECTORS_240)
+   lim->max_hw_sectors = 240;
+
if (devinfo->flags & US_FL_NO_REPORT_OPCODES)
sdev->no_report_opcodes = 1;
 
@@ -900,7 +900,7 @@ static const struct scsi_host_template uas_host_template = {
.queuecommand = uas_queuecommand,
.target_alloc = uas_target_alloc,
.slave_alloc = uas_slave_alloc,
-   .slave_configure = uas_slave_configure,
+   .device_configure = uas_device_configure,
.eh_abort_handler = uas_eh_abort_handler,
.eh_device_reset_handler = uas_eh_device_reset_handler,
.this_id = -1,
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-23-hch%40lst.de.


[PATCH 21/23] mpi3mr: switch to using ->device_configure

2024-03-24 Thread Christoph Hellwig
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 
---
 drivers/scsi/mpi3mr/mpi3mr.h|  1 -
 drivers/scsi/mpi3mr/mpi3mr_os.c | 76 ++---
 2 files changed, 31 insertions(+), 46 deletions(-)

diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h
index 3de1ee05c44e4c..565d6047f68cb8 100644
--- a/drivers/scsi/mpi3mr/mpi3mr.h
+++ b/drivers/scsi/mpi3mr/mpi3mr.h
@@ -1348,7 +1348,6 @@ void mpi3mr_wait_for_host_io(struct mpi3mr_ioc *mrioc, 
u32 timeout);
 void mpi3mr_cleanup_fwevt_list(struct mpi3mr_ioc *mrioc);
 void mpi3mr_flush_host_io(struct mpi3mr_ioc *mrioc);
 void mpi3mr_invalidate_devhandles(struct mpi3mr_ioc *mrioc);
-void mpi3mr_rfresh_tgtdevs(struct mpi3mr_ioc *mrioc);
 void mpi3mr_flush_delayed_cmd_lists(struct mpi3mr_ioc *mrioc);
 void mpi3mr_check_rh_fault_ioc(struct mpi3mr_ioc *mrioc, u32 reason_code);
 void mpi3mr_print_fault_info(struct mpi3mr_ioc *mrioc);
diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c
index 73c831a97d276a..de3e02446c6814 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_os.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_os.c
@@ -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, );
+   WARN_ON_ONCE(queue_limits_commit_update(sdev->request_queue, ));
 }
 
 /**
@@ -1038,8 +1043,7 @@ mpi3mr_update_sdev(struct scsi_device *sdev, void *data)
  *
  * Return: Nothing.
  */
-
-void mpi3mr_rfresh_tgtdevs(struct mpi3mr_ioc *mrioc)
+static void mpi3mr_rfresh_tgtdevs(struct mpi3mr_ioc *mrioc)
 {
struct mpi3mr_tgt_dev *tgtdev, *tgtdev_next;
struct mpi3mr_stgt_priv_data *tgt_priv;
@@ -4393,15 +4397,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 +4438,8 @@ static int mpi3mr_slave_configure(struct scsi_device 
*sdev)
 

[PATCH 20/23] libata: switch to using ->device_configure

2024-03-24 Thread Christoph Hellwig
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.

Signed-off-by: Christoph Hellwig 
---
 drivers/ata/ahci.h |  2 +-
 drivers/ata/libata-sata.c  | 10 ++
 drivers/ata/libata-scsi.c  | 19 +++
 drivers/ata/libata.h   |  3 ++-
 drivers/ata/pata_macio.c   |  2 +-
 drivers/ata/sata_mv.c  |  2 +-
 drivers/ata/sata_nv.c  |  4 ++--
 drivers/ata/sata_sil24.c   |  2 +-
 drivers/scsi/aic94xx/aic94xx_init.c|  2 +-
 drivers/scsi/hisi_sas/hisi_sas.h   |  3 ++-
 drivers/scsi/hisi_sas/hisi_sas_main.c  |  7 ---
 drivers/scsi/hisi_sas/hisi_sas_v1_hw.c |  2 +-
 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c |  2 +-
 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c |  7 ---
 drivers/scsi/isci/init.c   |  2 +-
 drivers/scsi/libsas/sas_scsi_host.c|  7 ---
 drivers/scsi/mvsas/mv_init.c   |  2 +-
 drivers/scsi/pm8001/pm8001_init.c  |  2 +-
 include/linux/libata.h | 10 ++
 include/scsi/libsas.h  |  3 ++-
 20 files changed, 53 insertions(+), 40 deletions(-)

diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h
index 344c87210d8fe4..8f40f75ba08cff 100644
--- a/drivers/ata/ahci.h
+++ b/drivers/ata/ahci.h
@@ -397,7 +397,7 @@ extern const struct attribute_group *ahci_sdev_groups[];
.sdev_groups= ahci_sdev_groups, \
.change_queue_depth = ata_scsi_change_queue_depth,  \
.tag_alloc_policy   = BLK_TAG_ALLOC_RR, \
-   .slave_configure= ata_scsi_slave_config
+   .device_configure   = ata_scsi_device_configure
 
 extern struct ata_port_operations ahci_ops;
 extern struct ata_port_operations ahci_platform_ops;
diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
index 0fb1934875f208..98780d3b2f1c1a 100644
--- a/drivers/ata/libata-sata.c
+++ b/drivers/ata/libata-sata.c
@@ -1170,21 +1170,23 @@ void ata_sas_tport_delete(struct ata_port *ap)
 EXPORT_SYMBOL_GPL(ata_sas_tport_delete);
 
 /**
- * ata_sas_slave_configure - Default slave_config routine for libata 
devices
+ * ata_sas_device_configure - Default slave_config routine for libata 
devices
  * @sdev: SCSI device to configure
+ * @lim: queue limits
  * @ap: ATA port to which SCSI device is attached
  *
  * RETURNS:
  * Zero.
  */
 
-int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap)
+int ata_sas_device_configure(struct scsi_device *sdev, struct queue_limits 
*lim,
+   struct ata_port *ap)
 {
ata_scsi_sdev_config(sdev);
 
-   return ata_scsi_dev_config(sdev, ap->link.device);
+   return ata_scsi_dev_config(sdev, lim, ap->link.device);
 }
-EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
+EXPORT_SYMBOL_GPL(ata_sas_device_configure);
 
 /**
  * ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 0a0f483124c3a5..db441815d63306 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -1021,7 +1021,8 @@ bool ata_scsi_dma_need_drain(struct request *rq)
 }
 EXPORT_SYMBOL_GPL(ata_scsi_dma_need_drain);
 
-int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev)
+int ata_scsi_dev_config(struct scsi_device *sdev, struct queue_limits *lim,
+   struct ata_device *dev)
 {
struct request_queue *q = sdev->request_queue;
int depth = 1;
@@ -1031,7 +1032,7 @@ int ata_scsi_dev_config(struct scsi_device *sdev, struct 
ata_device *dev)
 
/* configure max sectors */
dev->max_sectors = min(dev->max_sectors, sdev->host->max_sectors);
-   blk_queue_max_hw_sectors(q, dev->max_sectors);
+   lim->max_hw_sectors = dev->max_sectors;
 
if (dev->class == ATA_DEV_ATAPI) {
sdev->sector_size = ATA_SECT_SIZE;
@@ -1040,7 +1041,7 @@ int ata_scsi_dev_config(struct scsi_device *sdev, struct 
ata_device *dev)
blk_queue_update_dma_pad(q, ATA_DMA_PAD_SZ - 1);
 
/* make room for appending the drain */
-   blk_queue_max_segments(q, queue_max_segments(q) - 1);
+   lim->max_segments--;
 
sdev->dma_drain_len = ATAPI_MAX_DRAIN;
sdev->dma_drain_buf = kmalloc(sdev->dma_drain_len, GFP_NOIO);
@@ -1077,7 +1078,7 @@ int ata_scsi_dev_config(struct scsi_device *sdev, struct 
ata_device *dev)
"sector_size=%u > PAGE_SIZE, PIO may malfunction\n",
sdev->sector_size);
 
-   blk_queue_update_dma_alignment(q, sdev->sector_size - 1);
+   lim->dma_alignment = sdev->sector_size - 1;
 
if (dev->flags & ATA_DFLAG_AN)
set_bit(SDEV_EVT_MEDIA_CHANGE, sdev->supported_events);
@@ -1131,8 

[PATCH 19/23] pata_macio: switch to using ->device_configure

2024-03-24 Thread Christoph Hellwig
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.

Signed-off-by: Christoph Hellwig 
---
 drivers/ata/pata_macio.c | 9 +
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/ata/pata_macio.c b/drivers/ata/pata_macio.c
index 4ac854f6b05777..f046bfa5c6e7f6 100644
--- a/drivers/ata/pata_macio.c
+++ b/drivers/ata/pata_macio.c
@@ -796,7 +796,8 @@ static void pata_macio_reset_hw(struct pata_macio_priv 
*priv, int resume)
 /* Hook the standard slave config to fixup some HW related alignment
  * restrictions
  */
-static int pata_macio_slave_config(struct scsi_device *sdev)
+static int pata_macio_device_configure(struct scsi_device *sdev,
+   struct queue_limits *lim)
 {
struct ata_port *ap = ata_shost_to_port(sdev->host);
struct pata_macio_priv *priv = ap->private_data;
@@ -814,7 +815,7 @@ static int pata_macio_slave_config(struct scsi_device *sdev)
 
/* OHare has issues with non cache aligned DMA on some chipsets */
if (priv->kind == controller_ohare) {
-   blk_queue_update_dma_alignment(sdev->request_queue, 31);
+   lim->dma_alignment = 31;
blk_queue_update_dma_pad(sdev->request_queue, 31);
 
/* Tell the world about it */
@@ -829,7 +830,7 @@ static int pata_macio_slave_config(struct scsi_device *sdev)
/* Shasta and K2 seem to have "issues" with reads ... */
if (priv->kind == controller_sh_ata6 || priv->kind == 
controller_k2_ata6) {
/* Allright these are bad, apply restrictions */
-   blk_queue_update_dma_alignment(sdev->request_queue, 15);
+   lim->dma_alignment = 15;
blk_queue_update_dma_pad(sdev->request_queue, 15);
 
/* We enable MWI and hack cache line size directly here, this
@@ -918,7 +919,7 @@ static const struct scsi_host_template pata_macio_sht = {
 * use 64K minus 256
 */
.max_segment_size   = MAX_DBDMA_SEG,
-   .slave_configure= pata_macio_slave_config,
+   .device_configure   = pata_macio_device_configure,
.sdev_groups= ata_common_sdev_groups,
.can_queue  = ATA_DEF_QUEUE,
.tag_alloc_policy   = BLK_TAG_ALLOC_RR,
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-20-hch%40lst.de.


[PATCH 18/23] sata_nv: switch to using ->device_configure

2024-03-24 Thread Christoph Hellwig
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.

Signed-off-by: Christoph Hellwig 
---
 drivers/ata/sata_nv.c | 20 
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
index 0a0cee755bde73..d0a8eb0e8011d0 100644
--- a/drivers/ata/sata_nv.c
+++ b/drivers/ata/sata_nv.c
@@ -296,7 +296,8 @@ static void nv_nf2_freeze(struct ata_port *ap);
 static void nv_nf2_thaw(struct ata_port *ap);
 static void nv_ck804_freeze(struct ata_port *ap);
 static void nv_ck804_thaw(struct ata_port *ap);
-static int nv_adma_slave_config(struct scsi_device *sdev);
+static int nv_adma_device_configure(struct scsi_device *sdev,
+   struct queue_limits *lim);
 static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc);
 static enum ata_completion_errors nv_adma_qc_prep(struct ata_queued_cmd *qc);
 static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc);
@@ -318,7 +319,8 @@ static void nv_adma_tf_read(struct ata_port *ap, struct 
ata_taskfile *tf);
 static void nv_mcp55_thaw(struct ata_port *ap);
 static void nv_mcp55_freeze(struct ata_port *ap);
 static void nv_swncq_error_handler(struct ata_port *ap);
-static int nv_swncq_slave_config(struct scsi_device *sdev);
+static int nv_swncq_device_configure(struct scsi_device *sdev,
+   struct queue_limits *lim);
 static int nv_swncq_port_start(struct ata_port *ap);
 static enum ata_completion_errors nv_swncq_qc_prep(struct ata_queued_cmd *qc);
 static void nv_swncq_fill_sg(struct ata_queued_cmd *qc);
@@ -380,7 +382,7 @@ static const struct scsi_host_template nv_adma_sht = {
.can_queue  = NV_ADMA_MAX_CPBS,
.sg_tablesize   = NV_ADMA_SGTBL_TOTAL_LEN,
.dma_boundary   = NV_ADMA_DMA_BOUNDARY,
-   .slave_configure= nv_adma_slave_config,
+   .device_configure   = nv_adma_device_configure,
.sdev_groups= ata_ncq_sdev_groups,
.change_queue_depth = ata_scsi_change_queue_depth,
.tag_alloc_policy   = BLK_TAG_ALLOC_RR,
@@ -391,7 +393,7 @@ static const struct scsi_host_template nv_swncq_sht = {
.can_queue  = ATA_MAX_QUEUE - 1,
.sg_tablesize   = LIBATA_MAX_PRD,
.dma_boundary   = ATA_DMA_BOUNDARY,
-   .slave_configure= nv_swncq_slave_config,
+   .device_configure   = nv_swncq_device_configure,
.sdev_groups= ata_ncq_sdev_groups,
.change_queue_depth = ata_scsi_change_queue_depth,
.tag_alloc_policy   = BLK_TAG_ALLOC_RR,
@@ -661,7 +663,8 @@ static void nv_adma_mode(struct ata_port *ap)
pp->flags &= ~NV_ADMA_PORT_REGISTER_MODE;
 }
 
-static int nv_adma_slave_config(struct scsi_device *sdev)
+static int nv_adma_device_configure(struct scsi_device *sdev,
+   struct queue_limits *lim)
 {
struct ata_port *ap = ata_shost_to_port(sdev->host);
struct nv_adma_port_priv *pp = ap->private_data;
@@ -740,8 +743,8 @@ static int nv_adma_slave_config(struct scsi_device *sdev)
rc = dma_set_mask(>dev, pp->adma_dma_mask);
}
 
-   blk_queue_segment_boundary(sdev->request_queue, segment_boundary);
-   blk_queue_max_segments(sdev->request_queue, sg_tablesize);
+   lim->seg_boundary_mask = segment_boundary;
+   lim->max_segments = sg_tablesize;
ata_port_info(ap,
  "DMA mask 0x%llX, segment boundary 0x%lX, hw segs %hu\n",
  (unsigned long long)*ap->host->dev->dma_mask,
@@ -1868,7 +1871,8 @@ static void nv_swncq_host_init(struct ata_host *host)
writel(~0x0, mmio + NV_INT_STATUS_MCP55);
 }
 
-static int nv_swncq_slave_config(struct scsi_device *sdev)
+static int nv_swncq_device_configure(struct scsi_device *sdev,
+   struct queue_limits *lim)
 {
struct ata_port *ap = ata_shost_to_port(sdev->host);
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-19-hch%40lst.de.


[PATCH 17/23] usb-storage: switch to using ->device_configure

2024-03-24 Thread Christoph Hellwig
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.

Also use the proper atomic queue limit update helpers and freeze the
queue when updating max_hw_sectors from sysfs.

Signed-off-by: Christoph Hellwig 
---
 drivers/usb/storage/scsiglue.c | 36 --
 1 file changed, 21 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
index eb4ba03e082d89..b31464740f6c86 100644
--- a/drivers/usb/storage/scsiglue.c
+++ b/drivers/usb/storage/scsiglue.c
@@ -82,7 +82,7 @@ static int slave_alloc (struct scsi_device *sdev)
return 0;
 }
 
-static int slave_configure(struct scsi_device *sdev)
+static int device_configure(struct scsi_device *sdev, struct queue_limits *lim)
 {
struct us_data *us = host_to_us(sdev->host);
struct device *dev = us->pusb_dev->bus->sysdev;
@@ -97,31 +97,28 @@ static int slave_configure(struct scsi_device *sdev)
 
if (us->fflags & US_FL_MAX_SECTORS_MIN)
max_sectors = PAGE_SIZE >> 9;
-   if (queue_max_hw_sectors(sdev->request_queue) > max_sectors)
-   blk_queue_max_hw_sectors(sdev->request_queue,
- max_sectors);
+   lim->max_hw_sectors = min(lim->max_hw_sectors, max_sectors);
} else if (sdev->type == TYPE_TAPE) {
/*
 * Tapes need much higher max_sector limits, so just
 * raise it to the maximum possible (4 GB / 512) and
 * let the queue segment size sort out the real limit.
 */
-   blk_queue_max_hw_sectors(sdev->request_queue, 0x7F);
+   lim->max_hw_sectors = 0x7F;
} else if (us->pusb_dev->speed >= USB_SPEED_SUPER) {
/*
 * USB3 devices will be limited to 2048 sectors. This gives us
 * better throughput on most devices.
 */
-   blk_queue_max_hw_sectors(sdev->request_queue, 2048);
+   lim->max_hw_sectors = 2048;
}
 
/*
 * The max_hw_sectors should be up to maximum size of a mapping for
 * the device. Otherwise, a DMA API might fail on swiotlb environment.
 */
-   blk_queue_max_hw_sectors(sdev->request_queue,
-   min_t(size_t, queue_max_hw_sectors(sdev->request_queue),
- dma_max_mapping_size(dev) >> SECTOR_SHIFT));
+   lim->max_hw_sectors = min_t(size_t,
+   lim->max_hw_sectors, dma_max_mapping_size(dev) >> SECTOR_SHIFT);
 
/*
 * We can't put these settings in slave_alloc() because that gets
@@ -582,13 +579,22 @@ static ssize_t max_sectors_store(struct device *dev, 
struct device_attribute *at
size_t count)
 {
struct scsi_device *sdev = to_scsi_device(dev);
+   struct queue_limits lim;
unsigned short ms;
+   int ret;
 
-   if (sscanf(buf, "%hu", ) > 0) {
-   blk_queue_max_hw_sectors(sdev->request_queue, ms);
-   return count;
-   }
-   return -EINVAL;
+   if (sscanf(buf, "%hu", ) <= 0)
+   return -EINVAL;
+
+   blk_mq_freeze_queue(sdev->request_queue);
+   lim = queue_limits_start_update(sdev->request_queue);
+   lim.max_hw_sectors = ms;
+   ret = queue_limits_commit_update(sdev->request_queue, );
+   blk_mq_unfreeze_queue(sdev->request_queue);
+
+   if (ret)
+   return ret;
+   return count;
 }
 static DEVICE_ATTR_RW(max_sectors);
 
@@ -626,7 +632,7 @@ static const struct scsi_host_template 
usb_stor_host_template = {
.this_id =  -1,
 
.slave_alloc =  slave_alloc,
-   .slave_configure =  slave_configure,
+   .device_configure = device_configure,
.target_alloc = target_alloc,
 
/* lots of sg segments can be handled */
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-18-hch%40lst.de.


[PATCH 16/23] pmcraid: switch to using ->device_configure

2024-03-24 Thread Christoph Hellwig
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.

Signed-off-by: Christoph Hellwig 
---
 drivers/scsi/pmcraid.c | 11 ++-
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c
index e8bcc3a88732a1..0184fcbc15a9e2 100644
--- a/drivers/scsi/pmcraid.c
+++ b/drivers/scsi/pmcraid.c
@@ -195,8 +195,9 @@ static int pmcraid_slave_alloc(struct scsi_device *scsi_dev)
 }
 
 /**
- * pmcraid_slave_configure - Configures a SCSI device
+ * pmcraid_device_configure - Configures a SCSI device
  * @scsi_dev: scsi device struct
+ * @lim: queue limits
  *
  * This function is executed by SCSI mid layer just after a device is first
  * scanned (i.e. it has responded to an INQUIRY). For VSET resources, the
@@ -207,7 +208,8 @@ static int pmcraid_slave_alloc(struct scsi_device *scsi_dev)
  * Return value:
  *   0 on success
  */
-static int pmcraid_slave_configure(struct scsi_device *scsi_dev)
+static int pmcraid_device_configure(struct scsi_device *scsi_dev,
+   struct queue_limits *lim)
 {
struct pmcraid_resource_entry *res = scsi_dev->hostdata;
 
@@ -231,8 +233,7 @@ static int pmcraid_slave_configure(struct scsi_device 
*scsi_dev)
scsi_dev->allow_restart = 1;
blk_queue_rq_timeout(scsi_dev->request_queue,
 PMCRAID_VSET_IO_TIMEOUT);
-   blk_queue_max_hw_sectors(scsi_dev->request_queue,
- PMCRAID_VSET_MAX_SECTORS);
+   lim->max_hw_sectors = PMCRAID_VSET_MAX_SECTORS;
}
 
/*
@@ -3666,7 +3667,7 @@ static const struct scsi_host_template 
pmcraid_host_template = {
.eh_host_reset_handler = pmcraid_eh_host_reset_handler,
 
.slave_alloc = pmcraid_slave_alloc,
-   .slave_configure = pmcraid_slave_configure,
+   .device_configure = pmcraid_device_configure,
.slave_destroy = pmcraid_slave_destroy,
.change_queue_depth = pmcraid_change_queue_depth,
.can_queue = PMCRAID_MAX_IO_CMD,
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-17-hch%40lst.de.


[PATCH 15/23] ipr: switch to using ->device_configure

2024-03-24 Thread Christoph Hellwig
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.

Signed-off-by: Christoph Hellwig 
---
 drivers/scsi/ipr.c | 10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index 3819f7c42788bc..388c8a10295a67 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -4769,15 +4769,17 @@ static void ipr_slave_destroy(struct scsi_device *sdev)
 }
 
 /**
- * ipr_slave_configure - Configure a SCSI device
+ * ipr_device_configure - Configure a SCSI device
  * @sdev:  scsi device struct
+ * @lim:   queue limits
  *
  * This function configures the specified scsi device.
  *
  * Return value:
  * 0 on success
  **/
-static int ipr_slave_configure(struct scsi_device *sdev)
+static int ipr_device_configure(struct scsi_device *sdev,
+   struct queue_limits *lim)
 {
struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) 
sdev->host->hostdata;
struct ipr_resource_entry *res;
@@ -4798,7 +4800,7 @@ static int ipr_slave_configure(struct scsi_device *sdev)
sdev->no_report_opcodes = 1;
blk_queue_rq_timeout(sdev->request_queue,
 IPR_VSET_RW_TIMEOUT);
-   blk_queue_max_hw_sectors(sdev->request_queue, 
IPR_VSET_MAX_SECTORS);
+   lim->max_hw_sectors = IPR_VSET_MAX_SECTORS;
}
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
 
@@ -6397,7 +6399,7 @@ static const struct scsi_host_template driver_template = {
.eh_device_reset_handler = ipr_eh_dev_reset,
.eh_host_reset_handler = ipr_eh_host_reset,
.slave_alloc = ipr_slave_alloc,
-   .slave_configure = ipr_slave_configure,
+   .device_configure = ipr_device_configure,
.slave_destroy = ipr_slave_destroy,
.scan_finished = ipr_scan_finished,
.target_destroy = ipr_target_destroy,
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-16-hch%40lst.de.


[PATCH 14/23] hptiop: switch to using ->device_configure

2024-03-24 Thread Christoph Hellwig
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.

Signed-off-by: Christoph Hellwig 
---
 drivers/scsi/hptiop.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/hptiop.c b/drivers/scsi/hptiop.c
index f5334ccbf2cac3..e889f268601b4f 100644
--- a/drivers/scsi/hptiop.c
+++ b/drivers/scsi/hptiop.c
@@ -1151,11 +1151,11 @@ static struct attribute *hptiop_host_attrs[] = {
 
 ATTRIBUTE_GROUPS(hptiop_host);
 
-static int hptiop_slave_config(struct scsi_device *sdev)
+static int hptiop_device_configure(struct scsi_device *sdev,
+   struct queue_limits *lim)
 {
if (sdev->type == TYPE_TAPE)
-   blk_queue_max_hw_sectors(sdev->request_queue, 8192);
-
+   lim->max_hw_sectors = 8192;
return 0;
 }
 
@@ -1168,7 +1168,7 @@ static const struct scsi_host_template driver_template = {
.emulated   = 0,
.proc_name  = driver_name,
.shost_groups   = hptiop_host_groups,
-   .slave_configure= hptiop_slave_config,
+   .device_configure   = hptiop_device_configure,
.this_id= -1,
.change_queue_depth = hptiop_adjust_disk_queue_depth,
.cmd_size   = sizeof(struct hpt_cmd_priv),
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-15-hch%40lst.de.


[PATCH 13/23] sbp2: switch to using ->device_configure

2024-03-24 Thread Christoph Hellwig
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.

Signed-off-by: Christoph Hellwig 
---
 drivers/firewire/sbp2.c | 7 ---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c
index 8f7810b2a4c10f..827dee0f57dde2 100644
--- a/drivers/firewire/sbp2.c
+++ b/drivers/firewire/sbp2.c
@@ -1506,7 +1506,8 @@ static int sbp2_scsi_slave_alloc(struct scsi_device *sdev)
return 0;
 }
 
-static int sbp2_scsi_slave_configure(struct scsi_device *sdev)
+static int sbp2_scsi_device_configure(struct scsi_device *sdev,
+   struct queue_limits *lim)
 {
struct sbp2_logical_unit *lu = sdev->hostdata;
 
@@ -1532,7 +1533,7 @@ static int sbp2_scsi_slave_configure(struct scsi_device 
*sdev)
sdev->start_stop_pwr_cond = 1;
 
if (lu->tgt->workarounds & SBP2_WORKAROUND_128K_MAX_TRANS)
-   blk_queue_max_hw_sectors(sdev->request_queue, 128 * 1024 / 512);
+   lim->max_hw_sectors = 128 * 1024 / 512;
 
return 0;
 }
@@ -1590,7 +1591,7 @@ static const struct scsi_host_template 
scsi_driver_template = {
.proc_name  = "sbp2",
.queuecommand   = sbp2_scsi_queuecommand,
.slave_alloc= sbp2_scsi_slave_alloc,
-   .slave_configure= sbp2_scsi_slave_configure,
+   .device_configure   = sbp2_scsi_device_configure,
.eh_abort_handler   = sbp2_scsi_abort,
.this_id= -1,
.sg_tablesize   = SG_ALL,
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-14-hch%40lst.de.


[PATCH 12/23] mpt3sas: switch to using ->device_configure

2024-03-24 Thread Christoph Hellwig
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.

Signed-off-by: Christoph Hellwig 
---
 drivers/scsi/mpt3sas/mpt3sas_scsih.c | 18 --
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c 
b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index ef8ee93005eae6..89ef43a5ef862d 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -2497,14 +2497,15 @@ _scsih_enable_tlr(struct MPT3SAS_ADAPTER *ioc, struct 
scsi_device *sdev)
 }
 
 /**
- * scsih_slave_configure - device configure routine.
+ * scsih_device_configure - device configure routine.
  * @sdev: scsi device struct
+ * @lim: queue limits
  *
  * Return: 0 if ok. Any other return is assumed to be an error and
  * the device is ignored.
  */
 static int
-scsih_slave_configure(struct scsi_device *sdev)
+scsih_device_configure(struct scsi_device *sdev, struct queue_limits *lim)
 {
struct Scsi_Host *shost = sdev->host;
struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
@@ -2609,8 +2610,7 @@ scsih_slave_configure(struct scsi_device *sdev)
raid_device->num_pds, ds);
 
if (shost->max_sectors > MPT3SAS_RAID_MAX_SECTORS) {
-   blk_queue_max_hw_sectors(sdev->request_queue,
-   MPT3SAS_RAID_MAX_SECTORS);
+   lim->max_hw_sectors = MPT3SAS_RAID_MAX_SECTORS;
sdev_printk(KERN_INFO, sdev,
"Set queue's max_sector to: %u\n",
MPT3SAS_RAID_MAX_SECTORS);
@@ -2675,8 +2675,7 @@ scsih_slave_configure(struct scsi_device *sdev)
pcie_device->connector_name);
 
if (pcie_device->nvme_mdts)
-   blk_queue_max_hw_sectors(sdev->request_queue,
-   pcie_device->nvme_mdts/512);
+   lim->max_hw_sectors = pcie_device->nvme_mdts / 512;
 
pcie_device_put(pcie_device);
spin_unlock_irqrestore(>pcie_device_lock, flags);
@@ -2687,8 +2686,7 @@ scsih_slave_configure(struct scsi_device *sdev)
 **/
blk_queue_flag_set(QUEUE_FLAG_NOMERGES,
sdev->request_queue);
-   blk_queue_virt_boundary(sdev->request_queue,
-   ioc->page_size - 1);
+   lim->virt_boundary_mask = ioc->page_size - 1;
return 0;
}
 
@@ -11914,7 +11912,7 @@ static const struct scsi_host_template 
mpt2sas_driver_template = {
.queuecommand   = scsih_qcmd,
.target_alloc   = scsih_target_alloc,
.slave_alloc= scsih_slave_alloc,
-   .slave_configure= scsih_slave_configure,
+   .device_configure   = scsih_device_configure,
.target_destroy = scsih_target_destroy,
.slave_destroy  = scsih_slave_destroy,
.scan_finished  = scsih_scan_finished,
@@ -11952,7 +11950,7 @@ static const struct scsi_host_template 
mpt3sas_driver_template = {
.queuecommand   = scsih_qcmd,
.target_alloc   = scsih_target_alloc,
.slave_alloc= scsih_slave_alloc,
-   .slave_configure= scsih_slave_configure,
+   .device_configure   = scsih_device_configure,
.target_destroy = scsih_target_destroy,
.slave_destroy  = scsih_slave_destroy,
.scan_finished  = scsih_scan_finished,
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-13-hch%40lst.de.


[PATCH 11/23] megaraid_sas: switch to using ->device_configure

2024-03-24 Thread Christoph Hellwig
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.

Signed-off-by: Christoph Hellwig 
---
 drivers/scsi/megaraid/megaraid_sas.h|  2 +-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 29 -
 drivers/scsi/megaraid/megaraid_sas_fusion.c |  3 ++-
 3 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index 56624cbf7fa5e7..5680c6cdb22193 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2701,7 +2701,7 @@ int megasas_get_ctrl_info(struct megasas_instance 
*instance);
 int
 megasas_sync_pd_seq_num(struct megasas_instance *instance, bool pend);
 void megasas_set_dynamic_target_properties(struct scsi_device *sdev,
-  bool is_target_prop);
+   struct queue_limits *lim, bool is_target_prop);
 int megasas_get_target_prop(struct megasas_instance *instance,
struct scsi_device *sdev);
 void megasas_get_snapdump_properties(struct megasas_instance *instance);
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 3d4f13da1ae873..def0d905b6d9e3 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -1888,7 +1888,7 @@ static struct megasas_instance 
*megasas_lookup_instance(u16 host_no)
 * Returns void
 */
 void megasas_set_dynamic_target_properties(struct scsi_device *sdev,
-  bool is_target_prop)
+   struct queue_limits *lim, bool is_target_prop)
 {
u16 pd_index = 0, ld;
u32 device_id;
@@ -1915,8 +1915,10 @@ void megasas_set_dynamic_target_properties(struct 
scsi_device *sdev,
return;
raid = MR_LdRaidGet(ld, local_map_ptr);
 
-   if (raid->capability.ldPiMode == MR_PROT_INFO_TYPE_CONTROLLER)
-   blk_queue_update_dma_alignment(sdev->request_queue, 
0x7);
+   if (raid->capability.ldPiMode == MR_PROT_INFO_TYPE_CONTROLLER) {
+   if (lim)
+   lim->dma_alignment = 0x7;
+   }
 
mr_device_priv_data->is_tm_capable =
raid->capability.tmCapable;
@@ -1967,7 +1969,8 @@ void megasas_set_dynamic_target_properties(struct 
scsi_device *sdev,
  *
  */
 static inline void
-megasas_set_nvme_device_properties(struct scsi_device *sdev, u32 max_io_size)
+megasas_set_nvme_device_properties(struct scsi_device *sdev,
+   struct queue_limits *lim, u32 max_io_size)
 {
struct megasas_instance *instance;
u32 mr_nvme_pg_size;
@@ -1976,10 +1979,10 @@ megasas_set_nvme_device_properties(struct scsi_device 
*sdev, u32 max_io_size)
mr_nvme_pg_size = max_t(u32, instance->nvme_page_size,
MR_DEFAULT_NVME_PAGE_SIZE);
 
-   blk_queue_max_hw_sectors(sdev->request_queue, (max_io_size / 512));
+   lim->max_hw_sectors = max_io_size / 512;
+   lim->virt_boundary_mask = mr_nvme_pg_size - 1;
 
blk_queue_flag_set(QUEUE_FLAG_NOMERGES, sdev->request_queue);
-   blk_queue_virt_boundary(sdev->request_queue, mr_nvme_pg_size - 1);
 }
 
 /*
@@ -2041,7 +2044,7 @@ static void megasas_set_fw_assisted_qd(struct scsi_device 
*sdev,
  * @is_target_prop true, if fw provided target properties.
  */
 static void megasas_set_static_target_properties(struct scsi_device *sdev,
-bool is_target_prop)
+   struct queue_limits *lim, bool is_target_prop)
 {
u32 max_io_size_kb = MR_DEFAULT_NVME_MDTS_KB;
struct megasas_instance *instance;
@@ -2060,13 +2063,15 @@ static void megasas_set_static_target_properties(struct 
scsi_device *sdev,
max_io_size_kb = 
le32_to_cpu(instance->tgt_prop->max_io_size_kb);
 
if (instance->nvme_page_size && max_io_size_kb)
-   megasas_set_nvme_device_properties(sdev, (max_io_size_kb << 
10));
+   megasas_set_nvme_device_properties(sdev, lim,
+   max_io_size_kb << 10);
 
megasas_set_fw_assisted_qd(sdev, is_target_prop);
 }
 
 
-static int megasas_slave_configure(struct scsi_device *sdev)
+static int megasas_device_configure(struct scsi_device *sdev,
+   struct queue_limits *lim)
 {
u16 pd_index = 0;
struct megasas_instance *instance;
@@ -2096,10 +2101,10 @@ static int megasas_slave_configure(struct scsi_device 
*sdev)
ret_target_prop = megasas_get_target_prop(instance, sdev);
 
is_target_prop = (ret_target_prop == DCMD_SUCCESS) ? true : false;
-   megasas_set_static_target_properties(sdev, is_target_prop);
+   

[PATCH 10/23] scsi: add a device_configure method to the host template

2024-03-24 Thread Christoph Hellwig
This is a version of ->slave_configure that also takes a queue_limits
structure that the caller applies, and thus allows drivers to reconfigure
the queue using the atomic queue limits API.

In the long run it should also replace ->slave_configure entirely as
there is no need to have two different methods here, and the slave
name in addition to being politically charged also has no basis in
the SCSI standards or the kernel code.

Signed-off-by: Christoph Hellwig 
---
 drivers/scsi/scsi_scan.c | 33 +++--
 include/scsi/scsi_host.h |  4 
 2 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 699356d7d17545..8e05780f802523 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -227,7 +227,7 @@ static int scsi_realloc_sdev_budget_map(struct scsi_device 
*sdev,
 
/*
 * realloc if new shift is calculated, which is caused by setting
-* up one new default queue depth after calling ->slave_configure
+* up one new default queue depth after calling ->device_configure
 */
if (!need_alloc && new_shift != sdev->budget_map.shift)
need_alloc = need_free = true;
@@ -874,8 +874,9 @@ static int scsi_probe_lun(struct scsi_device *sdev, 
unsigned char *inq_result,
 static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
blist_flags_t *bflags, int async)
 {
+   const struct scsi_host_template *hostt = sdev->host->hostt;
struct queue_limits lim;
-   int ret;
+   int ret, ret2;
 
/*
 * XXX do not save the inquiry, since it can change underneath us,
@@ -1073,22 +1074,26 @@ static int scsi_add_lun(struct scsi_device *sdev, 
unsigned char *inq_result,
lim.max_hw_sectors = 512;
else if (*bflags & BLIST_MAX_1024)
lim.max_hw_sectors = 1024;
-   ret = queue_limits_commit_update(sdev->request_queue, );
+
+   if (hostt->device_configure)
+   ret = hostt->device_configure(sdev, );
+   else if (hostt->slave_configure)
+   ret = hostt->slave_configure(sdev);
+
+   ret2 = queue_limits_commit_update(sdev->request_queue, );
+   if (ret2 && !ret)
+   ret = ret2;
if (ret)
goto fail;
 
-   if (sdev->host->hostt->slave_configure) {
-   ret = sdev->host->hostt->slave_configure(sdev);
-   if (ret)
-   goto fail;
-
-   /*
-* The queue_depth is often changed in ->slave_configure.
-* Set up budget map again since memory consumption of
-* the map depends on actual queue depth.
-*/
+   /*
+* The queue_depth is often changed in ->device_configure.
+*
+* Set up budget map again since memory consumption of the map depends
+* on actual queue depth.
+*/
+   if (hostt->device_configure || hostt->slave_configure)
scsi_realloc_sdev_budget_map(sdev, sdev->queue_depth);
-   }
 
if (sdev->scsi_level >= SCSI_3)
scsi_attach_vpd(sdev);
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index b0948ab69e0fa6..1959193d47e7f5 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -211,7 +211,11 @@ struct scsi_host_template {
 * up after yourself before returning non-0
 *
 * Status: OPTIONAL
+*
+* Note: slave_configure is the legacy version, use device_configure for
+* all new code.
 */
+   int (* device_configure)(struct scsi_device *, struct queue_limits 
*lim);
int (* slave_configure)(struct scsi_device *);
 
/*
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-11-hch%40lst.de.


[PATCH 09/23] scsi: use the atomic queue limits API in scsi_add_lun

2024-03-24 Thread Christoph Hellwig
Switch scsi_add_lun to use the atomic queue limits API to update the
max_hw_sectors for devices with quirks.

Signed-off-by: Christoph Hellwig 
---
 drivers/scsi/scsi_scan.c | 49 
 1 file changed, 24 insertions(+), 25 deletions(-)

diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 205ab3b3ea89be..699356d7d17545 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -874,6 +874,7 @@ static int scsi_probe_lun(struct scsi_device *sdev, 
unsigned char *inq_result,
 static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
blist_flags_t *bflags, int async)
 {
+   struct queue_limits lim;
int ret;
 
/*
@@ -1004,19 +1005,6 @@ static int scsi_add_lun(struct scsi_device *sdev, 
unsigned char *inq_result,
if (*bflags & BLIST_SELECT_NO_ATN)
sdev->select_no_atn = 1;
 
-   /*
-* Maximum 512 sector transfer length
-* broken RA4x00 Compaq Disk Array
-*/
-   if (*bflags & BLIST_MAX_512)
-   blk_queue_max_hw_sectors(sdev->request_queue, 512);
-   /*
-* Max 1024 sector transfer length for targets that report incorrect
-* max/optimal lengths and relied on the old block layer safe default
-*/
-   else if (*bflags & BLIST_MAX_1024)
-   blk_queue_max_hw_sectors(sdev->request_queue, 1024);
-
/*
 * Some devices may not want to have a start command automatically
 * issued when a device is added.
@@ -1077,19 +1065,22 @@ static int scsi_add_lun(struct scsi_device *sdev, 
unsigned char *inq_result,
 
transport_configure_device(>sdev_gendev);
 
+   /*
+* No need to freeze the queue as it isn't reachable to anyone else yet.
+*/
+   lim = queue_limits_start_update(sdev->request_queue);
+   if (*bflags & BLIST_MAX_512)
+   lim.max_hw_sectors = 512;
+   else if (*bflags & BLIST_MAX_1024)
+   lim.max_hw_sectors = 1024;
+   ret = queue_limits_commit_update(sdev->request_queue, );
+   if (ret)
+   goto fail;
+
if (sdev->host->hostt->slave_configure) {
ret = sdev->host->hostt->slave_configure(sdev);
-   if (ret) {
-   /*
-* if LLDD reports slave not present, don't clutter
-* console with alloc failure messages
-*/
-   if (ret != -ENXIO) {
-   sdev_printk(KERN_ERR, sdev,
-   "failed to configure device\n");
-   }
-   return SCSI_SCAN_NO_RESPONSE;
-   }
+   if (ret)
+   goto fail;
 
/*
 * The queue_depth is often changed in ->slave_configure.
@@ -1115,8 +1106,16 @@ static int scsi_add_lun(struct scsi_device *sdev, 
unsigned char *inq_result,
 */
if (!async && scsi_sysfs_add_sdev(sdev) != 0)
return SCSI_SCAN_NO_RESPONSE;
-
return SCSI_SCAN_LUN_PRESENT;
+
+fail:
+   /*
+* If the LLDD reports LU not present, don't clutter the console with
+* alloc failure messages.
+*/
+   if (ret != -ENXIO)
+   sdev_printk(KERN_ERR, sdev, "failed to configure device\n");
+   return SCSI_SCAN_NO_RESPONSE;
 }
 
 #ifdef CONFIG_SCSI_LOGGING
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-10-hch%40lst.de.


[PATCH 08/23] ufs-exynos: move setting the the dma alignment to the init method

2024-03-24 Thread Christoph Hellwig
Use the SCSI host's dma_alignment field and set it in ->init and remove
the now unused config_scsi_dev method.

Signed-off-by: Christoph Hellwig 
---
 drivers/ufs/core/ufshcd.c | 3 ---
 drivers/ufs/host/ufs-exynos.c | 8 ++--
 include/ufs/ufshcd.h  | 1 -
 3 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index e30fd125988d7a..7d593395aeff25 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -5262,9 +5262,6 @@ static int ufshcd_slave_configure(struct scsi_device 
*sdev)
 */
sdev->silence_suspend = 1;
 
-   if (hba->vops && hba->vops->config_scsi_dev)
-   hba->vops->config_scsi_dev(sdev);
-
ufshcd_crypto_register(hba, q);
 
return 0;
diff --git a/drivers/ufs/host/ufs-exynos.c b/drivers/ufs/host/ufs-exynos.c
index 734d40f99e31e6..7ffc28e2278420 100644
--- a/drivers/ufs/host/ufs-exynos.c
+++ b/drivers/ufs/host/ufs-exynos.c
@@ -1187,6 +1187,8 @@ static int exynos_ufs_init(struct ufs_hba *hba)
goto out;
exynos_ufs_specify_phy_time_attr(ufs);
exynos_ufs_config_smu(ufs);
+
+   hba->host->dma_alignment = SZ_4K - 1;
return 0;
 
 out:
@@ -1510,11 +1512,6 @@ static int fsd_ufs_pre_link(struct exynos_ufs *ufs)
return 0;
 }
 
-static void exynos_ufs_config_scsi_dev(struct scsi_device *sdev)
-{
-   blk_queue_update_dma_alignment(sdev->request_queue, SZ_4K - 1);
-}
-
 static int fsd_ufs_post_link(struct exynos_ufs *ufs)
 {
int i;
@@ -1583,7 +1580,6 @@ static const struct ufs_hba_variant_ops 
ufs_hba_exynos_ops = {
.hibern8_notify = exynos_ufs_hibern8_notify,
.suspend= exynos_ufs_suspend,
.resume = exynos_ufs_resume,
-   .config_scsi_dev= exynos_ufs_config_scsi_dev,
 };
 
 static struct ufs_hba_variant_ops ufs_hba_exynosauto_vh_ops = {
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index cb2afcebbdf514..061919448d3936 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -373,7 +373,6 @@ struct ufs_hba_variant_ops {
int (*get_outstanding_cqs)(struct ufs_hba *hba,
   unsigned long *ocqs);
int (*config_esi)(struct ufs_hba *hba);
-   void(*config_scsi_dev)(struct scsi_device *sdev);
 };
 
 /* clock gating state  */
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-9-hch%40lst.de.


[PATCH 07/23] scsi: add a dma_alignment field to the host and host template

2024-03-24 Thread Christoph Hellwig
Get drivers out of the business of having to call the block layer
dma alignment limits helpers themselves.

Signed-off-by: Christoph Hellwig 
---
 drivers/firewire/sbp2.c   |  6 --
 drivers/message/fusion/mptfc.c|  1 +
 drivers/message/fusion/mptsas.c   |  1 +
 drivers/message/fusion/mptscsih.c |  2 --
 drivers/message/fusion/mptspi.c   |  1 +
 drivers/scsi/hosts.c  |  6 ++
 drivers/scsi/iscsi_tcp.c  |  2 +-
 drivers/scsi/qla2xxx/qla_os.c |  6 +++---
 drivers/scsi/scsi_lib.c   | 11 ++-
 drivers/staging/rts5208/rtsx.c| 24 
 drivers/usb/image/microtek.c  |  8 +---
 drivers/usb/storage/scsiglue.c| 11 +--
 drivers/usb/storage/uas.c | 13 ++---
 include/scsi/scsi_host.h  |  3 +++
 14 files changed, 42 insertions(+), 53 deletions(-)

diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c
index e779d866022b9f..8f7810b2a4c10f 100644
--- a/drivers/firewire/sbp2.c
+++ b/drivers/firewire/sbp2.c
@@ -1500,12 +1500,6 @@ static int sbp2_scsi_slave_alloc(struct scsi_device 
*sdev)
 
sdev->allow_restart = 1;
 
-   /*
-* SBP-2 does not require any alignment, but we set it anyway
-* for compatibility with earlier versions of this driver.
-*/
-   blk_queue_update_dma_alignment(sdev->request_queue, 4 - 1);
-
if (lu->tgt->workarounds & SBP2_WORKAROUND_INQUIRY_36)
sdev->inquiry_len = 36;
 
diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c
index c459f709107b7c..a3c17c4fe69c54 100644
--- a/drivers/message/fusion/mptfc.c
+++ b/drivers/message/fusion/mptfc.c
@@ -129,6 +129,7 @@ static const struct scsi_host_template 
mptfc_driver_template = {
.sg_tablesize   = MPT_SCSI_SG_DEPTH,
.max_sectors= 8192,
.cmd_per_lun= 7,
+   .dma_alignment  = 511,
.shost_groups   = mptscsih_host_attr_groups,
 };
 
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c
index 300f8e955a5319..30cb4f64e77047 100644
--- a/drivers/message/fusion/mptsas.c
+++ b/drivers/message/fusion/mptsas.c
@@ -2020,6 +2020,7 @@ static const struct scsi_host_template 
mptsas_driver_template = {
.sg_tablesize   = MPT_SCSI_SG_DEPTH,
.max_sectors= 8192,
.cmd_per_lun= 7,
+   .dma_alignment  = 511,
.shost_groups   = mptscsih_host_attr_groups,
.no_write_same  = 1,
 };
diff --git a/drivers/message/fusion/mptscsih.c 
b/drivers/message/fusion/mptscsih.c
index 9080a73b4ea64a..6c3f25cc33ff99 100644
--- a/drivers/message/fusion/mptscsih.c
+++ b/drivers/message/fusion/mptscsih.c
@@ -2438,8 +2438,6 @@ mptscsih_slave_configure(struct scsi_device *sdev)
"tagged %d, simple %d\n",
ioc->name,sdev->tagged_supported, sdev->simple_tags));
 
-   blk_queue_dma_alignment (sdev->request_queue, 512 - 1);
-
return 0;
 }
 
diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c
index 6c5920db1e9dc5..574b882c9a8540 100644
--- a/drivers/message/fusion/mptspi.c
+++ b/drivers/message/fusion/mptspi.c
@@ -843,6 +843,7 @@ static const struct scsi_host_template 
mptspi_driver_template = {
.sg_tablesize   = MPT_SCSI_SG_DEPTH,
.max_sectors= 8192,
.cmd_per_lun= 7,
+   .dma_alignment  = 511,
.shost_groups   = mptscsih_host_attr_groups,
 };
 
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 4f495a41ec4aae..a67a98bd7ae2d7 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -478,6 +478,12 @@ struct Scsi_Host *scsi_host_alloc(const struct 
scsi_host_template *sht, int priv
else
shost->max_segment_size = BLK_MAX_SEGMENT_SIZE;
 
+   /* 32-byte (dword) is a common minimum for HBAs. */
+   if (sht->dma_alignment)
+   shost->dma_alignment = sht->dma_alignment;
+   else
+   shost->dma_alignment = 3;
+
/*
 * assume a 4GB boundary, if not set
 */
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index 8e14cea15f9808..60688f18fac6f7 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -943,6 +943,7 @@ iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, 
uint16_t cmds_max,
shost->max_id = 0;
shost->max_channel = 0;
shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;
+   shost->dma_alignment = 0;
 
rc = iscsi_host_get_max_scsi_cmds(shost, cmds_max);
if (rc < 0)
@@ -1065,7 +1066,6 @@ static int iscsi_sw_tcp_slave_configure(struct 
scsi_device *sdev)
if (conn->datadgst_en)
blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES,
   

[PATCH 06/23] scsi: add a no_highmem flag to struct Scsi_Host

2024-03-24 Thread Christoph Hellwig
While we really should be killing the block layer bounce buffering ASAP,
I even more urgently need to stop the drivers to fiddle with the limits
from ->slave_configure.  Add a no_highmem flag to the Scsi_Host to
centralize this setting and switch the remaining four drivers that use
block layer bounce buffering to it.

Signed-off-by: Christoph Hellwig 
---
 drivers/scsi/aha152x.c |  8 +---
 drivers/scsi/imm.c | 12 +---
 drivers/scsi/ppa.c |  8 +---
 drivers/scsi/scsi_lib.c|  3 +++
 drivers/usb/storage/scsiglue.c | 10 --
 drivers/usb/storage/usb.c  | 10 ++
 include/scsi/scsi_host.h   |  2 ++
 7 files changed, 18 insertions(+), 35 deletions(-)

diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c
index 055adb349b0e41..83f16fc14d9630 100644
--- a/drivers/scsi/aha152x.c
+++ b/drivers/scsi/aha152x.c
@@ -746,6 +746,7 @@ struct Scsi_Host *aha152x_probe_one(struct aha152x_setup 
*setup)
/* need to have host registered before triggering any interrupt */
list_add_tail((shpnt)->host_list, _host_list);
 
+   shpnt->no_highmem = true;
shpnt->io_port   = setup->io_port;
shpnt->n_io_port = IO_RANGE;
shpnt->irq   = setup->irq;
@@ -2940,12 +2941,6 @@ static int aha152x_show_info(struct seq_file *m, struct 
Scsi_Host *shpnt)
return 0;
 }
 
-static int aha152x_adjust_queue(struct scsi_device *device)
-{
-   blk_queue_bounce_limit(device->request_queue, BLK_BOUNCE_HIGH);
-   return 0;
-}
-
 static const struct scsi_host_template aha152x_driver_template = {
.module = THIS_MODULE,
.name   = AHA152X_REVID,
@@ -2961,7 +2956,6 @@ static const struct scsi_host_template 
aha152x_driver_template = {
.this_id= 7,
.sg_tablesize   = SG_ALL,
.dma_boundary   = PAGE_SIZE - 1,
-   .slave_alloc= aha152x_adjust_queue,
.cmd_size   = sizeof(struct aha152x_cmd_priv),
 };
 
diff --git a/drivers/scsi/imm.c b/drivers/scsi/imm.c
index 180a5ddedb2cda..21339da505f1ea 100644
--- a/drivers/scsi/imm.c
+++ b/drivers/scsi/imm.c
@@ -1100,16 +1100,6 @@ static int device_check(imm_struct *dev, bool autodetect)
return -ENODEV;
 }
 
-/*
- * imm cannot deal with highmem, so this causes all IO pages for this host
- * to reside in low memory (hence mapped)
- */
-static int imm_adjust_queue(struct scsi_device *device)
-{
-   blk_queue_bounce_limit(device->request_queue, BLK_BOUNCE_HIGH);
-   return 0;
-}
-
 static const struct scsi_host_template imm_template = {
.module = THIS_MODULE,
.proc_name  = "imm",
@@ -1123,7 +1113,6 @@ static const struct scsi_host_template imm_template = {
.this_id= 7,
.sg_tablesize   = SG_ALL,
.can_queue  = 1,
-   .slave_alloc= imm_adjust_queue,
.cmd_size   = sizeof(struct scsi_pointer),
 };
 
@@ -1235,6 +1224,7 @@ static int __imm_attach(struct parport *pb)
host = scsi_host_alloc(_template, sizeof(imm_struct *));
if (!host)
goto out1;
+   host->no_highmem = true;
host->io_port = pb->base;
host->n_io_port = ports;
host->dma_channel = -1;
diff --git a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c
index d592ee9170c11f..8300f0bdddb37a 100644
--- a/drivers/scsi/ppa.c
+++ b/drivers/scsi/ppa.c
@@ -986,12 +986,6 @@ static int device_check(ppa_struct *dev, bool autodetect)
return -ENODEV;
 }
 
-static int ppa_adjust_queue(struct scsi_device *device)
-{
-   blk_queue_bounce_limit(device->request_queue, BLK_BOUNCE_HIGH);
-   return 0;
-}
-
 static const struct scsi_host_template ppa_template = {
.module = THIS_MODULE,
.proc_name  = "ppa",
@@ -1005,7 +999,6 @@ static const struct scsi_host_template ppa_template = {
.this_id= -1,
.sg_tablesize   = SG_ALL,
.can_queue  = 1,
-   .slave_alloc= ppa_adjust_queue,
.cmd_size   = sizeof(struct scsi_pointer),
 };
 
@@ -,6 +1104,7 @@ static int __ppa_attach(struct parport *pb)
host = scsi_host_alloc(_template, sizeof(ppa_struct *));
if (!host)
goto out1;
+   host->no_highmem = true;
host->io_port = pb->base;
host->n_io_port = ports;
host->dma_channel = -1;
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 1deca84914e87a..f1936f98abe3e2 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1995,6 +1995,9 @@ void scsi_init_limits(struct Scsi_Host *shost, struct 
queue_limits *lim)
 */
lim->dma_alignment = max(4, dma_get_cache_alignment()) - 1;
 
+   if (shost->no_highmem)
+   

[PATCH 05/23] scsi_transport_fc: add a max_bsg_segments field to struct fc_function_template

2024-03-24 Thread Christoph Hellwig
ibmvfc only supports a single segment for BSG FC passthrough.  Instead of
having it set a queue limits after creating the BSD queues, add a field so
that the FC transport can set it before allocating the queue.

Signed-off-by: Christoph Hellwig 
---
 drivers/scsi/ibmvscsi/ibmvfc.c   | 5 +
 drivers/scsi/scsi_transport_fc.c | 2 ++
 include/scsi/scsi_transport_fc.h | 1 +
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index 05b126bfd18b55..a3d1013c83075c 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -5541,8 +5541,6 @@ static void ibmvfc_tgt_add_rport(struct ibmvfc_target 
*tgt)
rport->supported_classes |= FC_COS_CLASS2;
if (be32_to_cpu(tgt->service_parms.class3_parms[0]) & 
0x8000)
rport->supported_classes |= FC_COS_CLASS3;
-   if (rport->rqst_q)
-   blk_queue_max_segments(rport->rqst_q, 1);
} else
tgt_dbg(tgt, "rport add failed\n");
spin_unlock_irqrestore(vhost->host->host_lock, flags);
@@ -6391,8 +6389,6 @@ static int ibmvfc_probe(struct vio_dev *vdev, const 
struct vio_device_id *id)
 
ibmvfc_init_sub_crqs(vhost);
 
-   if (shost_to_fc_host(shost)->rqst_q)
-   blk_queue_max_segments(shost_to_fc_host(shost)->rqst_q, 1);
dev_set_drvdata(dev, vhost);
spin_lock(_driver_lock);
list_add_tail(>queue, _head);
@@ -6547,6 +6543,7 @@ static struct fc_function_template 
ibmvfc_transport_functions = {
.get_starget_port_id = ibmvfc_get_starget_port_id,
.show_starget_port_id = 1,
 
+   .max_bsg_segments = 1,
.bsg_request = ibmvfc_bsg_request,
.bsg_timeout = ibmvfc_bsg_timeout,
 };
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c
index 0799700b0fca77..7d088b8da07578 100644
--- a/drivers/scsi/scsi_transport_fc.c
+++ b/drivers/scsi/scsi_transport_fc.c
@@ -4288,6 +4288,7 @@ fc_bsg_hostadd(struct Scsi_Host *shost, struct 
fc_host_attrs *fc_host)
snprintf(bsg_name, sizeof(bsg_name),
 "fc_host%d", shost->host_no);
scsi_init_limits(shost, );
+   lim.max_segments = min_not_zero(lim.max_segments, 
i->f->max_bsg_segments);
q = bsg_setup_queue(dev, bsg_name, , fc_bsg_dispatch,
fc_bsg_job_timeout, i->f->dd_bsg_size);
if (IS_ERR(q)) {
@@ -4320,6 +4321,7 @@ fc_bsg_rportadd(struct Scsi_Host *shost, struct fc_rport 
*rport)
return -ENOTSUPP;
 
scsi_init_limits(shost, );
+   lim.max_segments = min_not_zero(lim.max_segments, 
i->f->max_bsg_segments);
q = bsg_setup_queue(dev, dev_name(dev), , fc_bsg_dispatch_prep,
fc_bsg_job_timeout, i->f->dd_bsg_size);
if (IS_ERR(q)) {
diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h
index 483513c575976c..fd039306ffbb20 100644
--- a/include/scsi/scsi_transport_fc.h
+++ b/include/scsi/scsi_transport_fc.h
@@ -709,6 +709,7 @@ struct fc_function_template {
int (*vport_delete)(struct fc_vport *);
 
/* bsg support */
+   u32 max_bsg_segments;
int (*bsg_request)(struct bsg_job *);
int (*bsg_timeout)(struct bsg_job *);
 
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-6-hch%40lst.de.


[PATCH 04/23] scsi: initialize scsi midlayer limits before allocating the queue

2024-03-24 Thread Christoph Hellwig
Turn __scsi_init_queue into scsi_init_limits which initializes
queue_limits structure that can be passed to blk_mq_alloc_queue.

Signed-off-by: Christoph Hellwig 
---
 drivers/scsi/scsi_lib.c | 32 ++---
 drivers/scsi/scsi_scan.c|  5 +++--
 drivers/scsi/scsi_transport_fc.c| 11 +-
 drivers/scsi/scsi_transport_iscsi.c |  5 +++--
 include/scsi/scsi_transport.h   |  2 +-
 5 files changed, 28 insertions(+), 27 deletions(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 2e28e2360c8574..1deca84914e87a 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -32,7 +32,7 @@
 #include 
 #include 
 #include 
-#include  /* __scsi_init_queue() */
+#include  /* scsi_init_limits() */
 #include 
 
 #include 
@@ -1965,31 +1965,26 @@ static void scsi_map_queues(struct blk_mq_tag_set *set)
blk_mq_map_queues(>map[HCTX_TYPE_DEFAULT]);
 }
 
-void __scsi_init_queue(struct Scsi_Host *shost, struct request_queue *q)
+void scsi_init_limits(struct Scsi_Host *shost, struct queue_limits *lim)
 {
struct device *dev = shost->dma_dev;
 
-   /*
-* this limit is imposed by hardware restrictions
-*/
-   blk_queue_max_segments(q, min_t(unsigned short, shost->sg_tablesize,
-   SG_MAX_SEGMENTS));
+   memset(lim, 0, sizeof(*lim));
+   lim->max_segments =
+   min_t(unsigned short, shost->sg_tablesize, SG_MAX_SEGMENTS);
 
if (scsi_host_prot_dma(shost)) {
shost->sg_prot_tablesize =
min_not_zero(shost->sg_prot_tablesize,
 (unsigned short)SCSI_MAX_PROT_SG_SEGMENTS);
BUG_ON(shost->sg_prot_tablesize < shost->sg_tablesize);
-   blk_queue_max_integrity_segments(q, shost->sg_prot_tablesize);
+   lim->max_integrity_segments = shost->sg_prot_tablesize;
}
 
-   blk_queue_max_hw_sectors(q, shost->max_sectors);
-   blk_queue_segment_boundary(q, shost->dma_boundary);
-   dma_set_seg_boundary(dev, shost->dma_boundary);
-
-   blk_queue_max_segment_size(q, shost->max_segment_size);
-   blk_queue_virt_boundary(q, shost->virt_boundary_mask);
-   dma_set_max_seg_size(dev, queue_max_segment_size(q));
+   lim->max_hw_sectors = shost->max_sectors;
+   lim->seg_boundary_mask = shost->dma_boundary;
+   lim->max_segment_size = shost->max_segment_size;
+   lim->virt_boundary_mask = shost->virt_boundary_mask;
 
/*
 * Set a reasonable default alignment:  The larger of 32-byte (dword),
@@ -1998,9 +1993,12 @@ void __scsi_init_queue(struct Scsi_Host *shost, struct 
request_queue *q)
 *
 * Devices that require a bigger alignment can increase it later.
 */
-   blk_queue_dma_alignment(q, max(4, dma_get_cache_alignment()) - 1);
+   lim->dma_alignment = max(4, dma_get_cache_alignment()) - 1;
+
+   dma_set_seg_boundary(dev, shost->dma_boundary);
+   dma_set_max_seg_size(dev, shost->max_segment_size);
 }
-EXPORT_SYMBOL_GPL(__scsi_init_queue);
+EXPORT_SYMBOL_GPL(scsi_init_limits);
 
 static const struct blk_mq_ops scsi_mq_ops_no_commit = {
.get_budget = scsi_mq_get_budget,
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 8d06475de17a33..205ab3b3ea89be 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -283,6 +283,7 @@ static struct scsi_device *scsi_alloc_sdev(struct 
scsi_target *starget,
struct request_queue *q;
int display_failure_msg = 1, ret;
struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+   struct queue_limits lim;
 
sdev = kzalloc(sizeof(*sdev) + shost->transportt->device_size,
   GFP_KERNEL);
@@ -332,7 +333,8 @@ static struct scsi_device *scsi_alloc_sdev(struct 
scsi_target *starget,
 
sdev->sg_reserved_size = INT_MAX;
 
-   q = blk_mq_alloc_queue(>host->tag_set, NULL, NULL);
+   scsi_init_limits(shost, );
+   q = blk_mq_alloc_queue(>host->tag_set, , NULL);
if (IS_ERR(q)) {
/* release fn is set up in scsi_sysfs_device_initialise, so
 * have to free and put manually here */
@@ -343,7 +345,6 @@ static struct scsi_device *scsi_alloc_sdev(struct 
scsi_target *starget,
kref_get(>host->tagset_refcnt);
sdev->request_queue = q;
q->queuedata = sdev;
-   __scsi_init_queue(sdev->host, q);
 
depth = sdev->host->cmd_per_lun ?: 1;
 
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c
index 87b2235b8ece45..0799700b0fca77 100644
--- a/drivers/scsi/scsi_transport_fc.c
+++ b/drivers/scsi/scsi_transport_fc.c
@@ -4276,6 +4276,7 @@ fc_bsg_hostadd(struct Scsi_Host *shost, struct 
fc_host_attrs *fc_host)
 {
struct device *dev = >shost_gendev;
struct fc_internal *i = to_fc_internal(shost->transportt);
+   struct 

[PATCH 02/23] bsg: pass queue_limits to bsg_setup_queue

2024-03-24 Thread Christoph Hellwig
This allows bsg_setup_queue to pass them to blk_mq_alloc_queue and thus
set up the limits at queue allocation time.

Signed-off-by: Christoph Hellwig 
---
 block/bsg-lib.c | 6 --
 drivers/scsi/mpi3mr/mpi3mr_app.c| 2 +-
 drivers/scsi/scsi_transport_fc.c| 6 +++---
 drivers/scsi/scsi_transport_iscsi.c | 3 ++-
 drivers/scsi/scsi_transport_sas.c   | 4 ++--
 drivers/ufs/core/ufs_bsg.c  | 3 ++-
 include/linux/bsg-lib.h | 3 ++-
 7 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/block/bsg-lib.c b/block/bsg-lib.c
index bcc7dee6abced6..ee738d129a9f5e 100644
--- a/block/bsg-lib.c
+++ b/block/bsg-lib.c
@@ -354,12 +354,14 @@ static const struct blk_mq_ops bsg_mq_ops = {
  * bsg_setup_queue - Create and add the bsg hooks so we can receive requests
  * @dev: device to attach bsg device to
  * @name: device to give bsg device
+ * @lim: queue limits for the bsg queue
  * @job_fn: bsg job handler
  * @timeout: timeout handler function pointer
  * @dd_job_size: size of LLD data needed for each job
  */
 struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
-   bsg_job_fn *job_fn, bsg_timeout_fn *timeout, int dd_job_size)
+   struct queue_limits *lim, bsg_job_fn *job_fn,
+   bsg_timeout_fn *timeout, int dd_job_size)
 {
struct bsg_set *bset;
struct blk_mq_tag_set *set;
@@ -383,7 +385,7 @@ struct request_queue *bsg_setup_queue(struct device *dev, 
const char *name,
if (blk_mq_alloc_tag_set(set))
goto out_tag_set;
 
-   q = blk_mq_alloc_queue(set, NULL, NULL);
+   q = blk_mq_alloc_queue(set, lim, NULL);
if (IS_ERR(q)) {
ret = PTR_ERR(q);
goto out_queue;
diff --git a/drivers/scsi/mpi3mr/mpi3mr_app.c b/drivers/scsi/mpi3mr/mpi3mr_app.c
index 0380996b5ad27a..0bac3f49d8057d 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_app.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_app.c
@@ -1853,7 +1853,7 @@ void mpi3mr_bsg_init(struct mpi3mr_ioc *mrioc)
return;
}
 
-   mrioc->bsg_queue = bsg_setup_queue(bsg_dev, dev_name(bsg_dev),
+   mrioc->bsg_queue = bsg_setup_queue(bsg_dev, dev_name(bsg_dev), NULL,
mpi3mr_bsg_request, NULL, 0);
if (IS_ERR(mrioc->bsg_queue)) {
ioc_err(mrioc, "%s: bsg registration failed\n",
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c
index b04075f19445dc..87b2235b8ece45 100644
--- a/drivers/scsi/scsi_transport_fc.c
+++ b/drivers/scsi/scsi_transport_fc.c
@@ -4287,8 +4287,8 @@ fc_bsg_hostadd(struct Scsi_Host *shost, struct 
fc_host_attrs *fc_host)
snprintf(bsg_name, sizeof(bsg_name),
 "fc_host%d", shost->host_no);
 
-   q = bsg_setup_queue(dev, bsg_name, fc_bsg_dispatch, fc_bsg_job_timeout,
-   i->f->dd_bsg_size);
+   q = bsg_setup_queue(dev, bsg_name, NULL, fc_bsg_dispatch,
+   fc_bsg_job_timeout, i->f->dd_bsg_size);
if (IS_ERR(q)) {
dev_err(dev,
"fc_host%d: bsg interface failed to initialize - setup 
queue\n",
@@ -4318,7 +4318,7 @@ fc_bsg_rportadd(struct Scsi_Host *shost, struct fc_rport 
*rport)
if (!i->f->bsg_request)
return -ENOTSUPP;
 
-   q = bsg_setup_queue(dev, dev_name(dev), fc_bsg_dispatch_prep,
+   q = bsg_setup_queue(dev, dev_name(dev), NULL, fc_bsg_dispatch_prep,
fc_bsg_job_timeout, i->f->dd_bsg_size);
if (IS_ERR(q)) {
dev_err(dev, "failed to setup bsg queue\n");
diff --git a/drivers/scsi/scsi_transport_iscsi.c 
b/drivers/scsi/scsi_transport_iscsi.c
index af3ac6346796ba..c131746bf20777 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -1542,7 +1542,8 @@ iscsi_bsg_host_add(struct Scsi_Host *shost, struct 
iscsi_cls_host *ihost)
return -ENOTSUPP;
 
snprintf(bsg_name, sizeof(bsg_name), "iscsi_host%d", shost->host_no);
-   q = bsg_setup_queue(dev, bsg_name, iscsi_bsg_host_dispatch, NULL, 0);
+   q = bsg_setup_queue(dev, bsg_name, NULL, iscsi_bsg_host_dispatch, NULL,
+   0);
if (IS_ERR(q)) {
shost_printk(KERN_ERR, shost, "bsg interface failed to "
 "initialize - no request queue\n");
diff --git a/drivers/scsi/scsi_transport_sas.c 
b/drivers/scsi/scsi_transport_sas.c
index d704c484a251c5..424a89513814b4 100644
--- a/drivers/scsi/scsi_transport_sas.c
+++ b/drivers/scsi/scsi_transport_sas.c
@@ -197,7 +197,7 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, 
struct sas_rphy *rphy)
}
 
if (rphy) {
-   q = bsg_setup_queue(>dev, dev_name(>dev),
+   q = bsg_setup_queue(>dev, dev_name(>dev), NULL,
sas_smp_dispatch, NULL, 0);
if (IS_ERR(q))
return 

convert SCSI to atomic queue limits, part 1

2024-03-24 Thread Christoph Hellwig
Hi all,

this series converts the SCSI midlayer and LLDDs to use atomic queue limits
API.  It is pretty straight forward, except for the mpt3mr driver which
does really weird and probably already broken things by setting limits
from unlocked device iteration callsbacks.

The first patch is actually a bug fix and should probably go into 6.9-rc.
The other would probably best be in a shared branch between the block and
scsi code, as the ULD drivers will be a lot more extensive.  I'm actually
scratching my head on dealing with some of the updates that it does from
the I/O completion handler and ->open calls for already open devices.
Suggestions welcome..

Diffstat:
 block/blk-settings.c|  248 
 block/bsg-lib.c |6 
 drivers/ata/ahci.h  |2 
 drivers/ata/libata-sata.c   |   10 -
 drivers/ata/libata-scsi.c   |   19 +-
 drivers/ata/libata.h|3 
 drivers/ata/pata_macio.c|   11 -
 drivers/ata/sata_mv.c   |2 
 drivers/ata/sata_nv.c   |   24 +-
 drivers/ata/sata_sil24.c|2 
 drivers/firewire/sbp2.c |   13 -
 drivers/message/fusion/mptfc.c  |1 
 drivers/message/fusion/mptsas.c |1 
 drivers/message/fusion/mptscsih.c   |2 
 drivers/message/fusion/mptspi.c |1 
 drivers/s390/block/dasd_eckd.c  |6 
 drivers/scsi/aha152x.c  |8 
 drivers/scsi/aic94xx/aic94xx_init.c |2 
 drivers/scsi/hisi_sas/hisi_sas.h|3 
 drivers/scsi/hisi_sas/hisi_sas_main.c   |7 
 drivers/scsi/hisi_sas/hisi_sas_v1_hw.c  |2 
 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c  |2 
 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c  |7 
 drivers/scsi/hosts.c|6 
 drivers/scsi/hptiop.c   |8 
 drivers/scsi/ibmvscsi/ibmvfc.c  |5 
 drivers/scsi/imm.c  |   12 -
 drivers/scsi/ipr.c  |   10 -
 drivers/scsi/isci/init.c|2 
 drivers/scsi/iscsi_tcp.c|2 
 drivers/scsi/libsas/sas_scsi_host.c |7 
 drivers/scsi/megaraid/megaraid_sas.h|2 
 drivers/scsi/megaraid/megaraid_sas_base.c   |   29 +--
 drivers/scsi/megaraid/megaraid_sas_fusion.c |3 
 drivers/scsi/mpi3mr/mpi3mr.h|1 
 drivers/scsi/mpi3mr/mpi3mr_app.c|   12 -
 drivers/scsi/mpi3mr/mpi3mr_os.c |   76 +++-
 drivers/scsi/mpt3sas/mpt3sas_scsih.c|   18 --
 drivers/scsi/mvsas/mv_init.c|2 
 drivers/scsi/pm8001/pm8001_init.c   |2 
 drivers/scsi/pmcraid.c  |   11 -
 drivers/scsi/ppa.c  |8 
 drivers/scsi/qla2xxx/qla_os.c   |6 
 drivers/scsi/scsi_lib.c |   40 +---
 drivers/scsi/scsi_scan.c|   79 
 drivers/scsi/scsi_transport_fc.c|   15 +
 drivers/scsi/scsi_transport_iscsi.c |6 
 drivers/scsi/scsi_transport_sas.c   |4 
 drivers/staging/rts5208/rtsx.c  |   24 +-
 drivers/ufs/core/ufs_bsg.c  |3 
 drivers/ufs/core/ufshcd.c   |3 
 drivers/ufs/host/ufs-exynos.c   |8 
 drivers/usb/image/microtek.c|8 
 drivers/usb/storage/scsiglue.c  |   57 ++
 drivers/usb/storage/uas.c   |   29 +--
 drivers/usb/storage/usb.c   |   10 +
 include/linux/blkdev.h  |   13 -
 include/linux/bsg-lib.h |3 
 include/linux/libata.h  |   10 -
 include/linux/mmc/host.h|4 
 include/scsi/libsas.h   |3 
 include/scsi/scsi_host.h|9 +
 include/scsi/scsi_transport.h   |2 
 include/scsi/scsi_transport_fc.h|1 
 include/ufs/ufshcd.h|1 
 65 files changed, 335 insertions(+), 601 deletions(-)

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-1-hch%40lst.de.


[PATCH 03/23] mpi3mr: pass queue_limits to bsg_setup_queue

2024-03-24 Thread Christoph Hellwig
Pass the limits to bsg_setup_queue instead of setting them up on the live
queue.

Signed-off-by: Christoph Hellwig 
---
 drivers/scsi/mpi3mr/mpi3mr_app.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/mpi3mr/mpi3mr_app.c b/drivers/scsi/mpi3mr/mpi3mr_app.c
index 0bac3f49d8057d..1dd097f9d7b78c 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_app.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_app.c
@@ -1838,6 +1838,10 @@ void mpi3mr_bsg_init(struct mpi3mr_ioc *mrioc)
 {
struct device *bsg_dev = >bsg_dev;
struct device *parent = >shost->shost_gendev;
+   struct queue_limits lim = {
+   .max_hw_sectors = MPI3MR_MAX_APP_XFER_SECTORS,
+   .max_segments   = MPI3MR_MAX_APP_XFER_SEGMENTS,
+   };
 
device_initialize(bsg_dev);
 
@@ -1853,20 +1857,14 @@ void mpi3mr_bsg_init(struct mpi3mr_ioc *mrioc)
return;
}
 
-   mrioc->bsg_queue = bsg_setup_queue(bsg_dev, dev_name(bsg_dev), NULL,
+   mrioc->bsg_queue = bsg_setup_queue(bsg_dev, dev_name(bsg_dev), ,
mpi3mr_bsg_request, NULL, 0);
if (IS_ERR(mrioc->bsg_queue)) {
ioc_err(mrioc, "%s: bsg registration failed\n",
dev_name(bsg_dev));
device_del(bsg_dev);
put_device(bsg_dev);
-   return;
}
-
-   blk_queue_max_segments(mrioc->bsg_queue, MPI3MR_MAX_APP_XFER_SEGMENTS);
-   blk_queue_max_hw_sectors(mrioc->bsg_queue, MPI3MR_MAX_APP_XFER_SECTORS);
-
-   return;
 }
 
 /**
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-4-hch%40lst.de.


[PATCH 01/23] block: don't reject too large max_user_setors in blk_validate_limits

2024-03-24 Thread Christoph Hellwig
We already cap down the actual max_sectors to the max of the hardware
and user limit, so don't reject the configuration.

Signed-off-by: Christoph Hellwig 
---
 block/blk-settings.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/block/blk-settings.c b/block/blk-settings.c
index 3c7d8d638ab59d..cdbaef159c4bc3 100644
--- a/block/blk-settings.c
+++ b/block/blk-settings.c
@@ -146,8 +146,7 @@ static int blk_validate_limits(struct queue_limits *lim)
max_hw_sectors = min_not_zero(lim->max_hw_sectors,
lim->max_dev_sectors);
if (lim->max_user_sectors) {
-   if (lim->max_user_sectors > max_hw_sectors ||
-   lim->max_user_sectors < PAGE_SIZE / SECTOR_SIZE)
+   if (lim->max_user_sectors < PAGE_SIZE / SECTOR_SIZE)
return -EINVAL;
lim->max_sectors = min(max_hw_sectors, lim->max_user_sectors);
} else {
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-2-hch%40lst.de.