Move the odp_schedule_order_lock() and odp_schedule_order_unlock() routines from odp_queue.c to odp_schedule.c
Signed-off-by: Bill Fischofer <bill.fischo...@linaro.org> --- platform/linux-generic/odp_queue.c | 31 ------------------------ platform/linux-generic/odp_schedule.c | 45 ++++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/platform/linux-generic/odp_queue.c b/platform/linux-generic/odp_queue.c index 1c15e17..2071870 100644 --- a/platform/linux-generic/odp_queue.c +++ b/platform/linux-generic/odp_queue.c @@ -22,7 +22,6 @@ #include <odp_debug_internal.h> #include <odp/hints.h> #include <odp/sync.h> -#include <odp_spin_internal.h> #ifdef USE_TICKETLOCK #include <odp/ticketlock.h> @@ -1015,33 +1014,3 @@ int release_order(queue_entry_t *origin_qe, uint64_t order, UNLOCK(&origin_qe->s.lock); return 0; } - -void odp_schedule_order_lock(unsigned lock_index) -{ - queue_entry_t *origin_qe; - uint64_t *sync; - - get_sched_sync(&origin_qe, &sync, lock_index); - if (!origin_qe || lock_index >= origin_qe->s.param.sched.lock_count) - return; - - /* Wait until we are in order. Note that sync_out will be incremented - * both by unlocks as well as order resolution, so we're OK if only - * some events in the ordered flow need to lock. - */ - while (*sync > odp_atomic_load_u64(&origin_qe->s.sync_out[lock_index])) - odp_spin(); -} - -void odp_schedule_order_unlock(unsigned lock_index) -{ - queue_entry_t *origin_qe; - uint64_t *sync; - - get_sched_sync(&origin_qe, &sync, lock_index); - if (!origin_qe || lock_index >= origin_qe->s.param.sched.lock_count) - return; - - /* Release the ordered lock */ - odp_atomic_fetch_inc_u64(&origin_qe->s.sync_out[lock_index]); -} diff --git a/platform/linux-generic/odp_schedule.c b/platform/linux-generic/odp_schedule.c index 6df8073..195240e 100644 --- a/platform/linux-generic/odp_schedule.c +++ b/platform/linux-generic/odp_schedule.c @@ -22,6 +22,7 @@ #include <odp_queue_internal.h> #include <odp_packet_io_internal.h> +#include <odp_spin_internal.h> odp_thrmask_t sched_mask_all; @@ -793,6 +794,44 @@ void odp_schedule_prefetch(int num ODP_UNUSED) { } +void odp_schedule_order_lock(unsigned lock_index) +{ + queue_entry_t *origin_qe; + uint64_t sync, sync_out; + + origin_qe = sched_local.origin_qe; + if (!origin_qe || lock_index >= origin_qe->s.param.sched.lock_count) + return; + + sync = sched_local.sync[lock_index]; + sync_out = odp_atomic_load_u64(&origin_qe->s.sync_out[lock_index]); + ODP_ASSERT(sync >= sync_out); + + /* Wait until we are in order. Note that sync_out will be incremented + * both by unlocks as well as order resolution, so we're OK if only + * some events in the ordered flow need to lock. + */ + while (sync != sync_out) { + odp_spin(); + sync_out = + odp_atomic_load_u64(&origin_qe->s.sync_out[lock_index]); + } +} + +void odp_schedule_order_unlock(unsigned lock_index) +{ + queue_entry_t *origin_qe; + + origin_qe = sched_local.origin_qe; + if (!origin_qe || lock_index >= origin_qe->s.param.sched.lock_count) + return; + ODP_ASSERT(sched_local.sync[lock_index] == + odp_atomic_load_u64(&origin_qe->s.sync_out[lock_index])); + + /* Release the ordered lock */ + odp_atomic_fetch_inc_u64(&origin_qe->s.sync_out[lock_index]); +} + void sched_enq_called(void) { sched_local.enq_called = 1; @@ -804,12 +843,6 @@ void get_sched_order(queue_entry_t **origin_qe, uint64_t *order) *order = sched_local.order; } -void get_sched_sync(queue_entry_t **origin_qe, uint64_t **sync, uint32_t ndx) -{ - *origin_qe = sched_local.origin_qe; - *sync = &sched_local.sync[ndx]; -} - void sched_order_resolved(odp_buffer_hdr_t *buf_hdr) { if (buf_hdr) -- 2.1.4 _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp