New upstream version 16.11.4
[deb_dpdk.git] / lib / librte_ring / rte_ring.h
index f928324..c1b311a 100644 (file)
@@ -187,7 +187,7 @@ struct rte_ring {
        struct rte_ring_debug_stats stats[RTE_MAX_LCORE];
 #endif
 
-       void * ring[0] __rte_cache_aligned; /**< Memory space of ring starts here.
+       void *ring[] __rte_cache_aligned;   /**< Memory space of ring starts here.
                                             * not volatile so need to be careful
                                             * about compiler re-ordering */
 };
@@ -341,7 +341,7 @@ void rte_ring_free(struct rte_ring *r);
 int rte_ring_set_water_mark(struct rte_ring *r, unsigned count);
 
 /**
- * Dump the status of the ring to the console.
+ * Dump the status of the ring to a file.
  *
  * @param f
  *   A pointer to a file for output
@@ -450,6 +450,12 @@ __rte_ring_mp_do_enqueue(struct rte_ring *r, void * const *obj_table,
                n = max;
 
                prod_head = r->prod.head;
+
+               /* add rmb barrier to avoid load/load reorder in weak
+                * memory model. It is noop on x86
+                */
+               rte_smp_rmb();
+
                cons_tail = r->cons.tail;
                /* The subtraction is done between two unsigned 32bits value
                 * (the result is always modulo 32 bits even if we have
@@ -642,6 +648,12 @@ __rte_ring_mc_do_dequeue(struct rte_ring *r, void **obj_table,
                n = max;
 
                cons_head = r->cons.head;
+
+               /* add rmb barrier to avoid load/load reorder in weak
+                * memory model. It is noop on x86
+                */
+               rte_smp_rmb();
+
                prod_tail = r->prod.tail;
                /* The subtraction is done between two unsigned 32bits value
                 * (the result is always modulo 32 bits even if we have
@@ -756,7 +768,7 @@ __rte_ring_sc_do_dequeue(struct rte_ring *r, void **obj_table,
 
        /* copy in table */
        DEQUEUE_PTRS();
-       rte_smp_wmb();
+       rte_smp_rmb();
 
        __RING_STAT_ADD(r, deq_success, n);
        r->cons.tail = cons_next;