Commit 64bdcbc4 authored by Kashyap.Desai@avagotech.com's avatar Kashyap.Desai@avagotech.com Committed by Christoph Hellwig

scsi: add use_cmd_list flag

Add a use_cmd_list flag in struct Scsi_Host to request keeping track of
all outstanding commands per device.

Default behaviour is not to keep track of cmd_list per sdev, as this may
introduce lock contention. (overhead is more on multi-node NUMA.), and
only enable it on the two drivers that need it.
Signed-off-by: default avatarKashyap Desai <kashyap.desai@avagotech.com>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 2eefd57b
...@@ -1152,6 +1152,7 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1152,6 +1152,7 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
shost->irq = pdev->irq; shost->irq = pdev->irq;
shost->unique_id = unique_id; shost->unique_id = unique_id;
shost->max_cmd_len = 16; shost->max_cmd_len = 16;
shost->use_cmd_list = 1;
aac = (struct aac_dev *)shost->hostdata; aac = (struct aac_dev *)shost->hostdata;
aac->base_start = pci_resource_start(pdev, 0); aac->base_start = pci_resource_start(pdev, 0);
......
...@@ -2363,6 +2363,7 @@ static s32 adpt_scsi_host_alloc(adpt_hba* pHba, struct scsi_host_template *sht) ...@@ -2363,6 +2363,7 @@ static s32 adpt_scsi_host_alloc(adpt_hba* pHba, struct scsi_host_template *sht)
host->unique_id = (u32)sys_tbl_pa + pHba->unit; host->unique_id = (u32)sys_tbl_pa + pHba->unit;
host->sg_tablesize = pHba->sg_tablesize; host->sg_tablesize = pHba->sg_tablesize;
host->can_queue = pHba->post_fifo_size; host->can_queue = pHba->post_fifo_size;
host->use_cmd_list = 1;
return 0; return 0;
} }
......
...@@ -645,16 +645,18 @@ static void scsi_mq_free_sgtables(struct scsi_cmnd *cmd) ...@@ -645,16 +645,18 @@ static void scsi_mq_free_sgtables(struct scsi_cmnd *cmd)
static void scsi_mq_uninit_cmd(struct scsi_cmnd *cmd) static void scsi_mq_uninit_cmd(struct scsi_cmnd *cmd)
{ {
struct scsi_device *sdev = cmd->device; struct scsi_device *sdev = cmd->device;
struct Scsi_Host *shost = sdev->host;
unsigned long flags; unsigned long flags;
BUG_ON(list_empty(&cmd->list));
scsi_mq_free_sgtables(cmd); scsi_mq_free_sgtables(cmd);
scsi_uninit_cmd(cmd); scsi_uninit_cmd(cmd);
spin_lock_irqsave(&sdev->list_lock, flags); if (shost->use_cmd_list) {
list_del_init(&cmd->list); BUG_ON(list_empty(&cmd->list));
spin_unlock_irqrestore(&sdev->list_lock, flags); spin_lock_irqsave(&sdev->list_lock, flags);
list_del_init(&cmd->list);
spin_unlock_irqrestore(&sdev->list_lock, flags);
}
} }
/* /*
...@@ -1815,13 +1817,11 @@ static int scsi_mq_prep_fn(struct request *req) ...@@ -1815,13 +1817,11 @@ static int scsi_mq_prep_fn(struct request *req)
INIT_DELAYED_WORK(&cmd->abort_work, scmd_eh_abort_handler); INIT_DELAYED_WORK(&cmd->abort_work, scmd_eh_abort_handler);
cmd->jiffies_at_alloc = jiffies; cmd->jiffies_at_alloc = jiffies;
/* if (shost->use_cmd_list) {
* XXX: cmd_list lookups are only used by two drivers, try to get spin_lock_irq(&sdev->list_lock);
* rid of this list in common code. list_add_tail(&cmd->list, &sdev->cmd_list);
*/ spin_unlock_irq(&sdev->list_lock);
spin_lock_irq(&sdev->list_lock); }
list_add_tail(&cmd->list, &sdev->cmd_list);
spin_unlock_irq(&sdev->list_lock);
sg = (void *)cmd + sizeof(struct scsi_cmnd) + shost->hostt->cmd_size; sg = (void *)cmd + sizeof(struct scsi_cmnd) + shost->hostt->cmd_size;
cmd->sdb.table.sgl = sg; cmd->sdb.table.sgl = sg;
......
...@@ -680,6 +680,7 @@ struct Scsi_Host { ...@@ -680,6 +680,7 @@ struct Scsi_Host {
unsigned no_write_same:1; unsigned no_write_same:1;
unsigned use_blk_mq:1; unsigned use_blk_mq:1;
unsigned use_cmd_list: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