X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=lib%2Flibrte_ring%2Frte_ring.h;h=fc433b050b5cfbfc97cf39de521a4a58e6088368;hb=6e7cbd63706f3435b9d9a2057a37db1da01db9a7;hp=8f5a4937f328630c9d227f7dda5cf1d7b889602b;hpb=f239aed5e674965691846e8ce3f187dd47523689;p=deb_dpdk.git diff --git a/lib/librte_ring/rte_ring.h b/lib/librte_ring/rte_ring.h index 8f5a4937..fc433b05 100644 --- a/lib/librte_ring/rte_ring.h +++ b/lib/librte_ring/rte_ring.h @@ -96,6 +96,7 @@ extern "C" { #include #include #include +#include #include #include #include @@ -174,7 +175,7 @@ struct rte_ring { * ring space will be wasted. */ #define RING_F_EXACT_SZ 0x0004 -#define RTE_RING_SZ_MASK (unsigned)(0x0fffffff) /**< Ring size mask */ +#define RTE_RING_SZ_MASK (0x7fffffffU) /**< Ring size mask */ /* @internal defines for passing to the enqueue dequeue worker functions */ #define __IS_SP 1 @@ -409,6 +410,12 @@ __rte_ring_move_prod_head(struct rte_ring *r, int is_sp, n = max; *old_head = r->prod.head; + + /* add rmb barrier to avoid load/load reorder in weak + * memory model. It is noop on x86 + */ + rte_smp_rmb(); + const uint32_t cons_tail = r->cons.tail; /* * The subtraction is done between two unsigned 32bits value @@ -517,6 +524,12 @@ __rte_ring_move_cons_head(struct rte_ring *r, int is_sc, n = max; *old_head = r->cons.head; + + /* add rmb barrier to avoid load/load reorder in weak + * memory model. It is noop on x86 + */ + rte_smp_rmb(); + const uint32_t 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 @@ -569,7 +582,7 @@ __rte_ring_do_dequeue(struct rte_ring *r, void **obj_table, uint32_t cons_head, cons_next; uint32_t entries; - n = __rte_ring_move_cons_head(r, is_sc, n, behavior, + n = __rte_ring_move_cons_head(r, (int)is_sc, n, behavior, &cons_head, &cons_next, &entries); if (n == 0) goto end;