From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 3A2E05598 for ; Thu, 23 Feb 2017 18:24:50 +0100 (CET) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga105.jf.intel.com with ESMTP; 23 Feb 2017 09:24:49 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,198,1484035200"; d="scan'208";a="827712966" Received: from sivswdev01.ir.intel.com ([10.237.217.45]) by FMSMGA003.fm.intel.com with ESMTP; 23 Feb 2017 09:24:48 -0800 From: Bruce Richardson To: olivier.matz@6wind.com Cc: dev@dpdk.org, Bruce Richardson Date: Thu, 23 Feb 2017 17:23:56 +0000 Message-Id: <20170223172407.27664-4-bruce.richardson@intel.com> X-Mailer: git-send-email 2.8.4 In-Reply-To: <20170223172407.27664-1-bruce.richardson@intel.com> References: <20170223172407.27664-1-bruce.richardson@intel.com> Subject: [dpdk-dev] [PATCH v1 03/14] ring: eliminate duplication of size and mask fields X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Feb 2017 17:24:50 -0000 The size and mask fields are duplicated in both the producer and consumer data structures. Move them out of that into the top level structure so they are not duplicated. Signed-off-by: Bruce Richardson --- app/test/test_ring.c | 6 +++--- lib/librte_ring/rte_ring.c | 20 ++++++++++---------- lib/librte_ring/rte_ring.h | 32 ++++++++++++++++---------------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/app/test/test_ring.c b/app/test/test_ring.c index ebcb896..5f09097 100644 --- a/app/test/test_ring.c +++ b/app/test/test_ring.c @@ -148,7 +148,7 @@ check_live_watermark_change(__attribute__((unused)) void *dummy) } /* read watermark, the only change allowed is from 16 to 32 */ - watermark = r->prod.watermark; + watermark = r->watermark; if (watermark != watermark_old && (watermark_old != 16 || watermark != 32)) { printf("Bad watermark change %u -> %u\n", watermark_old, @@ -213,7 +213,7 @@ test_set_watermark( void ){ printf( " ring lookup failed\n" ); goto error; } - count = r->prod.size*2; + count = r->size * 2; setwm = rte_ring_set_water_mark(r, count); if (setwm != -EINVAL){ printf("Test failed to detect invalid watermark count value\n"); @@ -222,7 +222,7 @@ test_set_watermark( void ){ count = 0; rte_ring_set_water_mark(r, count); - if (r->prod.watermark != r->prod.size) { + if (r->watermark != r->size) { printf("Test failed to detect invalid watermark count value\n"); goto error; } diff --git a/lib/librte_ring/rte_ring.c b/lib/librte_ring/rte_ring.c index 4bc6da1..80fc356 100644 --- a/lib/librte_ring/rte_ring.c +++ b/lib/librte_ring/rte_ring.c @@ -144,11 +144,11 @@ rte_ring_init(struct rte_ring *r, const char *name, unsigned count, if (ret < 0 || ret >= (int)sizeof(r->name)) return -ENAMETOOLONG; r->flags = flags; - r->prod.watermark = count; + r->watermark = count; r->prod.sp_enqueue = !!(flags & RING_F_SP_ENQ); r->cons.sc_dequeue = !!(flags & RING_F_SC_DEQ); - r->prod.size = r->cons.size = count; - r->prod.mask = r->cons.mask = count-1; + r->size = count; + r->mask = count - 1; r->prod.head = r->cons.head = 0; r->prod.tail = r->cons.tail = 0; @@ -269,14 +269,14 @@ rte_ring_free(struct rte_ring *r) int rte_ring_set_water_mark(struct rte_ring *r, unsigned count) { - if (count >= r->prod.size) + if (count >= r->size) return -EINVAL; /* if count is 0, disable the watermarking */ if (count == 0) - count = r->prod.size; + count = r->size; - r->prod.watermark = count; + r->watermark = count; return 0; } @@ -291,17 +291,17 @@ rte_ring_dump(FILE *f, const struct rte_ring *r) fprintf(f, "ring <%s>@%p\n", r->name, r); fprintf(f, " flags=%x\n", r->flags); - fprintf(f, " size=%"PRIu32"\n", r->prod.size); + fprintf(f, " size=%"PRIu32"\n", r->size); fprintf(f, " ct=%"PRIu32"\n", r->cons.tail); fprintf(f, " ch=%"PRIu32"\n", r->cons.head); fprintf(f, " pt=%"PRIu32"\n", r->prod.tail); fprintf(f, " ph=%"PRIu32"\n", r->prod.head); fprintf(f, " used=%u\n", rte_ring_count(r)); fprintf(f, " avail=%u\n", rte_ring_free_count(r)); - if (r->prod.watermark == r->prod.size) + if (r->watermark == r->size) fprintf(f, " watermark=0\n"); else - fprintf(f, " watermark=%"PRIu32"\n", r->prod.watermark); + fprintf(f, " watermark=%"PRIu32"\n", r->watermark); /* sum and dump statistics */ #ifdef RTE_LIBRTE_RING_DEBUG @@ -318,7 +318,7 @@ rte_ring_dump(FILE *f, const struct rte_ring *r) sum.deq_fail_bulk += r->stats[lcore_id].deq_fail_bulk; sum.deq_fail_objs += r->stats[lcore_id].deq_fail_objs; } - fprintf(f, " size=%"PRIu32"\n", r->prod.size); + fprintf(f, " size=%"PRIu32"\n", r->size); fprintf(f, " enq_success_bulk=%"PRIu64"\n", sum.enq_success_bulk); fprintf(f, " enq_success_objs=%"PRIu64"\n", sum.enq_success_objs); fprintf(f, " enq_quota_bulk=%"PRIu64"\n", sum.enq_quota_bulk); diff --git a/lib/librte_ring/rte_ring.h b/lib/librte_ring/rte_ring.h index 0c8defd..6e75c15 100644 --- a/lib/librte_ring/rte_ring.h +++ b/lib/librte_ring/rte_ring.h @@ -143,13 +143,10 @@ struct rte_memzone; /* forward declaration, so as not to require memzone.h */ struct rte_ring_ht_ptr { 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. */ union { uint32_t sp_enqueue; /**< True, if single producer. */ uint32_t sc_dequeue; /**< True, if single consumer. */ }; - uint32_t watermark; /**< Max items before EDQUOT in producer. */ }; /** @@ -169,9 +166,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_ht_ptr prod __rte_aligned(RTE_CACHE_LINE_SIZE * 2); @@ -350,7 +350,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) { \ @@ -377,7 +377,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]; \ @@ -432,7 +432,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 @@ -480,7 +480,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); @@ -539,7 +539,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; @@ -575,7 +575,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); @@ -625,7 +625,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. */ @@ -722,7 +722,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; @@ -1051,7 +1051,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; } /** @@ -1084,7 +1084,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; } /** @@ -1100,7 +1100,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; } /** @@ -1114,7 +1114,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; } /** -- 2.9.3