mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-07 07:05:20 +00:00
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: Kashyap Desai <kashyap.desai@avagotech.com> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
2eefd57b97
commit
64bdcbc449
4 changed files with 15 additions and 12 deletions
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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 {
|
||||||
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
|
||||||
|
|
Loading…
Add table
Reference in a new issue