58#include "em_libconfig.h"
69 const mpool_elem_t *
const pool_elem = pool_elem_get(pool);
76 "Invalid args: size:%u type:%u pool:%" PRI_POOL "",
82 "Invalid pool:%" PRI_POOL ", pool not created", pool);
92 "Invalid event type:0x%x for buf",
93 pool_elem->name, pool_elem->
em_pool, type);
101 "Invalid event type:0x%x for vector",
102 pool_elem->name, pool_elem->
em_pool, type);
106 const em_event_t
event = event_alloc(pool_elem, size, type, EVSTATE__ALLOC);
111 "EM-pool:'%s': sz:%u type:0x%x pool:%" PRI_POOL "",
112 pool_elem->name, size, type, pool);
115 pool_elem->
stats_opt.bit.cache_available)) {
122 call_api_hooks_alloc(&event, 1, 1, size, type, pool);
130 if (unlikely(num == 0))
133 const mpool_elem_t *
const pool_elem = pool_elem_get(pool);
138 unlikely(!events || num < 0 || size == 0 || !pool_elem ||
141 "Invalid args: events:%p num:%d size:%u type:%u pool:%" PRI_POOL "",
142 events, num, size, type, pool);
147 "Invalid pool:%" PRI_POOL ", pool not created", pool);
154 ret = event_alloc_pkt_multi(events, num, pool_elem, size, type);
163 "EM-pool:%s(%" PRI_POOL "): Invalid event type:0x%x for buf",
164 pool_elem->name, pool, type);
167 ret = event_alloc_buf_multi(events, num, pool_elem, size, type);
172 "EM-pool:%s(%" PRI_POOL "): Inv. event type:0x%x for vector",
173 pool_elem->name, pool, type);
176 ret = event_alloc_vector_multi(events, num, pool_elem, size, type);
182 "Requested num:%d events, allocated:%d\n"
183 "EM-pool:'%s': sz:%u type:0x%x pool:%" PRI_POOL "",
185 pool_elem->name, size, type, pool);
188 pool_elem->
stats_opt.bit.cache_available)) {
194 call_api_hooks_alloc(events, ret, num, size, type, pool);
206static inline bool is_vector_type(em_event_t vector_event)
208 odp_event_t odp_event = event_em2odp(vector_event);
209 odp_event_type_t odp_etype = odp_event_type(odp_event);
211 if (odp_etype == ODP_EVENT_VECTOR ||
212 odp_etype == ODP_EVENT_PACKET_VECTOR)
226static inline bool is_vector_type_or_error(em_event_t vector_event,
229 bool is_vec = is_vector_type(vector_event);
239event_vector_prepare_free_full__odp_evvec(odp_event_vector_t evvec,
const uint16_t api_op)
241 em_event_t *ev_tbl = NULL;
242 uint32_t sz = event_vector_tbl__odp_evvec(evvec, &ev_tbl );
248 for (uint32_t i = 0; i < sz; i++)
249 ev_hdrs[i] = event_to_hdr(ev_tbl[i]);
251 evstate_free_multi(ev_tbl, ev_hdrs, sz, api_op);
254 (void)events_em2odp_inplace(ev_tbl, sz);
259event_vector_prepare_free_full__odp_pktvec(odp_packet_vector_t pkt_vec,
const uint16_t api_op)
261 em_event_t *ev_tbl = NULL;
262 uint32_t sz = event_vector_tbl__odp_pktvec(pkt_vec, &ev_tbl );
268 for (uint32_t i = 0; i < sz; i++)
269 ev_hdrs[i] = event_to_hdr(ev_tbl[i]);
271 evstate_free_multi(ev_tbl, ev_hdrs, sz, api_op);
274 (void)events_em2pkt_inplace(ev_tbl, sz);
283static void event_vector_prepare_free_full(em_event_t vector_event,
const uint16_t api_op)
286 odp_event_t odp_event = event_em2odp(vector_event);
287 odp_event_type_t odp_etype = odp_event_type(odp_event);
289 if (odp_etype == ODP_EVENT_VECTOR) {
290 odp_event_vector_t evvec = odp_event_vector_from_event(odp_event);
292 event_vector_prepare_free_full__odp_evvec(evvec, api_op);
295 odp_packet_vector_t pkt_vec = odp_packet_vector_from_event(odp_event);
297 event_vector_prepare_free_full__odp_pktvec(pkt_vec, api_op);
307static void event_vector_prepare_free_full__revert(em_event_t event,
const uint16_t api_op)
311 uint32_t sz = event_vector_tbl(event, &ev_tbl);
316 event_to_hdr_multi(ev_tbl, ev_hdrs, sz);
317 evstate_unmark_free_multi(ev_tbl, ev_hdrs, sz, api_op);
320 for (
unsigned int i = 0; i < sz; i++)
321 ev_tbl[i] = ev_hdrs[i]->event;
331static inline bool timer_rings_used(
void)
333 return em_shm->timers.num_ring_create_calls > 0 ? true :
false;
344 odp_event_t odp_event = event_em2odp(event);
345 const bool esv_ena = esv_enabled();
347 const bool check_tmos =
EM_CHECK_LEVEL >= 2 && timer_rings_used();
349 if (unlikely(check_tmos && odp_event_type(odp_event) == ODP_EVENT_TIMEOUT)) {
354 "Can't free active TIMER event");
358 evstate_free(event, ev_hdr, EVSTATE__FREE);
359 }
else if (esv_ena) {
363 evstate_free(event, ev_hdr, EVSTATE__FREE);
364 if (is_vector_type(event))
365 event_vector_prepare_free_full(event, EVSTATE__FREE);
370 call_api_hooks_free(&event, 1);
372 odp_event_free(odp_event);
384rem_active_ring_timer_tmos(
const int num, odp_event_t odp_evtbl[],
388 int first_tmo_idx = -1;
391 for (
int i = 0; i < num; i++) {
392 if (unlikely(odp_event_type(odp_evtbl[i]) == ODP_EVENT_TIMEOUT &&
403 if (likely(first_tmo_idx == -1))
411 if (first_tmo_idx == num - 1)
419 int cpy_idx[num - first_tmo_idx - 1];
421 for (
int i = first_tmo_idx + 1; i < num; i++) {
422 if (likely(!(odp_event_type(odp_evtbl[i]) == ODP_EVENT_TIMEOUT &&
424 cpy_idx[num_cpy++] = i;
429 return first_tmo_idx;
435 for (
int i = 0; i < num_cpy; i++) {
436 int src_idx = cpy_idx[i];
437 int dst_idx = first_tmo_idx + i;
439 odp_evtbl[dst_idx] = odp_evtbl[src_idx];
440 ev_hdr_tbl[dst_idx] = ev_hdr_tbl[src_idx];
441 ev_tbl[dst_idx] = ev_tbl[src_idx];
444 return first_tmo_idx + num_cpy;
451 "Inv.args: events[]:%p num:%d", events, num);
454 if (unlikely(num == 0))
462 if (unlikely(i != num)) {
464 "events[%d] undefined!", i);
470 const bool esv_ena = esv_enabled();
471 odp_event_t odp_events[num];
473 events_em2odp(events, odp_events, num);
476 const bool check_tmos =
EM_CHECK_LEVEL >= 2 && timer_rings_used();
478 if (check_tmos || esv_ena) {
481 event_to_hdr_multi(events, ev_hdrs, num);
484 num_free = rem_active_ring_timer_tmos(num, odp_events, ev_hdrs, events);
485 if (unlikely(num_free != num))
487 "Can't free active TIMER events: %d of %d ignored",
492 evstate_free_multi(events, ev_hdrs, num_free, EVSTATE__FREE_MULTI);
494 for (
int i = 0; i < num_free; i++) {
495 if (is_vector_type(events[i]))
496 event_vector_prepare_free_full(events[i],
497 EVSTATE__FREE_MULTI);
503 call_api_hooks_free(events, num_free);
505 odp_event_free_multi(odp_events, num_free);
514send_external(em_event_t event, em_queue_t queue)
525 "send out-of-EM via event-chaining failed: Q:%" PRI_QUEUE "", queue);
535send_external_multi(
const em_event_t events[],
int num, em_queue_t queue)
540 int num_sent = send_chaining_multi(events, num, queue);
544 "send_chaining_multi: req:%d, sent:%d",
556send_internal(em_event_t event,
event_hdr_t *ev_hdr, em_queue_t queue)
576 evstate_usr2em(event, ev_hdr, EVSTATE__SEND);
578 int num_sent = eo_start_buffer_events(&event, 1, queue);
580 if (unlikely(num_sent != 1)) {
596 stat = send_output(event, q_elem);
598 if (unlikely(stat !=
EM_OK))
599 goto error_return_noesv;
608 evstate_usr2em(event, ev_hdr, EVSTATE__SEND);
610 switch (q_elem->
type) {
614 stat = send_sched(event, q_elem);
617 stat = queue_unsched_enqueue(event, q_elem);
620 stat = send_aggr(event, ev_hdr, q_elem);
623 stat = send_local(event, q_elem);
630 if (likely(stat ==
EM_OK))
635 evstate_usr2em_revert(event, ev_hdr, EVSTATE__SEND__FAIL);
641 queue, q_elem->
type);
650send_internal_multi(
const em_event_t events[],
event_hdr_t *ev_hdrs[],
651 int num, em_queue_t queue)
675 evstate_usr2em_multi(events, ev_hdrs, num,
676 EVSTATE__SEND_MULTI);
677 num_sent = eo_start_buffer_events(events, num, queue);
679 if (unlikely(num_sent != num))
693 num_sent = send_output_multi(events, num, q_elem);
695 if (unlikely(num_sent != num))
696 goto error_return_noesv;
705 evstate_usr2em_multi(events, ev_hdrs, num, EVSTATE__SEND_MULTI);
707 switch (q_elem->
type) {
711 num_sent = send_sched_multi(events, num, q_elem);
714 num_sent = queue_unsched_enqueue_multi(events, num, q_elem);
717 num_sent = send_aggr_multi(events, ev_hdrs, num, q_elem);
720 num_sent = send_local_multi(events, num, q_elem);
727 if (likely(num_sent == num))
732 evstate_usr2em_revert_multi(&events[num_sent],
735 EVSTATE__SEND_MULTI__FAIL);
739 "send-multi failed: req:%d, sent:%d",
746 const bool is_external = queue_external(queue);
754 EM_ERR_BAD_ARG, EM_ESCOPE_SEND,
"Timer-ring event can't be sent");
764 return send_external(event, queue);
769 return send_internal(event, ev_hdr, queue);
776send_multi_check_events(
const em_event_t events[],
int num)
786 if (unlikely(i != num))
795 const bool is_external = queue_external(queue);
799 em_status_t err = send_multi_check_events(events, num);
801 if (unlikely(err !=
EM_OK)) {
803 "Invalid events:%p num:%d", events, num);
807 event_to_hdr_multi(events, ev_hdrs, num);
809 for (
int i = 0; i < num; i++) {
813 "Timer-ring event[%d] can't be sent", i);
825 return send_external_multi(events, num, queue);
830 return send_internal_multi(events, ev_hdrs, num, queue);
841 void *ev_ptr = event_pointer(event);
845 "Event pointer NULL (unsupported event type)");
862 void *ev_ptr = event_pointer(event);
866 "Event pointer NULL (unsupported event type)");
870 const odp_event_t odp_event = event_em2odp(event);
871 const odp_event_type_t odp_etype = odp_event_type(odp_event);
872 uint32_t event_size = 0;
875 if (odp_etype == ODP_EVENT_PACKET) {
876 const odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
878 ev_ptr = odp_packet_data_seg_len(odp_pkt, &event_size);
879 }
else if (odp_etype == ODP_EVENT_BUFFER) {
880 const odp_buffer_t odp_buf = odp_buffer_from_event(odp_event);
881 const event_hdr_t *ev_hdr = odp_buffer_user_area(odp_buf);
884 ev_ptr = odp_buffer_addr(odp_buf);
886 ev_ptr = (
void *)((uintptr_t)ev_ptr + 32 - align_offset);
892 "Event pointer NULL (odp event type:%u)", odp_etype);
909 const odp_event_t odp_event = event_em2odp(event);
910 const odp_event_type_t odp_etype = odp_event_type(odp_event);
912 if (odp_etype == ODP_EVENT_PACKET) {
913 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
915 return odp_packet_seg_len(odp_pkt);
916 }
else if (odp_etype == ODP_EVENT_BUFFER) {
917 odp_buffer_t odp_buf = odp_buffer_from_event(odp_event);
918 const event_hdr_t *ev_hdr = odp_buffer_user_area(odp_buf);
921 }
else if (odp_etype == ODP_EVENT_TIMEOUT) {
927 "Unexpected odp event type:%u", odp_etype);
931static inline odp_pool_t event_odp_pool(em_event_t event)
933 odp_event_t odp_event = event_em2odp(event);
935 return odp_event_pool(odp_event);
946 odp_pool_t odp_pool = event_odp_pool(event);
948 if (unlikely(odp_pool == ODP_POOL_INVALID))
951 em_pool_t pool = pool_odp2em(odp_pool);
969 odp_pool_t odp_pool = event_odp_pool(event);
971 if (unlikely(odp_pool == ODP_POOL_INVALID))
976 if (unlikely(pool_subpool.pool == (uint32_t)(uintptr_t)
EM_POOL_UNDEF))
980 *subpool = pool_subpool.subpool;
982 return (em_pool_t)(uintptr_t)pool_subpool.pool;
989 EM_ESCOPE_EVENT_SET_TYPE,
"event undefined!");
992 odp_event_t odp_event = event_em2odp(event);
993 odp_event_type_t evtype = odp_event_type(odp_event);
997 case ODP_EVENT_PACKET: {
998 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
1000 ev_hdr = odp_packet_user_area(odp_pkt);
1003 case ODP_EVENT_BUFFER: {
1004 odp_buffer_t odp_buf = odp_buffer_from_event(odp_event);
1006 ev_hdr = odp_buffer_user_area(odp_buf);
1009 case ODP_EVENT_VECTOR: {
1010 odp_event_vector_t odp_evvec = odp_event_vector_from_event(odp_event);
1017 "Event type:0x%x not suitable for a vector", newtype);
1019 ev_hdr = odp_event_vector_user_area(odp_evvec);
1022 case ODP_EVENT_PACKET_VECTOR: {
1023 odp_packet_vector_t odp_pktvec = odp_packet_vector_from_event(odp_event);
1030 "Event type:0x%x not suitable for a vector", newtype);
1032 ev_hdr = odp_packet_vector_user_area(odp_pktvec);
1037 "Unsupported odp event type:%u", evtype);
1049 "event undefined!");
1065 if (unlikely(!events || num < 0 || !types)) {
1067 EM_ESCOPE_EVENT_TYPE_MULTI,
1068 "Inv.args: events:%p num:%d types:%p",
1069 events, num, types);
1079 if (unlikely(i != num)) {
1081 EM_ESCOPE_EVENT_TYPE_MULTI,
1082 "events[%d] undefined!", i);
1089 event_to_hdr_multi(events, ev_hdrs, num);
1091 for (i = 0; i < num; i++)
1092 types[i] = ev_hdrs[i]->event_type;
1102 if (unlikely(!events || num < 0 || !same_type)) {
1104 EM_ESCOPE_EVENT_SAME_TYPE_MULTI,
1105 "Inv.args: events:%p num:%d same_type:%p",
1106 events, num, same_type);
1118 if (unlikely(i != num)) {
1120 EM_ESCOPE_EVENT_SAME_TYPE_MULTI,
1121 "events[%d] undefined!", i);
1129 for (; same < num && type == event_to_hdr(events[same])->event_type;
1146 "Inv.args: event:%" PRI_EVENT "", event);
1155 const queue_elem_t *
const q_elem = queue_elem_get(queue);
1162 queue, q_elem->
type);
1167 "Event type:%u not allowed", evtype_major);
1173 evstate_usr2em(event, ev_hdr, EVSTATE__MARK_SEND);
1194 "Inv.args: event:%" PRI_EVENT "", event);
1204 "Event type:%u not allowed", evtype_major);
1206 evstate_unmark_send(event, ev_hdr);
1218 "Event undefined!");
1230 "Timer-ring event not allowed");
1234 evstate_free(event, ev_hdr, EVSTATE__MARK_FREE);
1236 if (is_vector_type(event))
1237 event_vector_prepare_free_full(event, EVSTATE__MARK_FREE);
1247 "Event undefined!");
1259 "Timer-ring event not allowed");
1263 evstate_unmark_free(event, ev_hdr, EVSTATE__UNMARK_FREE);
1264 if (is_vector_type(event))
1265 event_vector_prepare_free_full__revert(event, EVSTATE__UNMARK_FREE);
1275 "Inv.args: events[]:%p num:%d", events, num);
1278 if (unlikely(num == 0))
1286 if (unlikely(i != num)) {
1288 EM_ESCOPE_EVENT_MARK_FREE_MULTI,
1289 "events[%d] undefined!", i);
1296 event_to_hdr_multi(events, ev_hdrs, num);
1298 for (
int i = 0; i < num; i++) {
1299 em_event_type_t evtype_major = em_event_type_major(ev_hdrs[i]->event_type);
1307 "Timer-ring event[%d] not allowed", i);
1311 evstate_free(events[i], ev_hdrs[i], EVSTATE__MARK_FREE_MULTI);
1312 if (is_vector_type(events[i]))
1313 event_vector_prepare_free_full(events[i], EVSTATE__MARK_FREE_MULTI);
1322 if (unlikely(!events || num < 0)) {
1324 "Inv.args: events[]:%p num:%d", events, num);
1327 if (unlikely(num == 0))
1335 if (unlikely(i != num)) {
1337 EM_ESCOPE_EVENT_UNMARK_FREE_MULTI,
1338 "events[%d] undefined!", i);
1345 event_to_hdr_multi(events, ev_hdrs, num);
1347 for (
int i = 0; i < num; i++) {
1348 em_event_type_t evtype_major = em_event_type_major(ev_hdrs[i]->event_type);
1356 "Timer-ring event[%d] not allowed", i);
1360 evstate_unmark_free(events[i], ev_hdrs[i], EVSTATE__UNMARK_FREE_MULTI);
1361 if (is_vector_type(events[i]))
1362 event_vector_prepare_free_full__revert(events[i],
1363 EVSTATE__UNMARK_FREE_MULTI);
1367static em_event_t event_clone_part(em_event_t event, em_pool_t pool,
1368 uint32_t offset, uint32_t len,
bool clone_uarea,
1373 const bool is_clone_part = escope == EM_ESCOPE_EVENT_CLONE_PART ? true :
false;
1386 unlikely(pool_elem && !pool_allocated(pool_elem))) {
1388 "Inv.args: pool:%" PRI_POOL " not created", pool);
1392 odp_event_t odp_event = event_em2odp(event);
1393 odp_event_type_t odp_evtype = odp_event_type(odp_event);
1394 odp_pool_t odp_pool = ODP_POOL_INVALID;
1395 odp_packet_t pkt = ODP_PACKET_INVALID;
1396 odp_buffer_t buf = ODP_BUFFER_INVALID;
1398 if (unlikely(odp_evtype != ODP_EVENT_PACKET &&
1399 odp_evtype != ODP_EVENT_BUFFER)) {
1401 "Inv. odp-event-type:%d", odp_evtype);
1409 em_pool_t em_pool = pool;
1411 em_event_t clone_event;
1413 if (odp_evtype == ODP_EVENT_PACKET) {
1414 pkt = odp_packet_from_event(odp_event);
1415 ev_hdr = odp_packet_user_area(pkt);
1416 size = odp_packet_seg_len(pkt);
1418 odp_pool = odp_packet_pool(pkt);
1419 em_pool = pool_odp2em(odp_pool);
1422 buf = odp_buffer_from_event(odp_event);
1423 ev_hdr = odp_buffer_user_area(buf);
1426 odp_pool = odp_buffer_pool(buf);
1427 em_pool = pool_odp2em(odp_pool);
1431 if (is_clone_part) {
1433 uint64_t offset64 = offset;
1434 uint64_t len64 = len;
1435 uint64_t size64 = size;
1437 if (unlikely(len == 0 || offset64 + len64 > size64)) {
1439 "Inv.args: offset=%u len=%u (0 < offset+len <= %u)",
1450 if (unlikely(odp_evtype == ODP_EVENT_BUFFER)) {
1452 "No suitable event-pool found");
1459 clone_event = pkt_clone_odp(pkt, odp_pool, offset, size,
1460 clone_uarea, is_clone_part);
1463 "Cloning from ext odp-pool:%" PRIu64
" failed",
1464 odp_pool_to_u64(odp_pool));
1472 if (em_pool != pool)
1473 pool_elem = pool_elem_get(em_pool);
1482 "Invalid event type:0x%x for buf",
1483 pool_elem->name, em_pool, type);
1492 "Available user-area too small, clone uarea %u < needed uarea %u",
1499 clone_hdr = event_alloc_pkt(pool_elem, size);
1501 clone_hdr = event_alloc_buf(pool_elem, size);
1503 if (unlikely(!clone_hdr)) {
1505 "EM-pool:'%s': sz:%u type:0x%x pool:%" PRI_POOL "",
1506 pool_elem->name, size, type, em_pool);
1509 pool_elem->
stats_opt.bit.cache_available))
1516 (void)evstate_alloc(clone_hdr->
event, clone_hdr, EVSTATE__EVENT_CLONE);
1518 clone_hdr->
flags.all = 0;
1529 const void *uarea_ptr = (
void *)((uintptr_t)ev_hdr +
sizeof(
event_hdr_t));
1530 void *clone_uarea_ptr = (
void *)((uintptr_t)clone_hdr +
sizeof(
event_hdr_t));
1533 memcpy(clone_uarea_ptr, uarea_ptr, sz);
1536 clone_event = clone_hdr->
event;
1539 uintptr_t src_addr = (uintptr_t)event_pointer(event) + offset;
1540 const void *src = (
void *)src_addr;
1541 void *dst = event_pointer(clone_event);
1543 memcpy(dst, src, size);
1547 call_api_hooks_alloc(&clone_event, 1, 1, size, type, pool);
1554 return event_clone_part(event, pool, 0, 0,
true, EM_ESCOPE_EVENT_CLONE);
1558 uint32_t offset, uint32_t len,
bool clone_uarea)
1560 return event_clone_part(event, pool, offset, len, clone_uarea,
1561 EM_ESCOPE_EVENT_CLONE_PART);
1565event_uarea_init(em_event_t event,
event_hdr_t **ev_hdr)
1567 const odp_event_t odp_event = event_em2odp(event);
1568 const odp_event_type_t odp_evtype = odp_event_type(odp_event);
1569 odp_pool_t odp_pool = ODP_POOL_INVALID;
1573 switch (odp_evtype) {
1574 case ODP_EVENT_PACKET: {
1575 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
1577 hdr = odp_packet_user_area(odp_pkt);
1580 odp_pool = odp_packet_pool(odp_pkt);
1583 case ODP_EVENT_BUFFER: {
1584 odp_buffer_t odp_buf = odp_buffer_from_event(odp_event);
1586 hdr = odp_buffer_user_area(odp_buf);
1589 odp_pool = odp_buffer_pool(odp_buf);
1592 case ODP_EVENT_VECTOR: {
1593 odp_event_vector_t odp_evvec = odp_event_vector_from_event(odp_event);
1595 hdr = odp_event_vector_user_area(odp_evvec);
1598 odp_pool = odp_event_vector_pool(odp_evvec);
1601 case ODP_EVENT_PACKET_VECTOR: {
1602 odp_packet_vector_t odp_pktvec = odp_packet_vector_from_event(odp_event);
1604 hdr = odp_packet_vector_user_area(odp_pktvec);
1607 odp_pool = odp_packet_vector_pool(odp_pktvec);
1625 em_pool_t pool = pool_odp2em(odp_pool);
1633 if (unlikely(!pool_elem))
1647 "Inv.arg: event undef");
1652 int err = event_uarea_init(event, &ev_hdr);
1656 "Cannot init event user area: %d", err);
1666 void *uarea_ptr = (
void *)((uintptr_t)ev_hdr +
sizeof(
event_hdr_t));
1685 "Inv.arg: event undef");
1688 int err = event_uarea_init(event, &ev_hdr);
1692 EM_ESCOPE_EVENT_UAREA_ID_SET,
1693 "Cannot init event user area: %d", err);
1704 bool id_set =
false;
1711 "Inv.args: event:%" PRI_EVENT " isset:%p id:%p",
1717 int err = event_uarea_init(event, &ev_hdr);
1721 "Cannot init event user area: %d", err);
1747 "Inv.args: event:%" PRI_EVENT " uarea_info:%p",
1753 int err = event_uarea_init(event, &ev_hdr);
1757 EM_ESCOPE_EVENT_UAREA_INFO,
1758 "Cannot init event user area: %d", err);
1763 uarea_info->
uarea = NULL;
1764 uarea_info->
size = 0;
1766 uarea_info->
uarea = (
void *)((uintptr_t)ev_hdr +
1783 uarea_info->
uarea = NULL;
1784 uarea_info->
size = 0;
1796 "Invalid arg: event:%" PRI_EVENT "", event);
1800 odp_event_t odp_event = event_em2odp(event);
1801 odp_event_type_t odp_etype = odp_event_type(odp_event);
1803 if (
EM_CHECK_LEVEL > 0 && unlikely(odp_etype != ODP_EVENT_PACKET)) {
1805 "Event not a packet! Refs not supported for odp-events of type:%d",
1810 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
1811 odp_packet_t pkt_ref = odp_packet_ref_static(odp_pkt);
1812 event_hdr_t *ev_hdr = odp_packet_user_area(odp_pkt);
1814 if (
EM_CHECK_LEVEL > 0 && unlikely(pkt_ref == ODP_PACKET_INVALID)) {
1816 "ODP failure in odp_packet_ref_static()");
1822 "EM assumes all refs use the same handle");
1823 odp_packet_free(odp_pkt);
1836 em_event_t ref = event;
1839 ref = evstate_ref(event, ev_hdr);
1849 "Invalid arg: event:%" PRI_EVENT "", event);
1853 return event_has_ref(event);
1861 "Invalid args: vector_event:%" PRI_EVENT "",
1867 unlikely(!is_vector_type_or_error(vector_event, EM_ESCOPE_EVENT_VECTOR_FREE))) {
1872 call_api_hooks_free(&vector_event, 1);
1874 if (esv_enabled()) {
1875 event_hdr_t *
const ev_hdr = eventvec_to_hdr(vector_event);
1877 evstate_free(vector_event, ev_hdr, EVSTATE__EVENT_VECTOR_FREE);
1880 odp_event_t odp_event = event_em2odp(vector_event);
1881 odp_event_type_t odp_etype = odp_event_type(odp_event);
1883 if (odp_etype == ODP_EVENT_PACKET_VECTOR) {
1884 odp_packet_vector_t pkt_vec = odp_packet_vector_from_event(odp_event);
1886 odp_packet_vector_free(pkt_vec);
1889 odp_event_vector_t ev_vec = odp_event_vector_from_event(odp_event);
1891 odp_event_vector_free(ev_vec);
1896 em_event_t **event_tbl)
1901 "Invalid args: vector_event:%" PRI_EVENT " event_tbl:%p",
1902 vector_event, event_tbl);
1907 unlikely(!is_vector_type_or_error(vector_event, EM_ESCOPE_EVENT_VECTOR_TBL))) {
1912 return event_vector_tbl(vector_event, event_tbl );
1917 odp_event_t odp_event = event_em2odp(vector_event);
1918 odp_event_type_t odp_etype = odp_event_type(odp_event);
1920 if (odp_etype == ODP_EVENT_PACKET_VECTOR) {
1921 odp_packet_vector_t odp_pktvec = odp_packet_vector_from_event(odp_event);
1922 const event_hdr_t *ev_hdr = odp_packet_vector_user_area(odp_pktvec);
1928 }
else if (unlikely(odp_etype != ODP_EVENT_VECTOR)) {
1931 "Event:%" PRI_EVENT " not a vector", vector_event);
1938 odp_event_vector_t odp_evvec = odp_event_vector_from_event(odp_event);
1939 event_hdr_t *ev_hdr = odp_event_vector_user_area(odp_evvec);
1947 odp_event_type_t odp_vtype = odp_event_vector_type(odp_evvec);
1950 switch (odp_vtype) {
1951 case ODP_EVENT_PACKET:
1957 case ODP_EVENT_BUFFER:
1960 case ODP_EVENT_TIMEOUT:
1963 case ODP_EVENT_IPSEC_STATUS:
1964 case ODP_EVENT_PACKET_TX_COMPL:
1965 case ODP_EVENT_DMA_COMPL:
1966 case ODP_EVENT_ML_COMPL:
1972 "Invalid odp event-vector type:%d", odp_vtype);
1987 "Invalid args: vector_event:%" PRI_EVENT "", vector_event);
1991 return event_vector_type(vector_event, EM_ESCOPE_EVENT_VECTOR_TYPE);
2002 "Invalid args: vector_event:%" PRI_EVENT ", vector_type:%u",
2003 vector_event, vector_type);
2005 odp_event_t odp_event = event_em2odp(vector_event);
2006 odp_event_type_t odp_etype = odp_event_type(odp_event);
2008 if (odp_etype == ODP_EVENT_PACKET_VECTOR) {
2009 odp_packet_vector_t odp_pktvec = odp_packet_vector_from_event(odp_event);
2010 event_hdr_t *ev_hdr = odp_packet_vector_user_area(odp_pktvec);
2014 "Invalid major event type:%u for packet vector table",
2025 "Event:%" PRI_EVENT " not a vector", vector_event);
2030 odp_event_vector_t odp_evvec = odp_event_vector_from_event(odp_event);
2031 event_hdr_t *ev_hdr = odp_event_vector_user_area(odp_evvec);
2032 odp_event_type_t odp_vtype;
2034 switch (evtype_major) {
2036 odp_vtype = ODP_EVENT_PACKET;
2039 odp_vtype = ODP_EVENT_BUFFER;
2042 odp_vtype = ODP_EVENT_TIMEOUT;
2048 odp_vtype = ODP_EVENT_ANY;
2053 "Invalid event vector_type:%u", vector_type);
2056 odp_event_vector_type_set(odp_evvec, odp_vtype);
2068 "Invalid arg, vector_event undefined!", vector_event);
2073 unlikely(!is_vector_type_or_error(vector_event, EM_ESCOPE_EVENT_VECTOR_SIZE)))
2076 odp_event_t odp_event = event_em2odp(vector_event);
2077 odp_event_type_t odp_etype = odp_event_type(odp_event);
2079 if (odp_etype == ODP_EVENT_PACKET_VECTOR) {
2080 odp_packet_vector_t pkt_vec = odp_packet_vector_from_event(odp_event);
2082 return odp_packet_vector_size(pkt_vec);
2086 odp_event_vector_t ev_vec = odp_event_vector_from_event(odp_event);
2088 return odp_event_vector_size(ev_vec);
2096 "Invalid arg, vector_event undefined!", vector_event);
2101 bool is_vec = is_vector_type_or_error(vector_event,
2102 EM_ESCOPE_EVENT_VECTOR_SIZE_SET);
2103 if (unlikely(!is_vec))
2106 uint32_t max_size = 0;
2107 em_status_t err = event_vector_max_size(vector_event, &max_size,
2108 EM_ESCOPE_EVENT_VECTOR_SIZE_SET);
2109 if (unlikely(err !=
EM_OK ||
2111 (size > max_size && max_size > 0))) {
2113 "Invalid arg, given size:%u > max_size:%u", size, max_size);
2118 odp_event_t odp_event = event_em2odp(vector_event);
2119 odp_event_type_t odp_etype = odp_event_type(odp_event);
2121 if (odp_etype == ODP_EVENT_PACKET_VECTOR) {
2122 odp_packet_vector_t pkt_vec = odp_packet_vector_from_event(odp_event);
2124 odp_packet_vector_size_set(pkt_vec, size);
2127 odp_event_vector_t ev_vec = odp_event_vector_from_event(odp_event);
2129 odp_event_vector_size_set(ev_vec, size);
2138 "Invalid arg, vector_event undefined!", vector_event);
2143 unlikely(!is_vector_type_or_error(vector_event, EM_ESCOPE_EVENT_VECTOR_MAX_SIZE)))
2146 uint32_t max_size = 0;
2147 em_status_t err = event_vector_max_size(vector_event, &max_size,
2148 EM_ESCOPE_EVENT_VECTOR_MAX_SIZE);
2149 if (unlikely(err !=
EM_OK))
2164 "Invalid args: vector_event:%" PRI_EVENT " vector_info:%p",
2165 vector_event, vector_info);
2170 unlikely(!is_vector_type_or_error(vector_event, EM_ESCOPE_EVENT_VECTOR_INFO))) {
2176 vector_info->
event_type = event_vector_type(vector_event, EM_ESCOPE_EVENT_VECTOR_INFO);
2179 status = event_vector_max_size(vector_event, &vector_info->
max_size,
2180 EM_ESCOPE_EVENT_VECTOR_INFO);
2181 if (unlikely(status !=
EM_OK))
2185 vector_info->
size = event_vector_tbl(vector_event, &vector_info->
event_tbl);
2193 vector_info->
size = 0;
2201 return (uint64_t)event;
#define INTERNAL_ERROR(error, escope, fmt,...)
#define RETURN_ERROR_IF(cond, error, escope, fmt,...)
struct event_hdr event_hdr_t
ENV_LOCAL em_locm_t em_locm
#define EM_DEBUG_PRINT_BASE
#define EM_API_HOOKS_ENABLE
#define EM_EVENT_GROUP_UNDEF
@ EM_ERR_OPERATION_FAILED
em_event_t em_event_ref(em_event_t event)
bool em_event_has_ref(em_event_t event)
em_status_t em_event_uarea_id(em_event_t event, bool *isset, uint16_t *id)
Get the event user area ID along with information if it has been set.
em_status_t em_event_uarea_id_set(em_event_t event, uint16_t id)
Set the event user area ID.
em_status_t em_event_uarea_info(em_event_t event, em_event_uarea_info_t *uarea_info)
Get the event user area information for a given event.
void * em_event_uarea(em_event_t event, size_t *size)
Get a pointer to the event user area, optionally along with its size.
uint32_t em_event_vector_tbl(em_event_t vector_event, em_event_t **event_tbl)
Get the event vector table from an event of (major) type EM_EVENT_TYPE_VECTOR.
uint32_t em_event_vector_max_size(em_event_t vector_event)
Maximum number of event handles that can be stored in a vector.
em_status_t em_event_vector_type_set(em_event_t vector_event, em_event_type_t vector_type)
em_status_t em_event_vector_info(em_event_t vector_event, em_event_vector_info_t *vector_info)
Retrieve information about the given vector event.
void em_event_vector_free(em_event_t vector_event)
Free the vector event only, not the events it contains.
uint32_t em_event_vector_size(em_event_t vector_event)
Number of event handles available (set) in a vector.
void em_event_vector_size_set(em_event_t vector_event, uint32_t size)
Set the number of event handles stored in a vector.
em_event_type_t em_event_vector_type(em_event_t vector_event)
em_event_t em_event_clone(em_event_t event, em_pool_t pool)
Clone an event.
int em_event_same_type_multi(const em_event_t events[], int num, em_event_type_t *same_type)
void * em_event_pointer_and_size(em_event_t event, uint32_t *size)
Get a pointer to the event structure/data as well as the event size.
em_event_type_t em_event_type(em_event_t event)
uint32_t em_event_size(em_event_t event)
int em_send_multi(const em_event_t events[], int num, em_queue_t queue)
int em_alloc_multi(em_event_t events[], int num, uint32_t size, em_event_type_t type, em_pool_t pool)
void em_event_mark_free(em_event_t event)
Mark the event as "free".
em_status_t em_event_unmark_send(em_event_t event)
em_event_t em_alloc(uint32_t size, em_event_type_t type, em_pool_t pool)
void em_event_unmark_free(em_event_t event)
Unmark an event previously marked as "free" (i.e mark as "allocated" again).
void em_event_mark_free_multi(const em_event_t events[], int num)
Mark multiple events as "free".
void em_event_unmark_free_multi(const em_event_t events[], int num)
Unmark multiple events previously marked as "free".
em_status_t em_event_mark_send(em_event_t event, em_queue_t queue)
void em_free_multi(em_event_t events[], int num)
em_pool_t em_event_pool(em_event_t event)
Returns the EM event-pool the event was allocated from.
em_status_t em_event_set_type(em_event_t event, em_event_type_t newtype)
int em_event_type_multi(const em_event_t events[], int num, em_event_type_t types[])
em_event_t em_event_clone_part(em_event_t event, em_pool_t pool, uint32_t offset, uint32_t len, bool clone_uarea)
Partially clone an event.
em_pool_t em_event_pool_subpool(em_event_t event, int *subpool)
Returns the EM event-pool and subpool the event was allocated from.
uint64_t em_event_to_u64(em_event_t event)
em_status_t em_send(em_event_t event, em_queue_t queue)
void em_free(em_event_t event)
void * em_event_pointer(em_event_t event)
@ EM_EVENT_TYPE_TIMER_IND
void em_pool_info_print(em_pool_t pool)
@ EM_QUEUE_TYPE_UNSCHEDULED
Event user area information filled by em_event_uarea_info()
struct em_event_uarea_info_t::@1 id
Vector event information filled by em_event_vector_info()
em_event_type_t event_type
eo_elem_t * start_eo_elem
ev_hdr_user_area_t user_area
union event_hdr::@43 flags
em_event_type_t event_type
em_event_type_t vector_type
struct mpool_elem_t::@54 user_area
odp_pool_stats_opt_t stats_opt
em_event_type_t event_type