Subject: [PATCH] scsi-drivers Don't use SG_ALL as allocation size
below list of drivers have used SG_ALL as a size to
preallocate maximum possible command's sg-count.
This is no longer possible since the maximum is not
set at compile time but as a run time configuration.
A better schema can be advised with a more dynamic allocation.
Perhaps from a kmem_cache.
Affected drivers/files:
drivers/scsi/atari_scsi.[ch]
drivers/scsi/eata_pio.c
drivers/scsi/ibmvscsi/ibmvscsi.[ch]
drivers/scsi/mac53c94.c
drivers/scsi/mesh.c
drivers/scsi/nsp32.h
drivers/scsi/qla1280.c
Signed-off-by: Boaz Harrosh <[EMAIL PROTECTED]>
---
drivers/scsi/atari_scsi.c | 8 ++++----
drivers/scsi/atari_scsi.h | 4 ++--
drivers/scsi/eata_pio.c | 5 ++++-
drivers/scsi/ibmvscsi/ibmvscsi.c | 8 +++++---
drivers/scsi/ibmvscsi/ibmvscsi.h | 1 +
drivers/scsi/mac53c94.c | 8 ++++++--
drivers/scsi/mesh.c | 5 ++++-
drivers/scsi/nsp32.h | 2 +-
drivers/scsi/qla1280.c | 3 ++-
9 files changed, 29 insertions(+), 15 deletions(-)
diff --git a/drivers/scsi/atari_scsi.c b/drivers/scsi/atari_scsi.c
index f5732d8..b47b61d 100644
--- a/drivers/scsi/atari_scsi.c
+++ b/drivers/scsi/atari_scsi.c
@@ -620,7 +620,8 @@ int atari_scsi_detect(struct scsi_host_template *host)
/* Force sg_tablesize to 0 on a Falcon! */
host->sg_tablesize =
!IS_A_TT() ? ATARI_FALCON_SG_TABLESIZE :
- (setup_sg_tablesize >= 0) ? setup_sg_tablesize :
ATARI_TT_SG_TABLESIZE;
+ (setup_sg_tablesize > 0) ? setup_sg_tablesize :
+ ATARI_TT_SG_TABLESIZE;
if (setup_hostid >= 0)
host->this_id = setup_hostid;
@@ -792,9 +793,8 @@ void __init atari_scsi_setup(char *str, int *ints)
if (ints[0] >= 3) {
if (ints[3] >= 0) {
setup_sg_tablesize = ints[3];
- /* Must be <= SG_ALL (255) */
- if (setup_sg_tablesize > SG_ALL)
- setup_sg_tablesize = SG_ALL;
+ if (setup_sg_tablesize > ATARI_TT_SG_TABLESIZE)
+ setup_sg_tablesize = ATARI_TT_SG_TABLESIZE;
}
}
if (ints[0] >= 4) {
diff --git a/drivers/scsi/atari_scsi.h b/drivers/scsi/atari_scsi.h
index efadb8d..21b8c91 100644
--- a/drivers/scsi/atari_scsi.h
+++ b/drivers/scsi/atari_scsi.h
@@ -35,11 +35,11 @@ int atari_scsi_release (struct Scsi_Host *);
#define ATARI_TT_CAN_QUEUE 16
#define ATARI_TT_CMD_PER_LUN 8
-#define ATARI_TT_SG_TABLESIZE SG_ALL
+#define ATARI_TT_SG_TABLESIZE 255
#define ATARI_FALCON_CAN_QUEUE 8
#define ATARI_FALCON_CMD_PER_LUN 1
-#define ATARI_FALCON_SG_TABLESIZE SG_NONE
+#define ATARI_FALCON_SG_TABLESIZE 1
#define DEFAULT_USE_TAGGED_QUEUING 0
diff --git a/drivers/scsi/eata_pio.c b/drivers/scsi/eata_pio.c
index b5a6092..8913d9d 100644
--- a/drivers/scsi/eata_pio.c
+++ b/drivers/scsi/eata_pio.c
@@ -691,6 +691,9 @@ static unsigned int print_selftest(unsigned int base)
return (!(inb(base + HA_RSTATUS) & HA_SERROR));
}
+/* FIXME: is this driver sg-chainning ready? */
+#define EATA_MAX_SG 255
+
static int register_pio_HBA(long base, struct get_conf *gc, struct pci_dev
*pdev)
{
unsigned long size = 0;
@@ -801,7 +804,7 @@ static int register_pio_HBA(long base, struct get_conf *gc,
struct pci_dev *pdev
sh->this_id = gc->scsi_id[3];
sh->can_queue = 1;
sh->cmd_per_lun = 1;
- sh->sg_tablesize = SG_ALL;
+ sh->sg_tablesize = EATA_MAX_SG;
hd->channel = 0;
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
index 78d46a9..9b1fc94 100644
--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
@@ -173,7 +173,8 @@ static void release_event_pool(struct event_pool *pool,
++in_use;
if (pool->events[i].ext_list) {
dma_free_coherent(hostdata->dev,
- SG_ALL * sizeof(struct srp_direct_buf),
+ IBMVSCSI_MAX_SG *
+ sizeof(struct srp_direct_buf),
pool->events[i].ext_list,
pool->events[i].ext_list_token);
}
@@ -423,7 +424,8 @@ static int map_sg_data(struct scsi_cmnd *cmd,
if (!evt_struct->ext_list) {
evt_struct->ext_list = (struct srp_direct_buf *)
dma_alloc_coherent(dev,
- SG_ALL * sizeof(struct
srp_direct_buf),
+ IBMVSCSI_MAX_SG *
+ sizeof(struct srp_direct_buf),
&evt_struct->ext_list_token, 0);
if (!evt_struct->ext_list) {
sdev_printk(KERN_ERR, cmd->device,
@@ -1598,7 +1600,7 @@ static struct scsi_host_template driver_template = {
.cmd_per_lun = 16,
.can_queue = IBMVSCSI_MAX_REQUESTS_DEFAULT,
.this_id = -1,
- .sg_tablesize = SG_ALL,
+ .sg_tablesize = IBMVSCSI_MAX_SG,
.use_clustering = ENABLE_CLUSTERING,
.shost_attrs = ibmvscsi_attrs,
};
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.h b/drivers/scsi/ibmvscsi/ibmvscsi.h
index 46e850e..e3e3a2e 100644
--- a/drivers/scsi/ibmvscsi/ibmvscsi.h
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.h
@@ -46,6 +46,7 @@ struct Scsi_Host;
#define IBMVSCSI_MAX_REQUESTS_DEFAULT 100
#define IBMVSCSI_MAX_CMDS_PER_LUN 64
+#define IBMVSCSI_MAX_SG 255
/* ------------------------------------------------------------
* Data Structures
diff --git a/drivers/scsi/mac53c94.c b/drivers/scsi/mac53c94.c
index b12ad7c..9ef0272 100644
--- a/drivers/scsi/mac53c94.c
+++ b/drivers/scsi/mac53c94.c
@@ -392,6 +392,9 @@ static void set_dma_cmds(struct fsc_state *state, struct
scsi_cmnd *cmd)
cmd->SCp.this_residual = total;
}
+/* Dynamicaly allocated at init */
+#define MAC53c94_MAX_SG 255
+
static struct scsi_host_template mac53c94_template = {
.proc_name = "53c94",
.name = "53C94",
@@ -399,7 +402,7 @@ static struct scsi_host_template mac53c94_template = {
.eh_host_reset_handler = mac53c94_host_reset,
.can_queue = 1,
.this_id = 7,
- .sg_tablesize = SG_ALL,
+ .sg_tablesize = MAC53c94_MAX_SG,
.cmd_per_lun = 1,
.use_clustering = DISABLE_CLUSTERING,
};
@@ -464,7 +467,8 @@ static int mac53c94_probe(struct macio_dev *mdev, const
struct of_device_id *mat
* XXX FIXME: Use DMA consistent routines
*/
dma_cmd_space = kmalloc((host->sg_tablesize + 2) *
- sizeof(struct dbdma_cmd), GFP_KERNEL);
+ sizeof(struct dbdma_cmd),
+ GFP_KERNEL | GFP_DMA);
if (dma_cmd_space == 0) {
printk(KERN_ERR "mac53c94: couldn't allocate dma "
"command space for %s\n", node->full_name);
diff --git a/drivers/scsi/mesh.c b/drivers/scsi/mesh.c
index 651d09b..2a8654a 100644
--- a/drivers/scsi/mesh.c
+++ b/drivers/scsi/mesh.c
@@ -1832,6 +1832,9 @@ static int mesh_shutdown(struct macio_dev *mdev)
return 0;
}
+/* allocated at probe time */
+#define MESH_MAX_SG 255
+
static struct scsi_host_template mesh_template = {
.proc_name = "mesh",
.name = "MESH",
@@ -1840,7 +1843,7 @@ static struct scsi_host_template mesh_template = {
.eh_host_reset_handler = mesh_host_reset,
.can_queue = 20,
.this_id = 7,
- .sg_tablesize = SG_ALL,
+ .sg_tablesize = MESH_MAX_SG,
.cmd_per_lun = 2,
.use_clustering = DISABLE_CLUSTERING,
};
diff --git a/drivers/scsi/nsp32.h b/drivers/scsi/nsp32.h
index 6715ecb..ace52f5 100644
--- a/drivers/scsi/nsp32.h
+++ b/drivers/scsi/nsp32.h
@@ -444,7 +444,7 @@ typedef u16 u16_le;
/************************************************************************
* structure for DMA/Scatter Gather list
*/
-#define NSP32_SG_SIZE SG_ALL
+#define NSP32_SG_SIZE 255
typedef struct _nsp32_sgtable {
/* values must be little endian */
diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c
index 68c0d09..c0319da 100644
--- a/drivers/scsi/qla1280.c
+++ b/drivers/scsi/qla1280.c
@@ -422,6 +422,7 @@
#define IS_ISP1x160(ha) (ha->pdev->device ==
PCI_DEVICE_ID_QLOGIC_ISP10160 || \
ha->pdev->device ==
PCI_DEVICE_ID_QLOGIC_ISP12160)
+#define QLA_MAX_SG 255
static int qla1280_probe_one(struct pci_dev *, const struct pci_device_id *);
static void qla1280_remove_one(struct pci_dev *);
@@ -4201,7 +4202,7 @@ static struct scsi_host_template qla1280_driver_template
= {
.bios_param = qla1280_biosparam,
.can_queue = 0xfffff,
.this_id = -1,
- .sg_tablesize = SG_ALL,
+ .sg_tablesize = QLA_MAX_SG,
.cmd_per_lun = 1,
.use_clustering = ENABLE_CLUSTERING,
};
--
1.5.3.3
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html