diff options
author | Jakub Grajciar <jgrajcia@cisco.com> | 2021-01-08 15:32:43 +0100 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2021-02-05 16:20:37 +0000 |
commit | 47e68de222f16b5b6738fcb235750ca9d8dc82a1 (patch) | |
tree | 044f4864326adf0991b5811cfd607bf38a053e37 /extras/libmemif | |
parent | 18327be5d458f9f73c12d76e677ee5a068ec6b10 (diff) |
libmemif: set next free buffer
Adds memif_set_next_free_buffer - set internal pointer
to next free descriptor for any tx queue.
Type: feature
Signed-off-by: Jakub Grajciar <jgrajcia@cisco.com>
Change-Id: Ia24345a886a52c25c1723c6dbce023f2aed4a42c
Diffstat (limited to 'extras/libmemif')
-rw-r--r-- | extras/libmemif/src/libmemif.h | 11 | ||||
-rw-r--r-- | extras/libmemif/src/main.c | 30 |
2 files changed, 41 insertions, 0 deletions
diff --git a/extras/libmemif/src/libmemif.h b/extras/libmemif/src/libmemif.h index 379ccd1e260..0146bb78dff 100644 --- a/extras/libmemif/src/libmemif.h +++ b/extras/libmemif/src/libmemif.h @@ -648,6 +648,17 @@ int memif_buffer_alloc (memif_conn_handle_t conn, uint16_t qid, memif_buffer_t * bufs, uint16_t count, uint16_t * count_out, uint16_t size); +/** \brief Memif set next free buffer + @param conn - memif connection handle + @param qid - number identifying queue + @param buf - next free buffer + + Sets next free descriptor pointer for specified tx queue. + The next allocation will happen at this buffer. +*/ +int memif_set_next_free_buffer (memif_conn_handle_t conn, uint16_t qid, + memif_buffer_t *buf); + /** \brief Memif refill queue @param conn - memif connection handle @param qid - number identifying queue diff --git a/extras/libmemif/src/main.c b/extras/libmemif/src/main.c index f5b1b5d257a..0644f948c31 100644 --- a/extras/libmemif/src/main.c +++ b/extras/libmemif/src/main.c @@ -2151,6 +2151,36 @@ memif_init_regions_and_queues (memif_connection_t * conn) return 0; } +int +memif_set_next_free_buffer (memif_conn_handle_t conn, uint16_t qid, + memif_buffer_t *buf) +{ + memif_connection_t *c = (memif_connection_t *) conn; + if (EXPECT_FALSE (c == NULL)) + return MEMIF_ERR_NOCONN; + if (EXPECT_FALSE (qid >= c->tx_queues_num)) + return MEMIF_ERR_QID; + if (EXPECT_FALSE (buf == NULL)) + return MEMIF_ERR_INVAL_ARG; + + uint16_t ring_size, ns; + memif_queue_t *mq = &c->tx_queues[qid]; + memif_ring_t *ring = mq->ring; + + ring_size = (1 << mq->log2_ring_size); + if (c->args.is_master) + ns = ring->head - mq->next_buf; + else + ns = ring_size - mq->next_buf + ring->tail; + + if ((mq->next_buf - buf->desc_index) > ns) + return MEMIF_ERR_INVAL_ARG; + + mq->next_buf = buf->desc_index; + + return MEMIF_ERR_SUCCESS; +} + static void memif_buffer_enq_at_idx_internal (memif_queue_t *from_q, memif_queue_t *to_q, memif_buffer_t *buf, uint16_t slot) |