ring: guarantee dequeue ordering before tail update
authorJuhamatti Kuusisaari <juhamatti.kuusisaari@coriant.com>
Fri, 15 Jul 2016 04:39:51 +0000 (07:39 +0300)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Thu, 21 Jul 2016 21:28:30 +0000 (23:28 +0200)
Consumer queue dequeuing must be guaranteed to be done fully before
the tail is updated. This is not guaranteed with a read barrier,
changed to a write barrier just before tail update which in practice
guarantees correct order of reads and writes.

Signed-off-by: Juhamatti Kuusisaari <juhamatti.kuusisaari@coriant.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
lib/librte_ring/rte_ring.h

index 0e22e69..f928324 100644 (file)
@@ -756,7 +756,7 @@ __rte_ring_sc_do_dequeue(struct rte_ring *r, void **obj_table,
 
        /* copy in table */
        DEQUEUE_PTRS();
-       rte_smp_rmb();
+       rte_smp_wmb();
 
        __RING_STAT_ADD(r, deq_success, n);
        r->cons.tail = cons_next;