ring: optimize empty test
authorMorten Brørup <mb@smartsharesystems.com>
Tue, 19 May 2020 15:27:25 +0000 (15:27 +0000)
committerDavid Marchand <david.marchand@redhat.com>
Wed, 1 Jul 2020 09:46:09 +0000 (11:46 +0200)
Testing if the ring is empty is as simple as comparing the producer and
consumer pointers.

In theory, this optimization reduces the number of potential cache misses
from 3 to 2 by not having to read r->mask in rte_ring_count().

The modification of this function were also discussed in the RFC here:
https://mails.dpdk.org/archives/dev/2020-April/165752.html

Signed-off-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
lib/librte_ring/rte_ring.h

index 9078e7c..f671414 100644 (file)
@@ -733,7 +733,9 @@ rte_ring_full(const struct rte_ring *r)
 static inline int
 rte_ring_empty(const struct rte_ring *r)
 {
-       return rte_ring_count(r) == 0;
+       uint32_t prod_tail = r->prod.tail;
+       uint32_t cons_tail = r->cons.tail;
+       return cons_tail == prod_tail;
 }
 
 /**