aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2023-09-21 15:01:21 +0300
committerMatias Elo <matias.elo@nokia.com>2023-10-20 22:53:40 +0300
commit9eef10280a69045b92cbf85aafc6ca30fb1f99a0 (patch)
tree0b37e3e91ee0fc3bbe299a7ec2b015de72bd024d
parentf0c021b25c63ccc0d06800a75aebd90d54a63dea (diff)
linux-gen: queue: implement odp_queue_create_multi() function
Implement new odp_queue_create_multi() function for creating multiple queues with a single call. Signed-off-by: Matias Elo <matias.elo@nokia.com> Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
-rw-r--r--platform/linux-generic/include/odp/api/plat/queue_inline_types.h5
-rw-r--r--platform/linux-generic/odp_queue_basic.c24
-rw-r--r--platform/linux-generic/odp_queue_if.c8
-rw-r--r--platform/linux-generic/odp_queue_scalable.c24
4 files changed, 61 insertions, 0 deletions
diff --git a/platform/linux-generic/include/odp/api/plat/queue_inline_types.h b/platform/linux-generic/include/odp/api/plat/queue_inline_types.h
index e957785c4..9ad037e4d 100644
--- a/platform/linux-generic/include/odp/api/plat/queue_inline_types.h
+++ b/platform/linux-generic/include/odp/api/plat/queue_inline_types.h
@@ -1,4 +1,5 @@
/* Copyright (c) 2018, Linaro Limited
+ * Copyright (c) 2023, Nokia
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
@@ -32,6 +33,10 @@ typedef struct _odp_queue_inline_offset_t {
typedef struct {
odp_queue_t (*queue_create)(const char *name,
const odp_queue_param_t *param);
+ int (*queue_create_multi)(const char *name[],
+ const odp_queue_param_t param[],
+ odp_bool_t share_param, odp_queue_t queue[],
+ int num);
int (*queue_destroy)(odp_queue_t queue);
odp_queue_t (*queue_lookup)(const char *name);
int (*queue_capability)(odp_queue_capability_t *capa);
diff --git a/platform/linux-generic/odp_queue_basic.c b/platform/linux-generic/odp_queue_basic.c
index 83694f84f..70f05be0e 100644
--- a/platform/linux-generic/odp_queue_basic.c
+++ b/platform/linux-generic/odp_queue_basic.c
@@ -370,6 +370,29 @@ static odp_queue_t queue_create(const char *name,
return handle;
}
+static int queue_create_multi(const char *name[], const odp_queue_param_t param[],
+ odp_bool_t share_param, odp_queue_t queue[], int num)
+{
+ int i;
+
+ _ODP_ASSERT(param != NULL);
+ _ODP_ASSERT(queue != NULL);
+ _ODP_ASSERT(num > 0);
+
+ for (i = 0; i < num; i++) {
+ odp_queue_t cur_queue;
+ const char *cur_name = name != NULL ? name[i] : NULL;
+ const odp_queue_param_t *cur_param = share_param ? &param[0] : &param[i];
+
+ cur_queue = queue_create(cur_name, cur_param);
+ if (cur_queue == ODP_QUEUE_INVALID)
+ return (i == 0) ? -1 : i;
+
+ queue[i] = cur_queue;
+ }
+ return i;
+}
+
void _odp_sched_queue_set_status(uint32_t queue_index, int status)
{
queue_entry_t *queue = qentry_from_index(queue_index);
@@ -1221,6 +1244,7 @@ static odp_event_t queue_api_deq(odp_queue_t handle)
/* API functions */
_odp_queue_api_fn_t _odp_queue_basic_api = {
.queue_create = queue_create,
+ .queue_create_multi = queue_create_multi,
.queue_destroy = queue_destroy,
.queue_lookup = queue_lookup,
.queue_capability = queue_capability,
diff --git a/platform/linux-generic/odp_queue_if.c b/platform/linux-generic/odp_queue_if.c
index b702e0105..fc08fdca8 100644
--- a/platform/linux-generic/odp_queue_if.c
+++ b/platform/linux-generic/odp_queue_if.c
@@ -1,4 +1,5 @@
/* Copyright (c) 2017, ARM Limited
+ * Copyright (c) 2023, Nokia
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
@@ -36,6 +37,13 @@ odp_queue_t odp_queue_create(const char *name, const odp_queue_param_t *param)
return _odp_queue_api->queue_create(name, param);
}
+int odp_queue_create_multi(const char *name[], const odp_queue_param_t param[],
+ odp_bool_t share_param, odp_queue_t queue[], int num)
+{
+ return _odp_queue_api->queue_create_multi(name, param, share_param,
+ queue, num);
+}
+
int odp_queue_destroy(odp_queue_t queue)
{
return _odp_queue_api->queue_destroy(queue);
diff --git a/platform/linux-generic/odp_queue_scalable.c b/platform/linux-generic/odp_queue_scalable.c
index 4a4be1ecf..1c7e8f91e 100644
--- a/platform/linux-generic/odp_queue_scalable.c
+++ b/platform/linux-generic/odp_queue_scalable.c
@@ -399,6 +399,29 @@ static odp_queue_t queue_create(const char *name,
return handle;
}
+static int queue_create_multi(const char *name[], const odp_queue_param_t param[],
+ odp_bool_t share_param, odp_queue_t queue[], int num)
+{
+ int i;
+
+ _ODP_ASSERT(param != NULL);
+ _ODP_ASSERT(queue != NULL);
+ _ODP_ASSERT(num > 0);
+
+ for (i = 0; i < num; i++) {
+ odp_queue_t cur_queue;
+ const char *cur_name = name != NULL ? name[i] : NULL;
+ const odp_queue_param_t *cur_param = share_param ? &param[0] : &param[i];
+
+ cur_queue = queue_create(cur_name, cur_param);
+ if (cur_queue == ODP_QUEUE_INVALID)
+ return (i == 0) ? -1 : i;
+
+ queue[i] = cur_queue;
+ }
+ return i;
+}
+
static int queue_destroy(odp_queue_t handle)
{
queue_entry_t *queue;
@@ -1137,6 +1160,7 @@ static void queue_timer_rem(odp_queue_t handle)
/* API functions */
_odp_queue_api_fn_t _odp_queue_scalable_api = {
.queue_create = queue_create,
+ .queue_create_multi = queue_create_multi,
.queue_destroy = queue_destroy,
.queue_lookup = queue_lookup,
.queue_capability = queue_capability,