diff options
Diffstat (limited to 'platform/linux-generic/schedule/scalable_ordered.c')
-rw-r--r-- | platform/linux-generic/schedule/scalable_ordered.c | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/platform/linux-generic/schedule/scalable_ordered.c b/platform/linux-generic/schedule/scalable_ordered.c index 90ddb61c9..9bc12f2ac 100644 --- a/platform/linux-generic/schedule/scalable_ordered.c +++ b/platform/linux-generic/schedule/scalable_ordered.c @@ -5,6 +5,7 @@ * * SPDX-License-Identifier: BSD-3-Clause */ +#include <config.h> #include <odp/api/shared_memory.h> #include <odp_queue_scalable_internal.h> @@ -71,10 +72,36 @@ bool rwin_reserve(reorder_window_t *rwin, uint32_t *sn) return true; } -void rwin_insert(reorder_window_t *rwin, - reorder_context_t *rctx, - uint32_t sn, - void (*callback)(reorder_context_t *)) +bool rwin_reserve_sc(reorder_window_t *rwin, uint32_t *sn) +{ + uint32_t head; + uint32_t oldt; + uint32_t newt; + uint32_t winmask; + + /* Read head and tail separately */ + oldt = rwin->tail; + winmask = rwin->winmask; + head = rwin->hc.head; + if (odp_unlikely(oldt - head >= winmask)) + return false; + newt = oldt + 1; + rwin->tail = newt; + *sn = oldt; + + return true; +} + +void rwin_unreserve_sc(reorder_window_t *rwin, uint32_t sn) +{ + ODP_ASSERT(rwin->tail == sn + 1); + rwin->tail = sn; +} + +static void rwin_insert(reorder_window_t *rwin, + reorder_context_t *rctx, + uint32_t sn, + void (*callback)(reorder_context_t *)) { /* Initialise to silence scan-build */ hc_t old = {0, 0}; @@ -172,7 +199,7 @@ void rctx_init(reorder_context_t *rctx, uint16_t idx, rctx->numevts = 0; } -inline void rctx_free(const reorder_context_t *rctx) +static inline void rctx_free(const reorder_context_t *rctx) { const reorder_context_t *const base = &rctx[-(int)rctx->idx]; const uint32_t first = rctx->idx; @@ -206,8 +233,9 @@ inline void rctx_free(const reorder_context_t *rctx) } } -inline void olock_unlock(const reorder_context_t *rctx, reorder_window_t *rwin, - uint32_t lock_index) +static inline void olock_unlock(const reorder_context_t *rctx, + reorder_window_t *rwin, + uint32_t lock_index) { if ((rctx->olock_flags & (1U << lock_index)) == 0) { /* Use relaxed ordering, we are not releasing any updates */ @@ -215,10 +243,10 @@ inline void olock_unlock(const reorder_context_t *rctx, reorder_window_t *rwin, } } -void olock_release(const reorder_context_t *rctx) +static void olock_release(const reorder_context_t *rctx) { reorder_window_t *rwin; - int i; + uint32_t i; rwin = rctx->rwin; @@ -246,7 +274,7 @@ static void blocking_enqueue(queue_entry_t *q, odp_buffer_hdr_t **evts, int num) } } -void rctx_retire(reorder_context_t *first) +static void rctx_retire(reorder_context_t *first) { reorder_context_t *rctx; queue_entry_t *q; |