hpsa: optimize cmd_alloc function by remembering last allocation
authorRobert Elliott <elliott@hp.com>
Fri, 23 Jan 2015 22:43:41 +0000 (16:43 -0600)
committerJames Bottomley <JBottomley@Parallels.com>
Mon, 2 Feb 2015 17:57:41 +0000 (09:57 -0800)
Empirically, this improves performance slightly (~2% max IOPS) by
allowing cmd_alloc to remember where it left off searching for
free commands between calls instead of always starting its search
at command 0.

Reviewed-by: Scott Teel <scott.teel@pmcs.com>
Signed-off-by: Robert Elliott <elliott@hp.com>
Signed-off-by: Don Brace <don.brace@pmcs.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/hpsa.c
drivers/scsi/hpsa.h

index c95a20c..72abcf3 100644 (file)
@@ -4649,9 +4649,10 @@ static struct CommandList *cmd_alloc(struct ctlr_info *h)
        union u64bit temp64;
        dma_addr_t cmd_dma_handle, err_dma_handle;
        int refcount;
-       unsigned long offset = 0;
+       unsigned long offset;
 
-       /* There is some *extremely* small but non-zero chance that that
+       /*
+        * There is some *extremely* small but non-zero chance that that
         * multiple threads could get in here, and one thread could
         * be scanning through the list of bits looking for a free
         * one, but the free ones are always behind him, and other
@@ -4662,6 +4663,7 @@ static struct CommandList *cmd_alloc(struct ctlr_info *h)
         * infrequently as to be indistinguishable from never.
         */
 
+       offset = h->last_allocation; /* benignly racy */
        for (;;) {
                i = find_next_zero_bit(h->cmd_pool_bits, h->nr_cmds, offset);
                if (unlikely(i == h->nr_cmds)) {
@@ -4679,6 +4681,7 @@ static struct CommandList *cmd_alloc(struct ctlr_info *h)
                        h->cmd_pool_bits + (i / BITS_PER_LONG));
                break; /* it's ours now. */
        }
+       h->last_allocation = i; /* benignly racy */
 
        /* Zero out all of commandlist except the last field, refcount */
        memset(c, 0, offsetof(struct CommandList, refcount));
index 679e4d2..981479a 100644 (file)
@@ -133,6 +133,7 @@ struct ctlr_info {
        struct CfgTable __iomem *cfgtable;
        int     interrupts_enabled;
        int     max_commands;
+       int last_allocation;
        atomic_t commands_outstanding;
 #      define PERF_MODE_INT    0
 #      define DOORBELL_INT     1