diff options
author | Robert Elliott <elliott@hp.com> | 2015-01-23 23:43:41 +0100 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2015-02-02 18:57:41 +0100 |
commit | 33811026a0a4208dd5725183d37fc92d5e88b0a2 (patch) | |
tree | 3ee9c60da0de30a40ea02be9db13b5c75fcb0ea4 /drivers/scsi/hpsa.c | |
parent | hpsa: fix race between abort handler and main i/o path (diff) | |
download | linux-33811026a0a4208dd5725183d37fc92d5e88b0a2.tar.xz linux-33811026a0a4208dd5725183d37fc92d5e88b0a2.zip |
hpsa: optimize cmd_alloc function by remembering last allocation
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>
Diffstat (limited to 'drivers/scsi/hpsa.c')
-rw-r--r-- | drivers/scsi/hpsa.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c index c95a20c5269b..72abcf3bfabf 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c @@ -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)); |