ring: add reset function for flushing

Currently, the flush is done by dequeuing the ring in a while loop. It is
much simpler to flush the queue by resetting the head and tail indices.

Signed-off-by: Gavin Hu <gavin.hu@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
This commit is contained in:
Gavin Hu 2019-07-17 03:23:55 +08:00 committed by Thomas Monjalon
parent 46418d25f7
commit 272d87b01b
3 changed files with 31 additions and 0 deletions

View File

@ -63,6 +63,13 @@ rte_ring_get_memsize(unsigned count)
return sz;
}
void
rte_ring_reset(struct rte_ring *r)
{
r->prod.head = r->cons.head = 0;
r->prod.tail = r->cons.tail = 0;
}
int
rte_ring_init(struct rte_ring *r, const char *name, unsigned count,
unsigned flags)

View File

@ -668,6 +668,23 @@ rte_ring_dequeue(struct rte_ring *r, void **obj_p)
return rte_ring_dequeue_bulk(r, obj_p, 1, NULL) ? 0 : -ENOENT;
}
/**
* Flush a ring.
*
* This function flush all the elements in a ring
*
* @b EXPERIMENTAL: this API may change without prior notice
*
* @warning
* Make sure the ring is not in use while calling this function.
*
* @param r
* A pointer to the ring structure.
*/
__rte_experimental
void
rte_ring_reset(struct rte_ring *r);
/**
* Return the number of entries in a ring.
*

View File

@ -17,3 +17,10 @@ DPDK_2.2 {
rte_ring_free;
} DPDK_2.0;
EXPERIMENTAL {
global:
rte_ring_reset;
};