diff options
author | Petri Savolainen <petri.savolainen@nokia.com> | 2016-02-05 12:30:45 +0200 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2016-02-08 20:45:25 +0300 |
commit | 1e861d42fbf7124e40538f74b8a6e29b57867d03 (patch) | |
tree | cd416f24dc06695902587d5e96c2eb3413633087 /platform | |
parent | f73b184d369566df34bc7242852fb1ebad0117d5 (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.c | 23 |
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 |