59static ENV_LOCAL
unsigned int _qgrp_tbl_iter_idx;
61static ENV_LOCAL
unsigned int _qgrp_q_iter_idx;
62static ENV_LOCAL em_queue_group_t _qgrp_q_iter_qgrp;
68 em_queue_group_t queue_group;
71 if (unlikely(!mask)) {
78 if (unlikely(err !=
EM_OK)) {
80 "Invalid notif cfg given:%" PRI_STAT
"!", err);
84 queue_group = queue_group_create(name, mask, num_notif, notif_tbl,
92 em_queue_group_t queue_group;
94 if (unlikely(!mask)) {
116 "Invalid queue group: %" PRI_QGRP "", queue_group);
120 "Invalid notif cfg given, err=%" PRI_STAT
"", err);
125 err = queue_group_modify(qgrp_elem, &zero_mask, num_notif, notif_tbl,
129 "Queue group:%" PRI_QGRP " modify for delete failed!",
145 "Invalid queue group:%" PRI_QGRP "", queue_group);
150 err = queue_group_modify_sync(qgrp_elem, &zero_mask,
154 "Queue group:%" PRI_QGRP " modify for delete failed!",
170 "Invalid queue group:%" PRI_QGRP "", queue_group);
173 "Queue group mask NULL! Queue group:%" PRI_QGRP "",
178 "Invalid notif cfg given, err=%" PRI_STAT
"", err);
180 err = queue_group_modify(qgrp_elem, new_mask, num_notif, notif_tbl,
183 "Queue group:%" PRI_QGRP " modify failed!",
197 "Invalid queue group: %" PRI_QGRP "", queue_group);
200 "Queue group mask NULL! Queue group:%" PRI_QGRP "",
203 err = queue_group_modify_sync(qgrp_elem, new_mask,
false);
206 "Queue group:%" PRI_QGRP " modify sync failed!",
214 odp_schedule_group_t odp_group;
216 if (!name || name[0] ==
'\0')
219 odp_group = odp_schedule_group_lookup(name);
220 if (odp_group == ODP_SCHED_GROUP_INVALID)
225 &
em_shm->queue_group_tbl.queue_group_elem[i];
228 queue_group_allocated(qgrp_elem))
229 return qgrp_idx2hdl(i);
243 "Invalid queue group:%" PRI_QGRP "", queue_group);
245 odp_ticketlock_lock(&qgrp_elem->
lock);
247 allocated = queue_group_allocated(qgrp_elem);
251 odp_ticketlock_unlock(&qgrp_elem->
lock);
255 "Queue group:%" PRI_QGRP " in bad state:\t"
256 "allocated=%s, ongoing_delete=%s",
257 queue_group, allocated ?
"true" :
"false(!)",
258 ongoing_delete ?
"true(!)" :
"false");
264 char *name,
size_t maxlen)
267 odp_schedule_group_info_t info;
271 if (unlikely(!name || maxlen == 0)) {
273 "Invalid name=0x%" PRIx64
" or maxlen=%zu",
280 if (unlikely(!qgrp_elem || !queue_group_allocated(qgrp_elem))) {
282 "Invalid queue group:%" PRI_QGRP "",
288 if (unlikely(ret != 0)) {
290 "Failed to retrieve queue group info");
294 if (unlikely(!info.name))
297 len = strnlen(info.name, ODP_SCHED_GROUP_NAME_LEN - 1);
298 if (maxlen - 1 < len)
301 memcpy(name, info.name, len);
310 em_shm->queue_group_tbl.queue_group_elem;
313 const unsigned int qgrp_cnt = queue_group_count();
315 _qgrp_tbl_iter_idx = 0;
321 _qgrp_tbl_iter_idx = max_qgrps;
326 while (!queue_group_allocated(qgrp_elem)) {
327 _qgrp_tbl_iter_idx++;
328 if (_qgrp_tbl_iter_idx >= max_qgrps)
330 qgrp_elem = &qgrp_elem_tbl[_qgrp_tbl_iter_idx];
333 return qgrp_idx2hdl(_qgrp_tbl_iter_idx);
340 if (_qgrp_tbl_iter_idx >= max_qgrps - 1)
343 _qgrp_tbl_iter_idx++;
346 em_shm->queue_group_tbl.queue_group_elem;
348 &qgrp_elem_tbl[_qgrp_tbl_iter_idx];
351 while (!queue_group_allocated(qgrp_elem)) {
352 _qgrp_tbl_iter_idx++;
353 if (_qgrp_tbl_iter_idx >= max_qgrps)
355 qgrp_elem = &qgrp_elem_tbl[_qgrp_tbl_iter_idx];
358 return qgrp_idx2hdl(_qgrp_tbl_iter_idx);
362 em_queue_group_t queue_group)
365 const unsigned int max_queues =
em_shm->queue_tbl.max_queue_num;
367 if (unlikely(!qgrp_elem || !queue_group_allocated(qgrp_elem))) {
369 "Invalid queue group:%" PRI_QGRP "",
376 const unsigned int num_queues = odp_atomic_load_u32(&qgrp_elem->
num_queues);
381 if (num_queues == 0) {
382 _qgrp_q_iter_idx = max_queues;
396 _qgrp_q_iter_idx = 0;
397 _qgrp_q_iter_qgrp = queue_group;
400 while (!queue_allocated(q_elem) ||
403 if (_qgrp_q_iter_idx >= max_queues)
405 q_elem = &q_elem_tbl[_qgrp_q_iter_idx];
408 return queue_idx2hdl(_qgrp_q_iter_idx);
413 const unsigned int max_queues =
em_shm->queue_tbl.max_queue_num;
415 if (_qgrp_q_iter_idx >= max_queues - 1)
421 const queue_elem_t *q_elem = &q_elem_tbl[_qgrp_q_iter_idx];
424 while (!queue_allocated(q_elem) ||
427 if (_qgrp_q_iter_idx >= max_queues)
429 q_elem = &q_elem_tbl[_qgrp_q_iter_idx];
432 return queue_idx2hdl(_qgrp_q_iter_idx);
437 return (uint64_t)queue_group;
#define INTERNAL_ERROR(error, escope, fmt,...)
#define RETURN_ERROR_IF(cond, error, escope, fmt,...)
em_status_t check_notif_tbl(const int num_notif, const em_notif_t notif_tbl[])
Check that the usage of a table of notifications is valid.
#define EM_MAX_QUEUE_GROUPS
void em_core_mask_copy(em_core_mask_t *dst, const em_core_mask_t *src)
void em_core_mask_zero(em_core_mask_t *mask)
#define EM_QUEUE_GROUP_UNDEF
em_queue_group_t em_queue_group_find(const char *name)
em_queue_group_t em_queue_group_first(unsigned int *num)
size_t em_queue_group_name(em_queue_group_t queue_group, char *name, size_t maxlen)
em_status_t em_queue_group_modify_sync(em_queue_group_t queue_group, const em_core_mask_t *new_mask)
em_queue_group_t em_queue_group_create(const char *name, const em_core_mask_t *mask, int num_notif, const em_notif_t notif_tbl[])
em_status_t em_queue_group_modify(em_queue_group_t queue_group, const em_core_mask_t *new_mask, int num_notif, const em_notif_t notif_tbl[])
em_queue_group_t em_queue_group_create_sync(const char *name, const em_core_mask_t *mask)
em_queue_group_t em_queue_group_next(void)
em_queue_t em_queue_group_queue_first(unsigned int *num, em_queue_group_t queue_group)
em_status_t em_queue_group_delete_sync(em_queue_group_t queue_group)
em_status_t em_queue_group_delete(em_queue_group_t queue_group, int num_notif, const em_notif_t notif_tbl[])
em_queue_t em_queue_group_queue_next(void)
uint64_t em_queue_group_to_u64(em_queue_group_t queue_group)
em_status_t em_queue_group_mask(em_queue_group_t queue_group, em_core_mask_t *mask)
em_queue_group_t queue_group
odp_atomic_u32_t num_queues
odp_schedule_group_t odp_sched_group