ring: eliminate duplication of size and mask fields
[dpdk.git] / lib / librte_ring / rte_ring.h
index 331c94f..d650215 100644 (file)
@@ -151,10 +151,7 @@ struct rte_memzone; /* forward declaration, so as not to require memzone.h */
 struct rte_ring_headtail {
        volatile uint32_t head;  /**< Prod/consumer head. */
        volatile uint32_t tail;  /**< Prod/consumer tail. */
-       uint32_t size;           /**< Size of ring. */
-       uint32_t mask;           /**< Mask (size-1) of ring. */
        uint32_t single;         /**< True if single prod/cons */
-       uint32_t watermark;      /**< Max items before EDQUOT in producer. */
 };
 
 /**
@@ -174,9 +171,12 @@ struct rte_ring {
         * next time the ABI changes
         */
        char name[RTE_MEMZONE_NAMESIZE];    /**< Name of the ring. */
-       int flags;                       /**< Flags supplied at creation. */
+       int flags;               /**< Flags supplied at creation. */
        const struct rte_memzone *memzone;
                        /**< Memzone, if any, containing the rte_ring */
+       uint32_t size;           /**< Size of ring. */
+       uint32_t mask;           /**< Mask (size-1) of ring. */
+       uint32_t watermark;      /**< Max items before EDQUOT in producer. */
 
        /** Ring producer status. */
        struct rte_ring_headtail prod __rte_aligned(PROD_ALIGN);
@@ -355,7 +355,7 @@ void rte_ring_dump(FILE *f, const struct rte_ring *r);
  * Placed here since identical code needed in both
  * single and multi producer enqueue functions */
 #define ENQUEUE_PTRS() do { \
-       const uint32_t size = r->prod.size; \
+       const uint32_t size = r->size; \
        uint32_t idx = prod_head & mask; \
        if (likely(idx + n < size)) { \
                for (i = 0; i < (n & ((~(unsigned)0x3))); i+=4, idx+=4) { \
@@ -382,7 +382,7 @@ void rte_ring_dump(FILE *f, const struct rte_ring *r);
  * single and multi consumer dequeue functions */
 #define DEQUEUE_PTRS() do { \
        uint32_t idx = cons_head & mask; \
-       const uint32_t size = r->cons.size; \
+       const uint32_t size = r->size; \
        if (likely(idx + n < size)) { \
                for (i = 0; i < (n & (~(unsigned)0x3)); i+=4, idx+=4) {\
                        obj_table[i] = r->ring[idx]; \
@@ -437,7 +437,7 @@ __rte_ring_mp_do_enqueue(struct rte_ring *r, void * const *obj_table,
        const unsigned max = n;
        int success;
        unsigned i, rep = 0;
-       uint32_t mask = r->prod.mask;
+       uint32_t mask = r->mask;
        int ret;
 
        /* Avoid the unnecessary cmpset operation below, which is also
@@ -485,7 +485,7 @@ __rte_ring_mp_do_enqueue(struct rte_ring *r, void * const *obj_table,
        rte_smp_wmb();
 
        /* if we exceed the watermark */
-       if (unlikely(((mask + 1) - free_entries + n) > r->prod.watermark)) {
+       if (unlikely(((mask + 1) - free_entries + n) > r->watermark)) {
                ret = (behavior == RTE_RING_QUEUE_FIXED) ? -EDQUOT :
                                (int)(n | RTE_RING_QUOT_EXCEED);
                __RING_STAT_ADD(r, enq_quota, n);
@@ -544,7 +544,7 @@ __rte_ring_sp_do_enqueue(struct rte_ring *r, void * const *obj_table,
        uint32_t prod_head, cons_tail;
        uint32_t prod_next, free_entries;
        unsigned i;
-       uint32_t mask = r->prod.mask;
+       uint32_t mask = r->mask;
        int ret;
 
        prod_head = r->prod.head;
@@ -580,7 +580,7 @@ __rte_ring_sp_do_enqueue(struct rte_ring *r, void * const *obj_table,
        rte_smp_wmb();
 
        /* if we exceed the watermark */
-       if (unlikely(((mask + 1) - free_entries + n) > r->prod.watermark)) {
+       if (unlikely(((mask + 1) - free_entries + n) > r->watermark)) {
                ret = (behavior == RTE_RING_QUEUE_FIXED) ? -EDQUOT :
                        (int)(n | RTE_RING_QUOT_EXCEED);
                __RING_STAT_ADD(r, enq_quota, n);
@@ -630,7 +630,7 @@ __rte_ring_mc_do_dequeue(struct rte_ring *r, void **obj_table,
        const unsigned max = n;
        int success;
        unsigned i, rep = 0;
-       uint32_t mask = r->prod.mask;
+       uint32_t mask = r->mask;
 
        /* Avoid the unnecessary cmpset operation below, which is also
         * potentially harmful when n equals 0. */
@@ -727,7 +727,7 @@ __rte_ring_sc_do_dequeue(struct rte_ring *r, void **obj_table,
        uint32_t cons_head, prod_tail;
        uint32_t cons_next, entries;
        unsigned i;
-       uint32_t mask = r->prod.mask;
+       uint32_t mask = r->mask;
 
        cons_head = r->cons.head;
        prod_tail = r->prod.tail;
@@ -1056,7 +1056,7 @@ rte_ring_full(const struct rte_ring *r)
 {
        uint32_t prod_tail = r->prod.tail;
        uint32_t cons_tail = r->cons.tail;
-       return ((cons_tail - prod_tail - 1) & r->prod.mask) == 0;
+       return ((cons_tail - prod_tail - 1) & r->mask) == 0;
 }
 
 /**
@@ -1089,7 +1089,7 @@ rte_ring_count(const struct rte_ring *r)
 {
        uint32_t prod_tail = r->prod.tail;
        uint32_t cons_tail = r->cons.tail;
-       return (prod_tail - cons_tail) & r->prod.mask;
+       return (prod_tail - cons_tail) & r->mask;
 }
 
 /**
@@ -1105,7 +1105,7 @@ rte_ring_free_count(const struct rte_ring *r)
 {
        uint32_t prod_tail = r->prod.tail;
        uint32_t cons_tail = r->cons.tail;
-       return (cons_tail - prod_tail - 1) & r->prod.mask;
+       return (cons_tail - prod_tail - 1) & r->mask;
 }
 
 /**
@@ -1119,7 +1119,7 @@ rte_ring_free_count(const struct rte_ring *r)
 static inline unsigned int
 rte_ring_get_size(const struct rte_ring *r)
 {
-       return r->prod.size;
+       return r->size;
 }
 
 /**