diff options
author | Matias Elo <matias.elo@nokia.com> | 2023-09-21 15:01:21 +0300 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2023-10-20 22:53:40 +0300 |
commit | 9eef10280a69045b92cbf85aafc6ca30fb1f99a0 (patch) | |
tree | 0b37e3e91ee0fc3bbe299a7ec2b015de72bd024d | |
parent | f0c021b25c63ccc0d06800a75aebd90d54a63dea (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.h | 5 | ||||
-rw-r--r-- | platform/linux-generic/odp_queue_basic.c | 24 | ||||
-rw-r--r-- | platform/linux-generic/odp_queue_if.c | 8 | ||||
-rw-r--r-- | platform/linux-generic/odp_queue_scalable.c | 24 |
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 ? ¶m[0] : ¶m[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 ? ¶m[0] : ¶m[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, |