Commit 6248d7f7 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Martin K. Petersen

scsi: core: Add a no_highmem flag to struct Scsi_Host

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: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20240409143748.980206-7-hch@lst.deReviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Reviewed-by: default avatarDamien Le Moal <dlemoal@kernel.org>
Reviewed-by: default avatarJohn Garry <john.g.garry@oracle.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 7eaae991
...@@ -746,6 +746,7 @@ struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup) ...@@ -746,6 +746,7 @@ struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup)
/* need to have host registered before triggering any interrupt */ /* need to have host registered before triggering any interrupt */
list_add_tail(&HOSTDATA(shpnt)->host_list, &aha152x_host_list); list_add_tail(&HOSTDATA(shpnt)->host_list, &aha152x_host_list);
shpnt->no_highmem = true;
shpnt->io_port = setup->io_port; shpnt->io_port = setup->io_port;
shpnt->n_io_port = IO_RANGE; shpnt->n_io_port = IO_RANGE;
shpnt->irq = setup->irq; shpnt->irq = setup->irq;
...@@ -2940,12 +2941,6 @@ static int aha152x_show_info(struct seq_file *m, struct Scsi_Host *shpnt) ...@@ -2940,12 +2941,6 @@ static int aha152x_show_info(struct seq_file *m, struct Scsi_Host *shpnt)
return 0; 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 = { static const struct scsi_host_template aha152x_driver_template = {
.module = THIS_MODULE, .module = THIS_MODULE,
.name = AHA152X_REVID, .name = AHA152X_REVID,
...@@ -2961,7 +2956,6 @@ static const struct scsi_host_template aha152x_driver_template = { ...@@ -2961,7 +2956,6 @@ static const struct scsi_host_template aha152x_driver_template = {
.this_id = 7, .this_id = 7,
.sg_tablesize = SG_ALL, .sg_tablesize = SG_ALL,
.dma_boundary = PAGE_SIZE - 1, .dma_boundary = PAGE_SIZE - 1,
.slave_alloc = aha152x_adjust_queue,
.cmd_size = sizeof(struct aha152x_cmd_priv), .cmd_size = sizeof(struct aha152x_cmd_priv),
}; };
......
...@@ -1100,16 +1100,6 @@ static int device_check(imm_struct *dev, bool autodetect) ...@@ -1100,16 +1100,6 @@ static int device_check(imm_struct *dev, bool autodetect)
return -ENODEV; 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 = { static const struct scsi_host_template imm_template = {
.module = THIS_MODULE, .module = THIS_MODULE,
.proc_name = "imm", .proc_name = "imm",
...@@ -1123,7 +1113,6 @@ static const struct scsi_host_template imm_template = { ...@@ -1123,7 +1113,6 @@ static const struct scsi_host_template imm_template = {
.this_id = 7, .this_id = 7,
.sg_tablesize = SG_ALL, .sg_tablesize = SG_ALL,
.can_queue = 1, .can_queue = 1,
.slave_alloc = imm_adjust_queue,
.cmd_size = sizeof(struct scsi_pointer), .cmd_size = sizeof(struct scsi_pointer),
}; };
...@@ -1235,6 +1224,7 @@ static int __imm_attach(struct parport *pb) ...@@ -1235,6 +1224,7 @@ static int __imm_attach(struct parport *pb)
host = scsi_host_alloc(&imm_template, sizeof(imm_struct *)); host = scsi_host_alloc(&imm_template, sizeof(imm_struct *));
if (!host) if (!host)
goto out1; goto out1;
host->no_highmem = true;
host->io_port = pb->base; host->io_port = pb->base;
host->n_io_port = ports; host->n_io_port = ports;
host->dma_channel = -1; host->dma_channel = -1;
......
...@@ -986,12 +986,6 @@ static int device_check(ppa_struct *dev, bool autodetect) ...@@ -986,12 +986,6 @@ static int device_check(ppa_struct *dev, bool autodetect)
return -ENODEV; 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 = { static const struct scsi_host_template ppa_template = {
.module = THIS_MODULE, .module = THIS_MODULE,
.proc_name = "ppa", .proc_name = "ppa",
...@@ -1005,7 +999,6 @@ static const struct scsi_host_template ppa_template = { ...@@ -1005,7 +999,6 @@ static const struct scsi_host_template ppa_template = {
.this_id = -1, .this_id = -1,
.sg_tablesize = SG_ALL, .sg_tablesize = SG_ALL,
.can_queue = 1, .can_queue = 1,
.slave_alloc = ppa_adjust_queue,
.cmd_size = sizeof(struct scsi_pointer), .cmd_size = sizeof(struct scsi_pointer),
}; };
...@@ -1111,6 +1104,7 @@ static int __ppa_attach(struct parport *pb) ...@@ -1111,6 +1104,7 @@ static int __ppa_attach(struct parport *pb)
host = scsi_host_alloc(&ppa_template, sizeof(ppa_struct *)); host = scsi_host_alloc(&ppa_template, sizeof(ppa_struct *));
if (!host) if (!host)
goto out1; goto out1;
host->no_highmem = true;
host->io_port = pb->base; host->io_port = pb->base;
host->n_io_port = ports; host->n_io_port = ports;
host->dma_channel = -1; host->dma_channel = -1;
......
...@@ -1995,6 +1995,9 @@ void scsi_init_limits(struct Scsi_Host *shost, struct queue_limits *lim) ...@@ -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; lim->dma_alignment = max(4, dma_get_cache_alignment()) - 1;
if (shost->no_highmem)
lim->bounce = BLK_BOUNCE_HIGH;
dma_set_seg_boundary(dev, shost->dma_boundary); dma_set_seg_boundary(dev, shost->dma_boundary);
dma_set_max_seg_size(dev, shost->max_segment_size); dma_set_max_seg_size(dev, shost->max_segment_size);
} }
......
...@@ -40,7 +40,6 @@ ...@@ -40,7 +40,6 @@
#include <scsi/scsi_eh.h> #include <scsi/scsi_eh.h>
#include "usb.h" #include "usb.h"
#include <linux/usb/hcd.h>
#include "scsiglue.h" #include "scsiglue.h"
#include "debug.h" #include "debug.h"
#include "transport.h" #include "transport.h"
...@@ -130,15 +129,6 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -130,15 +129,6 @@ static int slave_configure(struct scsi_device *sdev)
min_t(size_t, 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)); dma_max_mapping_size(dev) >> SECTOR_SHIFT));
/*
* Some USB host controllers can't do DMA; they have to use PIO.
* For such controllers we need to make sure the block layer sets
* up bounce buffers in addressable memory.
*/
if (!hcd_uses_dma(bus_to_hcd(us->pusb_dev->bus)) ||
(bus_to_hcd(us->pusb_dev->bus)->localmem_pool != NULL))
blk_queue_bounce_limit(sdev->request_queue, BLK_BOUNCE_HIGH);
/* /*
* We can't put these settings in slave_alloc() because that gets * We can't put these settings in slave_alloc() because that gets
* called before the device type is known. Consequently these * called before the device type is known. Consequently these
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#include <scsi/scsi_device.h> #include <scsi/scsi_device.h>
#include "usb.h" #include "usb.h"
#include <linux/usb/hcd.h>
#include "scsiglue.h" #include "scsiglue.h"
#include "transport.h" #include "transport.h"
#include "protocol.h" #include "protocol.h"
...@@ -961,6 +962,15 @@ int usb_stor_probe1(struct us_data **pus, ...@@ -961,6 +962,15 @@ int usb_stor_probe1(struct us_data **pus,
if (result) if (result)
goto BadDevice; goto BadDevice;
/*
* Some USB host controllers can't do DMA; they have to use PIO.
* For such controllers we need to make sure the block layer sets
* up bounce buffers in addressable memory.
*/
if (!hcd_uses_dma(bus_to_hcd(us->pusb_dev->bus)) ||
bus_to_hcd(us->pusb_dev->bus)->localmem_pool)
host->no_highmem = true;
/* Get the unusual_devs entries and the descriptors */ /* Get the unusual_devs entries and the descriptors */
result = get_device_info(us, id, unusual_dev); result = get_device_info(us, id, unusual_dev);
if (result) if (result)
......
...@@ -665,6 +665,8 @@ struct Scsi_Host { ...@@ -665,6 +665,8 @@ struct Scsi_Host {
/* The transport requires the LUN bits NOT to be stored in CDB[1] */ /* The transport requires the LUN bits NOT to be stored in CDB[1] */
unsigned no_scsi2_lun_in_cdb:1; unsigned no_scsi2_lun_in_cdb:1;
unsigned no_highmem:1;
/* /*
* Optional work queue to be utilized by the transport * Optional work queue to be utilized by the transport
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment