aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@nokia.com>2016-02-05 12:30:45 +0200
committerMaxim Uvarov <maxim.uvarov@linaro.org>2016-02-08 20:45:25 +0300
commit1e861d42fbf7124e40538f74b8a6e29b57867d03 (patch)
treecd416f24dc06695902587d5e96c2eb3413633087 /platform
parentf73b184d369566df34bc7242852fb1ebad0117d5 (diff)
api: queue: add enq and deq mode params
Enqueue and dequeue mode parameters are needed to e.g. deny direct dequeue operations on scheduled or packet output queues. Additionally, application may inform implementation about intended usage (e.g. will not enqueue into packet input queue) and synchronization needs (application synchronizes enq/deq calls). There is possibility to add modes later on. For example, a dedicated, single thread mode could be added, which would pin a queue (enq or deq end) to a dedicated thread. Signed-off-by: Petri Savolainen <petri.savolainen@nokia.com> Reviewed-and-tested-by: Bill Fischofer <bill.fischofer@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'platform')
-rw-r--r--platform/linux-generic/odp_queue.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/platform/linux-generic/odp_queue.c b/platform/linux-generic/odp_queue.c
index 232692827..dbe2d9ce7 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/odp_queue.c
@@ -87,25 +87,29 @@ queue_entry_t *get_qentry(uint32_t queue_id)
}
static int queue_init(queue_entry_t *queue, const char *name,
- odp_queue_type_t type, const odp_queue_param_t *param)
+ const odp_queue_param_t *param)
{
strncpy(queue->s.name, name, ODP_QUEUE_NAME_LEN - 1);
- queue->s.type = type;
if (param) {
memcpy(&queue->s.param, param, sizeof(odp_queue_param_t));
if (queue->s.param.sched.lock_count >
ODP_CONFIG_MAX_ORDERED_LOCKS_PER_QUEUE)
return -1;
+
+ if (param->type == ODP_QUEUE_TYPE_SCHED)
+ queue->s.param.deq_mode = ODP_QUEUE_OP_DISABLED;
} else {
/* Defaults */
- memset(&queue->s.param, 0, sizeof(odp_queue_param_t));
+ odp_queue_param_init(&queue->s.param);
queue->s.param.sched.prio = ODP_SCHED_PRIO_DEFAULT;
queue->s.param.sched.sync = ODP_SCHED_SYNC_ATOMIC;
queue->s.param.sched.group = ODP_SCHED_GROUP_ALL;
}
- switch (type) {
+ queue->s.type = queue->s.param.type;
+
+ switch (queue->s.type) {
case ODP_QUEUE_TYPE_PKTIN:
queue->s.enqueue = pktin_enqueue;
queue->s.dequeue = pktin_dequeue;
@@ -257,11 +261,6 @@ odp_queue_t odp_queue_create(const char *name, const odp_queue_param_t *param)
odp_queue_t handle = ODP_QUEUE_INVALID;
odp_queue_type_t type;
- if (param == NULL)
- type = ODP_QUEUE_TYPE_PLAIN;
- else
- type = param->type;
-
for (i = 0; i < ODP_CONFIG_QUEUES; i++) {
queue = &queue_tbl->queue[i];
@@ -270,11 +269,13 @@ odp_queue_t odp_queue_create(const char *name, const odp_queue_param_t *param)
LOCK(&queue->s.lock);
if (queue->s.status == QUEUE_STATUS_FREE) {
- if (queue_init(queue, name, type, param)) {
+ if (queue_init(queue, name, param)) {
UNLOCK(&queue->s.lock);
return handle;
}
+ type = queue->s.type;
+
if (type == ODP_QUEUE_TYPE_SCHED ||
type == ODP_QUEUE_TYPE_PKTIN)
queue->s.status = QUEUE_STATUS_NOTSCHED;
@@ -952,6 +953,8 @@ void odp_queue_param_init(odp_queue_param_t *params)
{
memset(params, 0, sizeof(odp_queue_param_t));
params->type = ODP_QUEUE_TYPE_PLAIN;
+ params->enq_mode = ODP_QUEUE_OP_MT;
+ params->deq_mode = ODP_QUEUE_OP_MT;
}
/* These routines exists here rather than in odp_schedule