Commit 2474d775 authored by Sebastian Sanchez's avatar Sebastian Sanchez Committed by Doug Ledford

IB/hfi1: Get rid of divide in pio buffer allocator

The div instruction shows costly in profiles.
Reviewed-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: default avatarSebastian Sanchez <sebastian.sanchez@intel.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent fe4d9243
...@@ -1249,6 +1249,7 @@ int sc_enable(struct send_context *sc) ...@@ -1249,6 +1249,7 @@ int sc_enable(struct send_context *sc)
sc->free = 0; sc->free = 0;
sc->alloc_free = 0; sc->alloc_free = 0;
sc->fill = 0; sc->fill = 0;
sc->fill_wrap = 0;
sc->sr_head = 0; sc->sr_head = 0;
sc->sr_tail = 0; sc->sr_tail = 0;
sc->flags = 0; sc->flags = 0;
...@@ -1392,7 +1393,7 @@ struct pio_buf *sc_buffer_alloc(struct send_context *sc, u32 dw_len, ...@@ -1392,7 +1393,7 @@ struct pio_buf *sc_buffer_alloc(struct send_context *sc, u32 dw_len,
unsigned long flags; unsigned long flags;
unsigned long avail; unsigned long avail;
unsigned long blocks = dwords_to_blocks(dw_len); unsigned long blocks = dwords_to_blocks(dw_len);
unsigned long start_fill; u32 fill_wrap;
int trycount = 0; int trycount = 0;
u32 head, next; u32 head, next;
...@@ -1435,8 +1436,11 @@ struct pio_buf *sc_buffer_alloc(struct send_context *sc, u32 dw_len, ...@@ -1435,8 +1436,11 @@ struct pio_buf *sc_buffer_alloc(struct send_context *sc, u32 dw_len,
head = sc->sr_head; head = sc->sr_head;
/* "allocate" the buffer */ /* "allocate" the buffer */
start_fill = sc->fill;
sc->fill += blocks; sc->fill += blocks;
fill_wrap = sc->fill_wrap;
sc->fill_wrap += blocks;
if (sc->fill_wrap >= sc->credits)
sc->fill_wrap = sc->fill_wrap - sc->credits;
/* /*
* Fill the parts that the releaser looks at before moving the head. * Fill the parts that the releaser looks at before moving the head.
...@@ -1465,8 +1469,7 @@ struct pio_buf *sc_buffer_alloc(struct send_context *sc, u32 dw_len, ...@@ -1465,8 +1469,7 @@ struct pio_buf *sc_buffer_alloc(struct send_context *sc, u32 dw_len,
spin_unlock_irqrestore(&sc->alloc_lock, flags); spin_unlock_irqrestore(&sc->alloc_lock, flags);
/* finish filling in the buffer outside the lock */ /* finish filling in the buffer outside the lock */
pbuf->start = sc->base_addr + ((start_fill % sc->credits) pbuf->start = sc->base_addr + fill_wrap * PIO_BLOCK_SIZE;
* PIO_BLOCK_SIZE);
pbuf->size = sc->credits * PIO_BLOCK_SIZE; pbuf->size = sc->credits * PIO_BLOCK_SIZE;
pbuf->end = sc->base_addr + pbuf->size; pbuf->end = sc->base_addr + pbuf->size;
pbuf->block_count = blocks; pbuf->block_count = blocks;
......
...@@ -119,6 +119,7 @@ struct send_context { ...@@ -119,6 +119,7 @@ struct send_context {
unsigned long fill; /* official alloc count */ unsigned long fill; /* official alloc count */
unsigned long alloc_free; /* copy of free (less cache thrash) */ unsigned long alloc_free; /* copy of free (less cache thrash) */
u32 __percpu *buffers_allocated;/* count of buffers allocated */ u32 __percpu *buffers_allocated;/* count of buffers allocated */
u32 fill_wrap; /* tracks fill within ring */
/* releaser fields */ /* releaser fields */
spinlock_t release_lock ____cacheline_aligned_in_smp; spinlock_t release_lock ____cacheline_aligned_in_smp;
u32 sr_tail; /* shadow ring tail */ u32 sr_tail; /* shadow ring tail */
......
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