62static ENV_LOCAL
unsigned int _agrp_tbl_iter_idx;
64static ENV_LOCAL
unsigned int _agrp_q_iter_idx;
65static ENV_LOCAL em_atomic_group_t _agrp_q_iter_agrp;
72 const char *err_str =
"";
76 if (unlikely(invalid_qgrp(queue_group))) {
78 err_str =
"Invalid queue group!";
83 atomic_group = atomic_group_alloc();
87 err_str =
"Atomic group allocation failed!";
92 ag_elem = atomic_group_elem_get(atomic_group);
93 if (unlikely(!ag_elem)) {
96 err_str =
"Atomic group allocation failed: ag_elem NULL!";
100 odp_ticketlock_init(&ag_elem->lock);
101 ag_elem->dispatch_lock.lock_and_evcnt = 0;
102 ag_elem->dispatch_lock.parts.wrap = WRAP_PROTECT;
110 strncpy(ag_elem->
name, name,
sizeof(ag_elem->
name) - 1);
111 ag_elem->
name[
sizeof(ag_elem->
name) - 1] =
'\0';
113 ag_elem->
name[0] =
'\0';
119 unsigned int num_obj = 0;
120 odp_stash_capability_t stash_capa;
121 odp_stash_param_t stash_param;
123 ret = odp_stash_capability(&stash_capa, ODP_STASH_TYPE_FIFO);
126 err_str =
"odp_stash_capability() failed!";
130 odp_stash_param_init(&stash_param);
132 stash_param.type = ODP_STASH_TYPE_FIFO;
133 stash_param.put_mode = ODP_STASH_OP_MT;
135 stash_param.get_mode = ODP_STASH_OP_ST;
138 num_obj =
em_shm->
opt.queue.min_events_default;
140 stash_param.num_obj = num_obj;
143 stash_param.obj_size =
sizeof(uint64_t);
144 if (stash_param.num_obj > stash_capa.max_num.u64) {
146 "%s(): req stash.num_obj(%" PRIu64
") > capa.max_num.u64(%" PRIu64
").\n"
147 " ==> using max value:%" PRIu64
"\n", __func__,
148 stash_param.num_obj, stash_capa.max_num.u64, stash_capa.max_num.u64);
149 stash_param.num_obj = stash_capa.max_num.u64;
152 stash_param.cache_size = 0;
159 err_str =
"odp_stash_create() failed!";
163 __atomic_thread_fence(__ATOMIC_RELEASE);
179ag_stash_destroy(odp_stash_t stash)
186 bool esv_ena = esv_enabled();
188 if (stash == ODP_STASH_INVALID)
192 cnt = odp_stash_get_u64(stash, &entry_tbl[0].u64 ,
196 for (int32_t i = 0; i < cnt; i++)
197 odp_evtbl[i] = (odp_event_t)(uintptr_t)entry_tbl[i].evptr;
199 events_odp2em(odp_evtbl, ev_tbl, cnt);
202 event_to_hdr_multi(ev_tbl, ev_hdr_tbl, cnt);
203 evstate_em2usr_multi(ev_tbl, ev_hdr_tbl,
204 cnt, EVSTATE__AG_DELETE);
210 return odp_stash_destroy(stash);
217 atomic_group_elem_get(atomic_group);
223 "Invalid atomic group - cannot delete!");
225 odp_ticketlock_lock(&ag_elem->lock);
229 err |= !atomic_group_allocated(ag_elem);
232 odp_ticketlock_unlock(&ag_elem->lock);
234 EM_ESCOPE_ATOMIC_GROUP_DELETE,
235 "Atomic group in bad state - cannot delete!");
243 ag_elem->
name[0] =
'\0';
245 odp_ticketlock_unlock(&ag_elem->lock);
248 error = atomic_group_free(atomic_group);
250 error, EM_ESCOPE_ATOMIC_GROUP_DELETE,
251 "Atomic group free failed(%d)!", err);
262 em_queue_group_t queue_group;
265 atomic_group_elem_get(atomic_group);
266 const char *err_str =
"";
268 if (unlikely(!ag_elem || !atomic_group_allocated(ag_elem))) {
270 "Invalid Atomic Group:%" PRI_AGRP "",
282 queue_param_apply_conf(¶m, conf);
284 queue = queue_create_param(name, ¶m, &err_str);
288 "Atomic Group queue creation failed! (%s)",
293 q_elem = queue_elem_get(queue);
294 if (unlikely(!q_elem)) {
296 "Atomic Group Q:%" PRI_QUEUE " - q_elem = NULL",
303 atomic_group_add_queue_list(ag_elem, q_elem);
310 em_atomic_group_t atomic_group, em_queue_t queue,
313 em_queue_t queue_static;
314 em_queue_group_t queue_group;
317 atomic_group_elem_get(atomic_group);
318 const char *err_str =
"";
322 "Invalid Atomic Group:%" PRI_AGRP "", atomic_group);
332 queue_param_apply_conf(¶m, conf);
334 queue_static = queue_create_param(name, ¶m, &err_str);
338 "Atomic Group static queue:%" PRI_QUEUE " creation failed! (%s)",
345 EM_ESCOPE_QUEUE_CREATE_STATIC_AG,
347 queue, queue_static);
349 if (unlikely(queue_static != queue)) {
350 const char *qdel_err =
"queue cleanup ok";
352 (void)queue_delete(q_elem, &qdel_err);
355 queue, queue_static, qdel_err);
359 atomic_group_add_queue_list(ag_elem, q_elem);
365 char *name,
size_t maxlen)
368 atomic_group_elem_get(atomic_group);
371 if (unlikely(name == NULL || maxlen == 0)) {
373 "Invalid args: name=0x%" PRIx64
", maxlen=%zu",
378 if (unlikely(ag_elem == NULL || !atomic_group_allocated(ag_elem))) {
380 "Invalid Atomic Group:%" PRI_AGRP "",
386 len = strnlen(ag_elem->
name,
sizeof(ag_elem->
name) - 1);
387 if (maxlen - 1 < len)
390 memcpy(name, ag_elem->
name, len);
402 &
em_shm->atomic_group_tbl.ag_elem[i];
404 if (atomic_group_allocated(ag_elem) &&
405 !strncmp(name, ag_elem->
name,
416 em_shm->atomic_group_tbl.ag_elem;
418 const unsigned int agrp_count = atomic_group_count();
420 _agrp_tbl_iter_idx = 0;
425 if (agrp_count == 0) {
431 while (!atomic_group_allocated(ag_elem)) {
432 _agrp_tbl_iter_idx++;
435 ag_elem = &agrp_elem_tbl[_agrp_tbl_iter_idx];
438 return agrp_idx2hdl(_agrp_tbl_iter_idx);
446 _agrp_tbl_iter_idx++;
449 em_shm->atomic_group_tbl.ag_elem;
453 while (!atomic_group_allocated(ag_elem)) {
454 _agrp_tbl_iter_idx++;
457 ag_elem = &agrp_elem_tbl[_agrp_tbl_iter_idx];
460 return agrp_idx2hdl(_agrp_tbl_iter_idx);
464 em_atomic_group_t atomic_group)
468 const unsigned int max_queues =
em_shm->queue_tbl.max_queue_num;
470 if (unlikely(agrp_elem == NULL || !atomic_group_allocated(agrp_elem))) {
472 EM_ESCOPE_ATOMIC_GROUP_QUEUE_FIRST,
473 "Invalid atomic group:%" PRI_AGRP "",
480 const unsigned int num_queues =
486 if (num_queues == 0) {
487 _agrp_q_iter_idx = max_queues;
501 _agrp_q_iter_idx = 0;
502 _agrp_q_iter_agrp = atomic_group;
505 while (!queue_allocated(q_elem) ||
509 if (_agrp_q_iter_idx >= max_queues)
511 q_elem = &q_elem_tbl[_agrp_q_iter_idx];
514 return queue_idx2hdl(_agrp_q_iter_idx);
519 const unsigned int max_queues =
em_shm->queue_tbl.max_queue_num;
521 if (_agrp_q_iter_idx >= max_queues - 1)
527 const queue_elem_t *q_elem = &q_elem_tbl[_agrp_q_iter_idx];
530 while (!queue_allocated(q_elem) ||
534 if (_agrp_q_iter_idx >= max_queues)
536 q_elem = &q_elem_tbl[_agrp_q_iter_idx];
539 return queue_idx2hdl(_agrp_q_iter_idx);
544 return (uint64_t)atomic_group;
#define INTERNAL_ERROR(error, escope, fmt,...)
#define RETURN_ERROR_IF(cond, error, escope, fmt,...)
#define EM_MAX_ATOMIC_GROUPS
#define EM_ATOMIC_GROUP_NAME_LEN
#define EM_SCHED_AG_MULTI_MAX_BURST
#define EM_QUEUE_GROUP_UNDEF
#define EM_ATOMIC_GROUP_UNDEF
em_queue_t em_queue_create_ag(const char *name, em_queue_prio_t prio, em_atomic_group_t atomic_group, const em_queue_conf_t *conf)
em_atomic_group_t em_atomic_group_find(const char *name)
em_queue_t em_atomic_group_queue_next(void)
uint64_t em_atomic_group_to_u64(em_atomic_group_t atomic_group)
em_queue_t em_atomic_group_queue_first(unsigned int *num, em_atomic_group_t atomic_group)
size_t em_atomic_group_name(em_atomic_group_t atomic_group, char *name, size_t maxlen)
em_status_t em_queue_create_static_ag(const char *name, em_queue_prio_t prio, em_atomic_group_t atomic_group, em_queue_t queue, const em_queue_conf_t *conf)
em_atomic_group_t em_atomic_group_next(void)
em_atomic_group_t em_atomic_group_first(unsigned int *num)
em_status_t em_atomic_group_delete(em_atomic_group_t atomic_group)
em_atomic_group_t em_atomic_group_create(const char *name, em_queue_group_t queue_group)
void em_free_multi(em_event_t events[], int num)
void em_queue_param_init(em_queue_param_t *param)
odp_atomic_u32_t num_queues
em_queue_group_t queue_group
char name[EM_ATOMIC_GROUP_NAME_LEN]
em_atomic_group_t atomic_group
struct atomic_group_elem_t::@30 stashes
odp_atomic_u32_t num_hi_prio_queues
em_atomic_group_t atomic_group
em_queue_group_t queue_group
em_atomic_group_t atomic_group
q_elem_atomic_group_t agrp