On 31 March 2017 at 15:21, Maxim Uvarov <[email protected]> wrote: > On 03/28/17 22:23, Brian Brooks wrote: >> From: Ola Liljedahl <[email protected]> >> >> Signed-off-by: Ola Liljedahl <[email protected]> >> Reviewed-by: Brian Brooks <[email protected]> >> --- >> platform/linux-generic/pktio/ring.c | 30 ++++++++++++++---------------- >> 1 file changed, 14 insertions(+), 16 deletions(-) >> mode change 100644 => 100755 platform/linux-generic/pktio/ring.c >> >> diff --git a/platform/linux-generic/pktio/ring.c >> b/platform/linux-generic/pktio/ring.c >> old mode 100644 >> new mode 100755 > > > no need of setting executable permissions to c file. And of course you Very strange. I can assure you that I have not actively changed permissions on this file (I made the original changes on our local copy).
> have to run checkpatch.pl or push that code to github and it will do all > required checks. > > I will fix it, no need to resend. > > Maxim. > >> index aeda04b2..e3c73d1c >> --- a/platform/linux-generic/pktio/ring.c >> +++ b/platform/linux-generic/pktio/ring.c >> @@ -263,8 +263,8 @@ int ___ring_mp_do_enqueue(_ring_t *r, void * const >> *obj_table, >> /* Reset n to the initial burst count */ >> n = max; >> >> - prod_head = r->prod.head; >> - cons_tail = r->cons.tail; >> + prod_head = __atomic_load_n(&r->prod.head, __ATOMIC_RELAXED); >> + cons_tail = __atomic_load_n(&r->cons.tail, __ATOMIC_ACQUIRE); >> /* The subtraction is done between two unsigned 32bits value >> * (the result is always modulo 32 bits even if we have >> * prod_head > cons_tail). So 'free_entries' is always between >> 0 >> @@ -306,12 +306,12 @@ int ___ring_mp_do_enqueue(_ring_t *r, void * const >> *obj_table, >> * If there are other enqueues in progress that preceded us, >> * we need to wait for them to complete >> */ >> - while (odp_unlikely(r->prod.tail != prod_head)) >> + while (odp_unlikely(__atomic_load_n(&r->prod.tail, __ATOMIC_RELAXED) != >> + prod_head)) >> odp_cpu_pause(); >> >> /* Release our entries and the memory they refer to */ >> - __atomic_thread_fence(__ATOMIC_RELEASE); >> - r->prod.tail = prod_next; >> + __atomic_store_n(&r->prod.tail, prod_next, __ATOMIC_RELEASE); >> return ret; >> } >> >> @@ -328,7 +328,7 @@ int ___ring_sp_do_enqueue(_ring_t *r, void * const >> *obj_table, >> int ret; >> >> prod_head = r->prod.head; >> - cons_tail = r->cons.tail; >> + cons_tail = __atomic_load_n(&r->cons.tail, __ATOMIC_ACQUIRE); >> /* The subtraction is done between two unsigned 32bits value >> * (the result is always modulo 32 bits even if we have >> * prod_head > cons_tail). So 'free_entries' is always between 0 >> @@ -361,8 +361,7 @@ int ___ring_sp_do_enqueue(_ring_t *r, void * const >> *obj_table, >> } >> >> /* Release our entries and the memory they refer to */ >> - __atomic_thread_fence(__ATOMIC_RELEASE); >> - r->prod.tail = prod_next; >> + __atomic_store_n(&r->prod.tail, prod_next, __ATOMIC_RELEASE); >> return ret; >> } >> >> @@ -385,8 +384,8 @@ int ___ring_mc_do_dequeue(_ring_t *r, void **obj_table, >> /* Restore n as it may change every loop */ >> n = max; >> >> - cons_head = r->cons.head; >> - prod_tail = r->prod.tail; >> + cons_head = __atomic_load_n(&r->cons.head, __ATOMIC_RELAXED); >> + prod_tail = __atomic_load_n(&r->prod.tail, __ATOMIC_ACQUIRE); >> /* The subtraction is done between two unsigned 32bits value >> * (the result is always modulo 32 bits even if we have >> * cons_head > prod_tail). So 'entries' is always between 0 >> @@ -419,12 +418,12 @@ int ___ring_mc_do_dequeue(_ring_t *r, void **obj_table, >> * If there are other dequeues in progress that preceded us, >> * we need to wait for them to complete >> */ >> - while (odp_unlikely(r->cons.tail != cons_head)) >> + while (odp_unlikely(__atomic_load_n(&r->cons.tail, __ATOMIC_RELAXED) != >> + cons_head)) >> odp_cpu_pause(); >> >> /* Release our entries and the memory they refer to */ >> - __atomic_thread_fence(__ATOMIC_RELEASE); >> - r->cons.tail = cons_next; >> + __atomic_store_n(&r->cons.tail, cons_next, __ATOMIC_RELEASE); >> >> return behavior == _RING_QUEUE_FIXED ? 0 : n; >> } >> @@ -441,7 +440,7 @@ int ___ring_sc_do_dequeue(_ring_t *r, void **obj_table, >> uint32_t mask = r->prod.mask; >> >> cons_head = r->cons.head; >> - prod_tail = r->prod.tail; >> + prod_tail = __atomic_load_n(&r->prod.tail, __ATOMIC_ACQUIRE); >> /* The subtraction is done between two unsigned 32bits value >> * (the result is always modulo 32 bits even if we have >> * cons_head > prod_tail). So 'entries' is always between 0 >> @@ -461,11 +460,10 @@ int ___ring_sc_do_dequeue(_ring_t *r, void **obj_table, >> r->cons.head = cons_next; >> >> /* Acquire the pointers and the memory they refer to */ >> - __atomic_thread_fence(__ATOMIC_ACQUIRE); >> /* copy in table */ >> DEQUEUE_PTRS(); >> >> - r->cons.tail = cons_next; >> + __atomic_store_n(&r->cons.tail, cons_next, __ATOMIC_RELEASE); >> return behavior == _RING_QUEUE_FIXED ? 0 : n; >> } >> >> >
