aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/schedule/scalable_ordered.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linux-generic/schedule/scalable_ordered.c')
-rw-r--r--platform/linux-generic/schedule/scalable_ordered.c48
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;