61static ENV_LOCAL
unsigned int _queue_tbl_iter_idx;
64 EM_QUEUE_NAME_LEN_OVER_ODP_LIMIT);
70 const char *err_str =
"";
74 if (unlikely(
em_shm->
opt.queue.num_dynamic == 0)) {
76 "Dynamic queues not configured!");
84 queue_param_apply_conf(¶m, conf);
86 queue = queue_create_param(name, ¶m, &err_str);
99 const char *err_str =
"";
100 em_queue_t queue_static;
106 "Static queues not configured!");
110 "Invalid static queue requested:%" PRI_QUEUE "",
114 iq.queue_id >
em_shm->queue_tbl.last_static_queue_id,
116 "Static queue id:%u out of range (%u-%u)",
118 em_shm->queue_tbl.first_static_queue_id,
119 em_shm->queue_tbl.last_static_queue_id);
126 queue_param_apply_conf(¶m, conf);
128 queue_static = queue_create_param(name, ¶m, &err_str);
131 "Static queue:%" PRI_QUEUE " creation failed: %s", queue, err_str);
133 if (unlikely(queue_static != queue)) {
134 const char *qdel_err =
"queue cleanup ok";
139 EM_ESCOPE_QUEUE_CREATE_STATIC,
141 queue, queue_static);
143 (void)queue_delete(q_elem, &qdel_err);
147 queue, queue_static, qdel_err);
157 "Invalid args: num_aggr=%u (valid: 1..%u), aggr_conf=%p",
165 for (uint32_t i = 0; i < num_aggr; i++) {
174 if (unlikely(!param)) {
176 "Invalid arg: param=%p", param);
195 "Invalid queue param: Use em_queue_param_init() before create");
199 const char *err_str =
"";
200 em_queue_t queue = queue_create_param(name, param, &err_str);
212 const char *del_err =
"unknown error";
218 status = queue_delete(q_elem, &del_err);
235 queue_elem->
context = (
void *)(uintptr_t)context;
250 if (unlikely(
EM_CHECK_LEVEL >= 2 && !queue_allocated(queue_elem))) {
252 "Queue:%" PRI_QUEUE " not created!", queue);
264 unlikely(name == NULL || maxlen == 0)) {
266 "Invalid ptr or maxlen (name=0x%" PRIx64
", maxlen=%zu)",
274 unlikely(queue_elem == NULL || !queue_allocated(queue_elem))) {
280 return queue_name(queue_elem, name, maxlen);
287 for (
unsigned int i = 0; i <
em_shm->queue_tbl.max_queue_num; i++) {
289 &
em_shm->queue_tbl.queue_elem[i];
291 if (queue_allocated(q_elem) &&
293 return (em_queue_t)(uintptr_t)
294 em_shm->queue_tbl.queue_elem[i].queue;
306 unlikely(queue_elem == NULL || !queue_allocated(queue_elem))) {
320 unlikely(queue_elem == NULL || !queue_allocated(queue_elem))) {
322 "Invalid queue-id:%" PRI_QUEUE "", queue);
326 return queue_elem->
type;
331 if (unlikely(
em_shm->
opt.queue.num_static == 0)) {
333 EM_ESCOPE_QUEUE_STATIC_HANDLE,
334 "Static queues not configured!");
338 if (unlikely(static_offset >=
em_shm->
opt.queue.num_static)) {
340 EM_ESCOPE_QUEUE_STATIC_HANDLE,
341 "Static offset %u out of range (0-%u)!",
347 return queue_id2hdl(
em_shm->queue_tbl.first_static_queue_id + static_offset);
355 unlikely(q_elem == NULL || !queue_allocated(q_elem))) {
372 if (unlikely(q_elem == NULL || !queue_allocated(q_elem))) {
391 "Invalid EM queue:%" PRI_QUEUE "", queue);
397 "Queue:%" PRI_QUEUE " not created", queue);
404 "Queue is not unscheduled, cannot dequeue!");
408 event = queue_dequeue(q_elem);
413 em_event_t events[],
int num)
419 unlikely(!q_elem || !events || num < 0)) {
421 "Inv.args: Q:%" PRI_QUEUE " events[]:%p num:%d",
428 "Queue:%" PRI_QUEUE " not created", queue);
432 if (unlikely(num == 0))
438 EM_ESCOPE_QUEUE_DEQUEUE_MULTI,
439 "Queue is not unscheduled, cannot dequeue!");
443 ret = queue_dequeue_multi(q_elem, events , num);
444 if (unlikely(ret < 0)) {
446 EM_ESCOPE_QUEUE_DEQUEUE_MULTI,
447 "odp_queue_deq_multi(%d):%d", num, ret);
456 return queue_current();
462 const unsigned int queue_cnt = queue_count();
463 const unsigned int max_queues =
em_shm->queue_tbl.max_queue_num;
465 _queue_tbl_iter_idx = 0;
470 if (queue_cnt == 0) {
471 _queue_tbl_iter_idx = max_queues;
476 while (!queue_allocated(&queue_tbl->queue_elem[_queue_tbl_iter_idx])) {
477 _queue_tbl_iter_idx++;
478 if (_queue_tbl_iter_idx >= max_queues)
482 return queue_idx2hdl(_queue_tbl_iter_idx);
487 const unsigned int max_queues =
em_shm->queue_tbl.max_queue_num;
489 if (_queue_tbl_iter_idx >= max_queues - 1)
492 _queue_tbl_iter_idx++;
497 while (!queue_allocated(&queue_tbl->queue_elem[_queue_tbl_iter_idx])) {
498 _queue_tbl_iter_idx++;
499 if (_queue_tbl_iter_idx >= max_queues)
503 return queue_idx2hdl(_queue_tbl_iter_idx);
509 const int queue_idx = queue_id2idx(iq.queue_id);
511 if (unlikely((uint16_t)queue_idx >
em_shm->queue_tbl.max_queue_num - 1))
520 &
em_shm->queue_tbl.queue_elem[queue_idx];
521 if (unlikely(q_elem == NULL || !queue_allocated(q_elem)))
529 "Bad arg, invalid queue:%" PRI_QUEUE ":\n"
530 " Q.device-id:0x%" PRIx16
" Q.id:0x%" PRIx16
"",
531 queue, iq.device_id, iq.queue_id);
532 return queue_idx %
em_shm->queue_tbl.max_queue_num;
539 "EM not initialized!");
542 if (num_runtime != NULL)
550 return em_shm->queue_tbl.max_queue_num;
555 return MAX_INTERNAL_QUEUES;
575 const queue_elem_t *q_elem = queue_elem_get(parent_queue);
578 unlikely(!q_elem || !queue_allocated(q_elem))) {
580 "Invalid arg: parent_queue=%" PRI_QUEUE "", parent_queue);
587 return q_elem->aggr_parent.
num_aggr;
592 const queue_elem_t *q_elem = queue_elem_get(parent_queue);
595 unlikely(!q_elem || !queue_allocated(q_elem))) {
597 "Invalid arg: parent_queue=%" PRI_QUEUE "", parent_queue);
602 aggr_index >= q_elem->aggr_parent.
num_aggr))
605 return (em_queue_t)(uintptr_t)q_elem->aggr_parent.
aggr_queues[aggr_index];
609 em_queue_t aggr_list[], uint32_t max,
612 const queue_elem_t *q_elem = queue_elem_get(parent_queue);
615 unlikely(!q_elem || !queue_allocated(q_elem))) {
617 "Invalid arg: parent_queue=%" PRI_QUEUE "", parent_queue);
627 const uint32_t num = q_elem->aggr_parent.
num_aggr;
628 const uint32_t num_out = MIN(num, max);
632 if (!aggr_list || num_out == 0)
635 for (uint32_t i = 0; i < num_out; i++)
636 aggr_list[i] = (em_queue_t)(uintptr_t)q_elem->aggr_parent.
aggr_queues[i];
643 uint32_t max, uint32_t *num_aggr )
645 const queue_elem_t *q_elem = queue_elem_get(parent_queue);
648 unlikely(!q_elem || !queue_allocated(q_elem))) {
650 "Invalid args: parent_queue=%" PRI_QUEUE "", parent_queue);
660 const uint32_t num = q_elem->aggr_parent.
num_aggr;
661 const uint32_t num_out = MIN(num, max);
665 if (!aggr_info || num_out == 0)
668 for (uint32_t i = 0; i < num_out; i++) {
669 em_queue_t aggr_queue = (em_queue_t)(uintptr_t)q_elem->aggr_parent.
aggr_queues[i];
672 if (unlikely(!aggr_qelem)) {
675 parent_queue, aggr_queue, i);
680 unlikely(!queue_allocated(aggr_qelem) ||
685 " aggr-Q:{type=%u, parent-Q=%" PRI_QUEUE "}",
686 parent_queue, aggr_queue, i,
691 aggr_info[i].
queue = aggr_queue;
692 aggr_info[i].
pool = aggr_qelem->aggr.
pool;
715void em_queue_ids(em_queue_t queue, uint16_t *device_id , uint16_t *qid )
719 if (likely(device_id))
720 *device_id = iq.device_id;
734 uint64_t queue_uptr = (uintptr_t)queue;
735 uint32_t queue_u32 = (uint32_t)(queue_uptr & UINT32_MAX);
#define INTERNAL_ERROR(error, escope, fmt,...)
#define RETURN_ERROR_IF(cond, error, escope, fmt,...)
#define EM_CHECK_INIT_CALLED
#define EM_QUEUE_MAX_AGGR
#define EM_QUEUE_PRIO_NUM
#define EM_QUEUE_NAME_LEN
#define EM_QUEUE_GROUP_UNDEF
#define EM_ATOMIC_GROUP_UNDEF
void em_queue_ids(em_queue_t queue, uint16_t *device_id, uint16_t *qid)
em_queue_t em_queue_static_handle(uint16_t static_offset)
em_queue_t em_queue_handle_raw(uint16_t device_id, uint16_t qid)
em_event_t em_queue_dequeue(em_queue_t queue)
uint32_t em_queue_aggr_list(em_queue_t parent_queue, em_queue_t aggr_list[], uint32_t max, uint32_t *num_aggr)
em_atomic_group_t em_queue_agroup(em_queue_t queue)
void * em_queue_context(em_queue_t queue)
uint32_t em_queue_aggr_info(em_queue_t parent_queue, em_queue_aggr_info_t aggr_info[], uint32_t max, uint32_t *num_aggr)
uint16_t em_queue_qid(em_queue_t queue)
int em_queue_dequeue_multi(em_queue_t queue, em_event_t events[], int num)
em_status_t em_queue_delete(em_queue_t queue)
int em_queue_static_max_num(void)
#define EM_QUEUE_PRIO_UNDEF
uint16_t em_queue_device_id(em_queue_t queue)
int em_queue_max_num(void)
void em_queue_param_init(em_queue_param_t *param)
em_status_t em_queue_set_context(em_queue_t queue, const void *context)
size_t em_queue_name(em_queue_t queue, char *name, size_t maxlen)
int em_queue_num_prio(int *num_runtime)
em_queue_prio_t em_queue_priority(em_queue_t queue)
int em_queue_dynamic_max_num(void)
int em_queue_index(em_queue_t queue)
em_queue_type_t em_queue_type(em_queue_t queue)
void em_queue_aggr_conf_init(uint32_t num_aggr, em_queue_aggr_conf_t aggr_conf[])
#define EM_QUEUE_FLAG_DEFAULT
em_status_t em_queue_create_static(const char *name, em_queue_type_t type, em_queue_prio_t prio, em_queue_group_t queue_group, em_queue_t queue, const em_queue_conf_t *conf)
uint32_t em_queue_aggr_num(em_queue_t parent_queue)
em_queue_group_t em_queue_qgroup(em_queue_t queue)
em_queue_t em_queue_create_param(const char *name, const em_queue_param_t *param)
uint32_t em_queue_to_u32(em_queue_t queue)
em_queue_t em_queue_find(const char *name)
em_queue_t em_queue_first(unsigned int *num)
em_queue_t em_queue_aggr(em_queue_t parent_queue, uint32_t aggr_index)
int em_queue_aggr_max_num(void)
em_queue_t em_queue_create(const char *name, em_queue_type_t type, em_queue_prio_t prio, em_queue_group_t queue_group, const em_queue_conf_t *conf)
em_queue_t em_queue_next(void)
int em_queue_internal_max_num(void)
em_queue_t em_queue_current(void)
@ EM_QUEUE_TYPE_UNSCHEDULED
em_event_type_t event_type
uint32_t __internal_check
em_event_type_t event_type
uint32_t __internal_check
em_atomic_group_t atomic_group
em_queue_group_t queue_group
struct em_shm_t::@53 queue_prio
em_event_type_t event_type
uint32_t aggr_queues[EM_QUEUE_MAX_AGGR]
em_atomic_group_t atomic_group
q_elem_atomic_group_t agrp
em_queue_group_t queue_group