libmemif: perf optimization

Change-Id: Ie3bd75e0e98c7ecb4c66dba701131363e5ec89a2
Signed-off-by: Jakub Grajciar <Jakub.Grajciar@pantheon.tech>
This commit is contained in:
Jakub Grajciar
2017-10-30 10:34:54 +01:00
committed by Damjan Marion
parent c981b0970e
commit 04b68bdc48

View File

@@ -1388,43 +1388,35 @@ memif_buffer_alloc (memif_conn_handle_t conn, uint16_t qid,
memif_queue_t *mq = &c->tx_queues[qid];
memif_ring_t *ring = mq->ring;
memif_buffer_t *b0, *b1;
uint8_t chain_buf0, chain_buf1;
uint8_t chain_buf = 1;
uint16_t mask = (1 << mq->log2_ring_size) - 1;
uint16_t s0, s1, ns;
*count_out = 0;
int i, err = MEMIF_ERR_SUCCESS; /* 0 */
if (ring->tail != ring->head)
{
if (ring->head > ring->tail)
ns = (1 << mq->log2_ring_size) - ring->head + ring->tail;
else
ns = ring->tail - ring->head;
}
if (ring->tail > ring->head)
ns = ring->tail - ring->head;
else
ns = (1 << mq->log2_ring_size);
ns = (1 << mq->log2_ring_size) - ring->head + ring->tail;
/* (head == tail) ? receive function will asume that no packets are available */
ns -= 1;
if (size > ring->desc[0].buffer_length)
{
chain_buf = size / ring->desc[s0].buffer_length;
if (((size % ring->desc[s0].buffer_length) != 0) || (size == 0))
chain_buf++;
}
while (count && ns)
{
while ((count > 2) && (ns > 2))
{
s0 = (ring->head + mq->alloc_bufs) & mask;
chain_buf0 = size / ring->desc[s0].buffer_length;
if (((size % ring->desc[s0].buffer_length) != 0) || (size == 0))
chain_buf0++;
s1 = (ring->head + mq->alloc_bufs + chain_buf) & mask;
if (chain_buf0 > ns)
break;
s1 = (ring->head + mq->alloc_bufs + chain_buf0) & mask;
chain_buf1 = size / ring->desc[s1].buffer_length;
if (((size % ring->desc[s1].buffer_length) != 0) || (size == 0))
chain_buf1++;
if ((chain_buf0 + chain_buf1) > ns)
if ((2 * chain_buf) > ns)
break;
b0 = (bufs + *count_out);
@@ -1434,64 +1426,49 @@ memif_buffer_alloc (memif_conn_handle_t conn, uint16_t qid,
b1->desc_index = s1;
ring->desc[s0].flags = 0;
ring->desc[s1].flags = 0;
b0->buffer_len = ring->desc[s0].buffer_length * chain_buf0;
b1->buffer_len = ring->desc[s1].buffer_length * chain_buf1;
b0->buffer_len = ring->desc[s0].buffer_length * chain_buf;
b1->buffer_len = ring->desc[s1].buffer_length * chain_buf;
/* TODO: support multiple regions -> ring descriptor contains region index */
b0->data = c->regions->shm + ring->desc[s0].offset;
b1->data = c->regions->shm + ring->desc[s1].offset;
for (i = 0; i < (memif_min (chain_buf0, chain_buf1) - 1); i++)
for (i = 0; i < (chain_buf - 1); i++)
{
ring->desc[(s0 + i) & mask].flags |= MEMIF_DESC_FLAG_NEXT;
ring->desc[(s1 + i) & mask].flags |= MEMIF_DESC_FLAG_NEXT;
DBG ("allocating chained buffers");
}
if (chain_buf0 > chain_buf1)
{
for (; i < (chain_buf0 - 1); i++)
ring->desc[(s0 + i) & mask].flags |= MEMIF_DESC_FLAG_NEXT;
}
else
{
for (; i < (chain_buf1 - 1); i++)
ring->desc[(s1 + i) & mask].flags |= MEMIF_DESC_FLAG_NEXT;
}
mq->alloc_bufs += chain_buf0 + chain_buf1;
mq->alloc_bufs += 2 * chain_buf;
DBG ("allocated ring slots %u, %u", s0, s1);
count -= 2;
ns -= chain_buf0 + chain_buf1;
ns -= (2 * chain_buf);
*count_out += 2;
}
s0 = (ring->head + mq->alloc_bufs) & mask;
b0 = (bufs + *count_out);
chain_buf0 = size / ring->desc[s0].buffer_length;
if (((size % ring->desc[s0].buffer_length) != 0) || (size == 0))
chain_buf0++;
if (chain_buf0 > ns)
if (chain_buf > ns)
break;
b0->desc_index = s0;
ring->desc[s0].flags = 0;
b0->buffer_len = ring->desc[s0].buffer_length * chain_buf0;
b0->buffer_len = ring->desc[s0].buffer_length * chain_buf;
b0->data = c->regions->shm + ring->desc[s0].offset;
for (i = 0; i < (chain_buf0 - 1); i++)
for (i = 0; i < (chain_buf - 1); i++)
{
ring->desc[(s0 + i) & mask].flags |= MEMIF_DESC_FLAG_NEXT;
DBG ("allocating chained buffers");
}
mq->alloc_bufs += chain_buf0;
mq->alloc_bufs += chain_buf;
DBG ("allocated ring slot %u", s0);
count--;
ns -= chain_buf0;
ns -= chain_buf;
*count_out += 1;
}
@@ -1819,7 +1796,9 @@ memif_rx_burst (memif_conn_handle_t conn, uint16_t qid,
memif_buffer_t *b0, *b1;
uint16_t curr_buf = 0;
*rx = 0;
#ifdef MEMIF_DBG_SHM
int i;
#endif /* MEMIF_DBG_SHM */
uint64_t b;
ssize_t r = read (mq->int_fd, &b, sizeof (b));
@@ -1836,21 +1815,17 @@ memif_rx_burst (memif_conn_handle_t conn, uint16_t qid,
while (ns && count)
{
DBG ("ns: %u, count: %u", ns, count);
while ((ns > 2) && (count > 2))
{
b0 = (bufs + curr_buf);
b1 = (bufs + curr_buf + 1);
b0->desc_index = mq->last_head;
i = 0;
b0->data_len = 0;
b0->buffer_len = 0;
b0->data = memif_get_buffer (conn, ring, mq->last_head);
b0->data_len += ring->desc[mq->last_head].length;
b0->buffer_len += ring->desc[mq->last_head].buffer_length;
b0->data_len = ring->desc[mq->last_head].length;
b0->buffer_len = ring->desc[mq->last_head].buffer_length;
#ifdef MEMIF_DBG_SHM
i = 0;
print_bytes (b0->data +
ring->desc[b0->desc_index].buffer_length * i++,
ring->desc[b0->desc_index].buffer_length, DBG_TX_BUF);
@@ -1875,14 +1850,11 @@ memif_rx_burst (memif_conn_handle_t conn, uint16_t qid,
mq->last_head = (mq->last_head + 1) & mask;
b1->desc_index = mq->last_head;
i = 0;
b1->data_len = 0;
b1->buffer_len = 0;
b1->data = memif_get_buffer (conn, ring, mq->last_head);
b1->data_len += ring->desc[mq->last_head].length;
b1->buffer_len += ring->desc[mq->last_head].buffer_length;
b1->data_len = ring->desc[mq->last_head].length;
b1->buffer_len = ring->desc[mq->last_head].buffer_length;
#ifdef MEMIF_DBG_SHM
i = 0;
print_bytes (b1->data +
ring->desc[b1->desc_index].buffer_length * i++,
ring->desc[b1->desc_index].buffer_length, DBG_TX_BUF);
@@ -1912,14 +1884,11 @@ memif_rx_burst (memif_conn_handle_t conn, uint16_t qid,
b0 = (bufs + curr_buf);
b0->desc_index = mq->last_head;
i = 0;
b0->data_len = 0;
b0->buffer_len = 0;
b0->data = memif_get_buffer (conn, ring, mq->last_head);
b0->data_len += ring->desc[mq->last_head].length;
b0->buffer_len += ring->desc[mq->last_head].buffer_length;
b0->data_len = ring->desc[mq->last_head].length;
b0->buffer_len = ring->desc[mq->last_head].buffer_length;
#ifdef MEMIF_DBG_SHM
i = 0;
print_bytes (b0->data +
ring->desc[b0->desc_index].buffer_length * i++,
ring->desc[b0->desc_index].buffer_length, DBG_TX_BUF);