Avoid hitting the host-wide free_list lock unless we need to put a command
back onto the freelist.

Signed-off-by: Christoph Hellwig <h...@lst.de>
---
 drivers/scsi/scsi.c |   13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index ebcea6c..4139486 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -320,15 +320,16 @@ void __scsi_put_command(struct Scsi_Host *shost, struct 
scsi_cmnd *cmd,
 {
        unsigned long flags;
 
-       /* changing locks here, don't need to restore the irq state */
-       spin_lock_irqsave(&shost->free_list_lock, flags);
        if (unlikely(list_empty(&shost->free_list))) {
-               list_add(&cmd->list, &shost->free_list);
-               cmd = NULL;
+               spin_lock_irqsave(&shost->free_list_lock, flags);
+               if (list_empty(&shost->free_list)) {
+                       list_add(&cmd->list, &shost->free_list);
+                       cmd = NULL;
+               }
+               spin_unlock_irqrestore(&shost->free_list_lock, flags);
        }
-       spin_unlock_irqrestore(&shost->free_list_lock, flags);
 
-       if (likely(cmd != NULL))
+       if (cmd)
                scsi_pool_free_command(shost->cmd_pool, cmd);
 
        put_device(dev);
-- 
1.7.10.4


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to