34 static ENV_LOCAL unsigned int _qgrp_tbl_iter_idx;
36 static ENV_LOCAL unsigned int _qgrp_q_iter_idx;
37 static ENV_LOCAL em_queue_group_t _qgrp_q_iter_qgrp;
43 em_queue_group_t queue_group;
46 if (unlikely(!mask)) {
53 if (unlikely(err !=
EM_OK)) {
55 char mstr[ODP_CPUMASK_STR_SIZE];
59 "Invalid mask given:%s", mstr);
64 if (unlikely(err !=
EM_OK)) {
66 "Invalid notif cfg given:%" PRI_STAT
"!", err);
78 em_queue_group_t queue_group;
81 if (unlikely(!mask)) {
88 if (unlikely(err !=
EM_OK)) {
90 char mstr[ODP_CPUMASK_STR_SIZE];
94 "Invalid mask given:%s", mstr);
111 queue_group_elem_get(queue_group);
115 "Invalid queue group: %" PRI_QGRP "", queue_group);
119 "Invalid notif cfg given, err=%" PRI_STAT
"", err);
128 "Queue group:%" PRI_QGRP " modify for delete failed!",
141 queue_group_elem_get(queue_group);
145 "Invalid queue group:%" PRI_QGRP "", queue_group);
154 "Queue group:%" PRI_QGRP " modify for delete failed!",
166 queue_group_elem_get(queue_group);
171 "Invalid queue group:%" PRI_QGRP "", queue_group);
174 "Queue group mask NULL! Queue group:%" PRI_QGRP "",
178 if (unlikely(err !=
EM_OK)) {
180 char mstr[ODP_CPUMASK_STR_SIZE];
184 "Queue group:%" PRI_QGRP ", invalid mask given:%s",
190 "Invalid notif cfg given, err=%" PRI_STAT
"", err);
195 "Queue group:%" PRI_QGRP " modify failed!",
205 queue_group_elem_get(queue_group);
210 "Invalid queue group: %" PRI_QGRP "", queue_group);
213 "Queue group mask NULL! Queue group:%" PRI_QGRP "",
217 if (unlikely(err !=
EM_OK)) {
219 char mstr[ODP_CPUMASK_STR_SIZE];
223 "Queue group:%" PRI_QGRP ", invalid core mask given:%s",
230 "Queue group:%" PRI_QGRP " modify sync failed!",
238 odp_schedule_group_t odp_group;
240 if (!name || name[0] ==
'\0')
243 odp_group = odp_schedule_group_lookup(name);
244 if (odp_group == ODP_SCHED_GROUP_INVALID)
249 &
em_shm->queue_group_tbl.queue_group_elem[i];
252 queue_group_allocated(qgrp_elem))
253 return qgrp_idx2hdl(i);
267 "Invalid queue group:%" PRI_QGRP "", queue_group);
269 env_spinlock_lock(&qgrp_elem->
lock);
271 allocated = queue_group_allocated(qgrp_elem);
275 env_spinlock_unlock(&qgrp_elem->
lock);
279 "Queue group:%" PRI_QGRP " in bad state:\t"
280 "allocated=%s, ongoing_delete=%s",
281 queue_group, allocated ?
"true" :
"false(!)",
282 ongoing_delete ?
"true(!)" :
"false");
289 char *name,
size_t maxlen)
292 odp_schedule_group_info_t info;
296 if (unlikely(!name || maxlen == 0)) {
298 "Invalid name=0x%" PRIx64
" or maxlen=%zu",
305 if (unlikely(!qgrp_elem || !queue_group_allocated(qgrp_elem))) {
307 "Invalid queue group:%" PRI_QGRP "",
313 if (unlikely(ret != 0)) {
315 "Failed to retrieve queue group info");
319 if (unlikely(!info.name))
322 len = strnlen(info.name, ODP_SCHED_GROUP_NAME_LEN - 1);
323 if (maxlen - 1 < len)
326 memcpy(name, info.name, len);
336 em_shm->queue_group_tbl.queue_group_elem;
339 const unsigned int qgrp_cnt = queue_group_count();
341 _qgrp_tbl_iter_idx = 0;
347 _qgrp_tbl_iter_idx = max_qgrps;
352 while (!queue_group_allocated(qgrp_elem)) {
353 _qgrp_tbl_iter_idx++;
354 if (_qgrp_tbl_iter_idx >= max_qgrps)
356 qgrp_elem = &qgrp_elem_tbl[_qgrp_tbl_iter_idx];
359 return qgrp_idx2hdl(_qgrp_tbl_iter_idx);
367 if (_qgrp_tbl_iter_idx >= max_qgrps - 1)
370 _qgrp_tbl_iter_idx++;
373 em_shm->queue_group_tbl.queue_group_elem;
375 &qgrp_elem_tbl[_qgrp_tbl_iter_idx];
378 while (!queue_group_allocated(qgrp_elem)) {
379 _qgrp_tbl_iter_idx++;
380 if (_qgrp_tbl_iter_idx >= max_qgrps)
382 qgrp_elem = &qgrp_elem_tbl[_qgrp_tbl_iter_idx];
385 return qgrp_idx2hdl(_qgrp_tbl_iter_idx);
392 const unsigned int max_queues =
em_shm->opt.queue.max_num;
394 if (unlikely(!qgrp_elem || !queue_group_allocated(qgrp_elem))) {
396 "Invalid queue group:%" PRI_QGRP "",
403 const unsigned int num_queues =
409 if (num_queues == 0) {
410 _qgrp_q_iter_idx = max_queues;
424 _qgrp_q_iter_idx = 0;
425 _qgrp_q_iter_qgrp = queue_group;
428 while (!queue_allocated(q_elem) ||
431 if (_qgrp_q_iter_idx >= max_queues)
433 q_elem = &q_elem_tbl[_qgrp_q_iter_idx];
436 return queue_idx2hdl(_qgrp_q_iter_idx);
442 const unsigned int max_queues =
em_shm->opt.queue.max_num;
444 if (_qgrp_q_iter_idx >= max_queues - 1)
450 const queue_elem_t *q_elem = &q_elem_tbl[_qgrp_q_iter_idx];
453 while (!queue_allocated(q_elem) ||
456 if (_qgrp_q_iter_idx >= max_queues)
458 q_elem = &q_elem_tbl[_qgrp_q_iter_idx];
461 return queue_idx2hdl(_qgrp_q_iter_idx);
466 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.
em_queue_group_t queue_group_create_sync(const char *name, const em_core_mask_t *mask, em_queue_group_t requested_queue_group)
em_queue_group_t queue_group_create(const char *name, const em_core_mask_t *mask, int num_notif, const em_notif_t notif_tbl[], em_queue_group_t queue_group)
em_status_t queue_group_modify_sync(queue_group_elem_t *const qgrp_elem, const em_core_mask_t *new_mask, bool is_delete)
em_status_t queue_group_modify(queue_group_elem_t *const qgrp_elem, const em_core_mask_t *new_mask, int num_notif, const em_notif_t notif_tbl[], bool is_delete)
em_status_t queue_group_check_mask(const em_core_mask_t *mask)
Check that only running EM cores are set in mask.
#define EM_MAX_QUEUE_GROUPS
void em_core_mask_tostr(char *mask_str, int len, const em_core_mask_t *mask)
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_status_t em_queue_group_get_mask(em_queue_group_t queue_group, em_core_mask_t *mask)
em_queue_group_t em_queue_group_find(const char *name)
em_queue_t em_queue_group_queue_get_first(unsigned int *num, em_queue_group_t queue_group)
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_status_t em_queue_group_delete_sync(em_queue_group_t queue_group)
size_t em_queue_group_get_name(em_queue_group_t queue_group, char *name, size_t maxlen)
em_queue_group_t em_queue_group_get_first(unsigned int *num)
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_get_next(void)
uint64_t em_queue_group_to_u64(em_queue_group_t queue_group)
em_queue_group_t em_queue_group_get_next(void)
em_queue_group_t queue_group
env_atomic32_t num_queues
odp_schedule_group_t odp_sched_group