37#ifndef EM_EVENT_INLINE_H_
38#define EM_EVENT_INLINE_H_
59static inline odp_event_t
60event_em2odp(em_event_t event)
63 evhdl_t evhdl = {.event =
event};
65 return (odp_event_t)(uintptr_t)evhdl.evptr;
74static inline em_event_t
75event_odp2em(odp_event_t odp_event)
84 evhdl_t evhdl = {.event = (em_event_t)(uintptr_t)odp_event};
91events_em2odp(
const em_event_t events[],
92 odp_event_t odp_events[],
const unsigned int num)
97 for (
unsigned int i = 0; i < num; i++)
98 odp_events[i] = (odp_event_t)(uintptr_t)evhdls[i].evptr;
108events_odp2em(
const odp_event_t odp_events[],
109 em_event_t events[],
const unsigned int num)
123 memcpy(events, odp_events, num *
sizeof(em_event_t));
131events_em2pkt(
const em_event_t events[],
132 odp_packet_t odp_pkts[],
const unsigned int num)
137 for (
unsigned int i = 0; i < num; i++)
138 odp_pkts[i] = odp_packet_from_event((odp_event_t)(uintptr_t)evhdls[i].evptr);
150static inline odp_event_t *
151events_em2odp_inplace(em_event_t events[],
const unsigned int num)
155 odp_event_t *
const odp_events = (odp_event_t *)events;
158 for (
unsigned int i = 0; i < num; i++)
159 odp_events[i] = (odp_event_t)(uintptr_t)evhdls[i].evptr;
174static inline odp_packet_t *
175events_em2pkt_inplace(em_event_t events[],
const unsigned int num)
179 odp_packet_t *
const pkts = (odp_packet_t *)events;
182 for (
unsigned int i = 0; i < num; i++)
183 pkts[i] = odp_packet_from_event((odp_event_t)(uintptr_t)evhdls[i].evptr);
198evvec_tbl2odp(odp_event_t odp_event_vec)
200 odp_event_vector_t odp_evv = odp_event_vector_from_event(odp_event_vec);
201 odp_event_t *odp_evtbl = NULL;
202 const int num = odp_event_vector_tbl(odp_evv, &odp_evtbl);
204 if (likely(num > 0)) {
206 em_event_t *event_tbl = (em_event_t *)odp_evtbl;
209 (void)events_em2odp_inplace(event_tbl, num);
220pktvec_tbl2odp(odp_event_t odp_event_pktvec)
222 odp_packet_vector_t pkt_vec = odp_packet_vector_from_event(odp_event_pktvec);
223 odp_packet_t *pkt_tbl = NULL;
224 const int pkts = odp_packet_vector_tbl(pkt_vec, &pkt_tbl);
226 if (likely(pkts > 0)) {
228 em_event_t *event_tbl = (em_event_t *)pkt_tbl;
231 (void)events_em2pkt_inplace(event_tbl, pkts);
247eventpkt_to_hdr(em_event_t pkt_event)
249 odp_event_t odp_event = event_em2odp(pkt_event);
250 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
251 event_hdr_t *ev_hdr = odp_packet_user_area(odp_pkt);
268eventbuf_to_hdr(em_event_t buf_event)
270 odp_event_t odp_event = event_em2odp(buf_event);
271 odp_buffer_t odp_buf = odp_buffer_from_event(odp_event);
272 event_hdr_t *ev_hdr = odp_buffer_user_area(odp_buf);
289eventvec_to_hdr(em_event_t vector_event)
291 odp_event_t odp_event = event_em2odp(vector_event);
292 odp_event_type_t odp_etype = odp_event_type(odp_event);
295 if (odp_etype == ODP_EVENT_VECTOR) {
296 odp_event_vector_t odp_evvec = odp_event_vector_from_event(odp_event);
298 ev_hdr = odp_event_vector_user_area(odp_evvec);
300 odp_packet_vector_t odp_pktvec = odp_packet_vector_from_event(odp_event);
302 ev_hdr = odp_packet_vector_user_area(odp_pktvec);
314event_to_hdr(em_event_t event)
316 odp_event_t odp_event = event_em2odp(event);
317 odp_packet_t odp_pkt;
318 odp_buffer_t odp_buf;
319 odp_event_vector_t odp_evvec;
320 odp_packet_vector_t odp_pktvec;
321 odp_timeout_t odp_tmo;
324 odp_event_type_t evtype = odp_event_type(odp_event);
327 case ODP_EVENT_PACKET:
328 odp_pkt = odp_packet_from_event(odp_event);
329 ev_hdr = odp_packet_user_area(odp_pkt);
331 case ODP_EVENT_BUFFER:
332 odp_buf = odp_buffer_from_event(odp_event);
333 ev_hdr = odp_buffer_user_area(odp_buf);
335 case ODP_EVENT_VECTOR:
336 odp_evvec = odp_event_vector_from_event(odp_event);
337 ev_hdr = odp_event_vector_user_area(odp_evvec);
339 case ODP_EVENT_PACKET_VECTOR:
340 odp_pktvec = odp_packet_vector_from_event(odp_event);
341 ev_hdr = odp_packet_vector_user_area(odp_pktvec);
343 case ODP_EVENT_TIMEOUT:
344 odp_tmo = odp_timeout_from_event(odp_event);
345 ev_hdr = odp_timeout_user_area(odp_tmo);
370event_to_hdr_multi(
const em_event_t events[],
event_hdr_t *ev_hdrs[],
373 for (
int i = 0; i < num; i++)
374 ev_hdrs[i] = event_to_hdr(events[i]);
378static inline em_event_t
387static inline em_event_t
388evhdr_init_pkt(
event_hdr_t *ev_hdr, em_event_t event,
389 odp_packet_t odp_pkt,
bool is_extev)
391 const int user_flag_set = odp_packet_user_flag(odp_pkt);
392 const bool esv_ena = esv_enabled();
397 event = ev_hdr->
event;
399 event = evstate_em2usr(event, ev_hdr, EVSTATE__DISPATCH);
414 ev_hdr->
flags.all = 0;
415 ev_hdr->
event = event;
424 event = evstate_init(event, ev_hdr, is_extev);
427 const odp_pool_t odp_pool = odp_packet_pool(odp_pkt);
428 const em_pool_t pool = pool_odp2em(odp_pool);
432 event = evstate_init(event, ev_hdr, is_extev);
435 event = evstate_update(event, ev_hdr, is_extev);
438 ev_hdr->
flags.all = 0;
452 const odp_packet_t odp_pkts[] ,
453 const int num,
bool is_extev)
455 const bool esv_ena = esv_enabled();
458 int needs_init_idx[num];
459 int needs_init_num = 0;
462 for (
int i = 0; i < num; i++) {
463 user_flag_set = odp_packet_user_flag(odp_pkts[i]);
464 if (!user_flag_set) {
467 needs_init_idx[needs_init_num++] = i;
472 events[i] = ev_hdrs[i]->
event;
474 events[i] = evstate_em2usr(events[i], ev_hdrs[i],
475 EVSTATE__DISPATCH_MULTI);
480 if (needs_init_num == 0)
488 for (
int i = 0; i < needs_init_num; i++) {
489 idx = needs_init_idx[i];
490 ev_hdrs[idx]->
flags.all = 0;
492 ev_hdrs[idx]->
event = events[idx];
504 for (
int i = 0; i < needs_init_num; i++) {
505 idx = needs_init_idx[i];
506 events[idx] = evstate_init(events[idx], ev_hdrs[idx], is_extev);
510 for (
int i = 0; i < needs_init_num; i++) {
511 idx = needs_init_idx[i];
513 odp_pool_t odp_pool = odp_packet_pool(odp_pkts[idx]);
514 em_pool_t pool = pool_odp2em(odp_pool);
516 if (pool ==
EM_POOL_UNDEF || ev_hdrs[idx]->flags.refs_used) {
521 events[idx] = evstate_init(events[idx], ev_hdrs[idx], is_extev);
524 events[idx] = evstate_update(events[idx], ev_hdrs[idx], is_extev);
529 for (
int i = 0; i < needs_init_num; i++) {
530 idx = needs_init_idx[i];
531 ev_hdrs[idx]->
flags.all = 0;
545esv_aggr_inner_em2usr_one(odp_event_t odp_ev)
547 event_hdr_t *inner_hdr = event_to_hdr(event_odp2em(odp_ev));
559 (void)evstate_em2usr(inner_hdr->
event, inner_hdr,
560 EVSTATE__DISPATCH_AGGR);
587esv_aggr_inner_em2usr(odp_event_vector_t odp_evvec,
602 odp_event_t *odp_evtbl = NULL;
603 uint32_t sz = odp_event_vector_tbl(odp_evvec, &odp_evtbl);
604 odp_event_type_t odp_vtype = odp_event_vector_type(odp_evvec);
610 if (odp_vtype == ODP_EVENT_PACKET) {
611 for (uint32_t i = 0; i < sz; i++) {
613 if (!odp_packet_user_flag(odp_packet_from_event(odp_evtbl[i])))
615 esv_aggr_inner_em2usr_one(odp_evtbl[i]);
617 }
else if (odp_vtype == ODP_EVENT_BUFFER) {
619 for (uint32_t i = 0; i < sz; i++)
620 esv_aggr_inner_em2usr_one(odp_evtbl[i]);
623 for (uint32_t i = 0; i < sz; i++) {
625 if (odp_event_type(odp_evtbl[i]) == ODP_EVENT_PACKET &&
626 !odp_packet_user_flag(odp_packet_from_event(odp_evtbl[i])))
628 esv_aggr_inner_em2usr_one(odp_evtbl[i]);
636static inline em_event_t
637evhdr_init_evvec(
event_hdr_t *ev_hdr, em_event_t event,
638 odp_event_vector_t odp_evvec,
bool is_extev,
641 const int user_flag = odp_event_vector_user_flag(odp_evvec);
642 const bool esv_ena = esv_enabled();
647 event = ev_hdr->
event;
649 event = evstate_em2usr(event, ev_hdr,
651 esv_aggr_inner_em2usr(odp_evvec, disp_q_elem);
667 ev_hdr->
flags.all = 0;
673 ev_hdr->
event = event;
681 event = evstate_init(event, ev_hdr, is_extev);
684 odp_pool_t odp_pool = odp_event_vector_pool(odp_evvec);
685 em_pool_t pool = pool_odp2em(odp_pool);
689 event = evstate_init(event, ev_hdr, is_extev);
692 event = evstate_update(event, ev_hdr, is_extev);
700 esv_aggr_inner_em2usr(odp_evvec, disp_q_elem);
707static inline em_event_t
708evhdr_init_pktvec(
event_hdr_t *ev_hdr, em_event_t event,
709 odp_packet_vector_t odp_pktvec,
bool is_extev)
711 const int user_flag = odp_packet_vector_user_flag(odp_pktvec);
712 const bool esv_ena = esv_enabled();
717 event = ev_hdr->
event;
719 event = evstate_em2usr(event, ev_hdr, EVSTATE__DISPATCH);
730 ev_hdr->
flags.all = 0;
736 ev_hdr->
event = event;
744 event = evstate_init(event, ev_hdr, is_extev);
747 odp_pool_t odp_pool = odp_packet_vector_pool(odp_pktvec);
748 em_pool_t pool = pool_odp2em(odp_pool);
752 event = evstate_init(event, ev_hdr, is_extev);
755 event = evstate_update(event, ev_hdr, is_extev);
775static inline em_event_t
776event_init_odp(odp_event_t odp_event,
bool is_extev,
779 const odp_event_type_t odp_type = odp_event_type(odp_event);
780 em_event_t
event = event_odp2em(odp_event);
783 case ODP_EVENT_PACKET: {
784 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
785 event_hdr_t *ev_hdr = odp_packet_user_area(odp_pkt);
788 event = evhdr_init_pkt(ev_hdr, event, odp_pkt, is_extev);
790 *ev_hdr__out = ev_hdr;
793 case ODP_EVENT_BUFFER: {
794 const bool esv_ena = esv_enabled();
796 if (!ev_hdr__out && !esv_ena)
799 odp_buffer_t odp_buf = odp_buffer_from_event(odp_event);
800 event_hdr_t *ev_hdr = odp_buffer_user_area(odp_buf);
809 event = evstate_em2usr(event, ev_hdr, EVSTATE__DISPATCH);
811 event = ev_hdr->
event;
814 *ev_hdr__out = ev_hdr;
817 case ODP_EVENT_VECTOR: {
818 odp_event_vector_t odp_evvec = odp_event_vector_from_event(odp_event);
819 event_hdr_t *ev_hdr = odp_event_vector_user_area(odp_evvec);
822 event = evhdr_init_evvec(ev_hdr, event, odp_evvec, is_extev,
825 *ev_hdr__out = ev_hdr;
828 case ODP_EVENT_PACKET_VECTOR: {
829 odp_packet_vector_t odp_pktvec = odp_packet_vector_from_event(odp_event);
830 event_hdr_t *ev_hdr = odp_packet_vector_user_area(odp_pktvec);
833 event = evhdr_init_pktvec(ev_hdr, event, odp_pktvec, is_extev);
835 *ev_hdr__out = ev_hdr;
838 case ODP_EVENT_TIMEOUT: {
839 odp_timeout_t odp_tmo = odp_timeout_from_event(odp_event);
840 event_hdr_t *ev_hdr = odp_timeout_user_area(odp_tmo);
841 const bool esv_ena = esv_enabled();
849 evhdl_t evhdl = {.event =
event};
852 evhdl.evgen = evhdr_hdl.evgen;
853 ev_hdr->
event = evhdl.event;
858 *ev_hdr__out = ev_hdr;
886event_init_pkt_multi(
const odp_packet_t odp_pkts[] ,
889 const int num,
bool is_extev)
891 for (
int i = 0; i < num; i++)
892 ev_hdrs[i] = odp_packet_user_area(odp_pkts[i]);
894 evhdr_init_pkt_multi(ev_hdrs, events, odp_pkts, num, is_extev);
908event_init_buf_multi(
const odp_buffer_t odp_bufs[],
911 const int num,
bool is_extev)
913 for (
int i = 0; i < num; i++)
914 ev_hdrs[i] = odp_buffer_user_area(odp_bufs[i]);
923 evstate_em2usr_multi(events, ev_hdrs, num, EVSTATE__DISPATCH_MULTI);
928 for (
int i = 0; i < num; i++)
929 events[i] = ev_hdrs[i]->event;
947event_init_odp_multi(
const odp_event_t odp_events[],
949 const int num,
bool is_extev,
952 if (unlikely(num <= 0))
955 odp_event_type_t type;
956 const int same = odp_event_type_multi(odp_events, num, &type);
960 case ODP_EVENT_PACKET: {
961 odp_packet_t odp_pkts[same];
963 odp_packet_from_event_multi(odp_pkts, odp_events, same);
968 events_odp2em(odp_events, events, same);
969 event_init_pkt_multi(odp_pkts, events, ev_hdrs, same, is_extev);
973 case ODP_EVENT_BUFFER: {
974 odp_buffer_t odp_bufs[same];
976 odp_buffer_from_event_multi(odp_bufs, odp_events, same);
980 events_odp2em(odp_events, events, same);
981 event_init_buf_multi(odp_bufs, events, ev_hdrs, same, is_extev);
992 if (likely(handled_num == num))
995 for (
int i = handled_num; i < num; i++)
996 events[i] = event_init_odp(odp_events[i], is_extev, disp_q_elem,
1011evvec_tbl2odp_revert(odp_event_t odp_event_vec)
1013 odp_event_vector_t odp_evv = odp_event_vector_from_event(odp_event_vec);
1014 odp_event_t *odp_evtbl = NULL;
1015 const int num = odp_event_vector_tbl(odp_evv, &odp_evtbl);
1017 if (likely(num > 0)) {
1019 em_event_t *
const ev_tbl = (em_event_t *
const)odp_evtbl;
1022 event_init_odp_multi(odp_evtbl , ev_tbl ,
1023 ev_hdr_tbl , num,
false,
1039pktvec_tbl2odp_revert(odp_event_t odp_event_pktvec)
1041 odp_packet_vector_t pkt_vec = odp_packet_vector_from_event(odp_event_pktvec);
1042 odp_packet_t *pkt_tbl = NULL;
1043 const int pkts = odp_packet_vector_tbl(pkt_vec, &pkt_tbl);
1045 if (likely(pkts > 0)) {
1047 em_event_t *
const ev_tbl = (em_event_t *
const)pkt_tbl;
1050 event_init_pkt_multi(pkt_tbl , ev_tbl ,
1051 ev_hdr_tbl , pkts,
false);
1059event_alloc_buf(
const mpool_elem_t *
const pool_elem, uint32_t size)
1061 odp_buffer_t odp_buf = ODP_BUFFER_INVALID;
1068 subpool = pool_find_subpool(pool_elem, size);
1069 if (unlikely(subpool < 0))
1073 odp_pool_t odp_pool = pool_elem->
odp_pool[subpool];
1076 unlikely(odp_pool == ODP_POOL_INVALID))
1079 odp_buf = odp_buffer_alloc(odp_pool);
1080 if (likely(odp_buf != ODP_BUFFER_INVALID))
1084 if (unlikely(odp_buf == ODP_BUFFER_INVALID))
1091 event_hdr_t *
const ev_hdr = odp_buffer_user_area(odp_buf);
1092 odp_event_t odp_event = odp_buffer_to_event(odp_buf);
1093 em_event_t
event = event_odp2em(odp_event);
1095 ev_hdr->
event = event;
1107event_alloc_buf_multi(em_event_t events[],
const int num,
1111 odp_buffer_t odp_bufs[num];
1112 odp_event_t odp_event;
1115 const bool esv_ena = esv_enabled();
1121 subpool = pool_find_subpool(pool_elem, size);
1122 if (unlikely(subpool < 0))
1130 odp_pool_t odp_pool = pool_elem->
odp_pool[subpool];
1133 unlikely(odp_pool == ODP_POOL_INVALID))
1136 int ret = odp_buffer_alloc_multi(odp_pool, &odp_bufs[num_bufs],
1138 if (unlikely(ret <= 0))
1142 for (i = num_bufs; i < num_bufs + ret; i++) {
1143 odp_event = odp_buffer_to_event(odp_bufs[i]);
1144 events[i] = event_odp2em(odp_event);
1148 for (i = num_bufs; i < num_bufs + ret; i++)
1149 ev_hdrs[i] = odp_buffer_user_area(odp_bufs[i]);
1153 evstate_alloc_multi(&events[num_bufs] ,
1154 &ev_hdrs[num_bufs], ret);
1157 for (i = num_bufs; i < num_bufs + ret; i++) {
1158 ev_hdrs[i]->
flags.all = 0;
1161 ev_hdrs[i]->
event = events[i];
1173 if (likely(num_bufs == num))
1185event_alloc_pkt(
const mpool_elem_t *pool_elem, uint32_t size)
1189 uint32_t alloc_size;
1190 odp_packet_t odp_pkt = ODP_PACKET_INVALID;
1193 if (size > push_len) {
1194 alloc_size = size - push_len;
1198 pull_len = push_len + 1 - size;
1205 subpool = pool_find_subpool(pool_elem, size);
1206 if (unlikely(subpool < 0))
1210 odp_pool_t odp_pool = pool_elem->
odp_pool[subpool];
1213 unlikely(odp_pool == ODP_POOL_INVALID))
1216 odp_pkt = odp_packet_alloc(odp_pool, alloc_size);
1217 if (likely(odp_pkt != ODP_PACKET_INVALID))
1221 if (unlikely(odp_pkt == ODP_PACKET_INVALID))
1233 ptr = odp_packet_push_head(odp_pkt, push_len);
1238 ptr = odp_packet_pull_tail(odp_pkt, pull_len);
1250 event_hdr_t *
const ev_hdr = odp_packet_user_area(odp_pkt);
1251 odp_event_t odp_event = odp_packet_to_event(odp_pkt);
1252 em_event_t
event = event_odp2em(odp_event);
1258 ev_hdr->
event = event;
1265 odp_packet_free(odp_pkt);
1273pktalloc_multi(odp_packet_t odp_pkts[],
int num,
1274 odp_pool_t odp_pool, uint32_t size,
1275 uint32_t push_len, uint32_t pull_len)
1277 int ret = odp_packet_alloc_multi(odp_pool, size, odp_pkts, num);
1279 if (unlikely(ret <= 0))
1282 const int num_pkts = ret;
1283 const void *ptr = NULL;
1288 for (i = 0; i < num_pkts; i++) {
1289 ptr = odp_packet_push_head(odp_pkts[i], push_len);
1291 goto err_pktalloc_multi;
1295 for (i = 0; i < num_pkts; i++) {
1296 ptr = odp_packet_pull_tail(odp_pkts[i], pull_len);
1298 goto err_pktalloc_multi;
1307 for (i = 0; i < num_pkts; i++)
1313 odp_packet_free_sp(odp_pkts, num_pkts);
1321event_alloc_pkt_multi(em_event_t events[],
const int num,
1327 odp_packet_t odp_pkts[num];
1329 odp_event_t *
const odp_events = (odp_event_t *)events;
1331 uint32_t alloc_size;
1333 const bool esv_ena = esv_enabled();
1335 if (size > push_len) {
1336 alloc_size = size - push_len;
1340 pull_len = push_len + 1 - size;
1347 subpool = pool_find_subpool(pool_elem, size);
1348 if (unlikely(subpool < 0))
1356 odp_pool_t odp_pool = pool_elem->
odp_pool[subpool];
1359 unlikely(odp_pool == ODP_POOL_INVALID))
1362 int ret = pktalloc_multi(&odp_pkts[num_pkts], num_req,
1363 odp_pool, alloc_size,
1364 push_len, pull_len);
1365 if (unlikely(ret <= 0))
1372 odp_packet_to_event_multi(&odp_pkts[num_pkts],
1373 &odp_events[num_pkts], ret);
1375 for (i = num_pkts; i < num_pkts + ret; i++)
1376 ev_hdrs[i] = odp_packet_user_area(odp_pkts[i]);
1384 evstate_alloc_multi(&events[num_pkts] ,
1385 &ev_hdrs[num_pkts], ret);
1388 for (i = num_pkts; i < num_pkts + ret; i++) {
1389 ev_hdrs[i]->
flags.all = 0;
1392 ev_hdrs[i]->
event = events[i];
1403 if (likely(num_pkts == num))
1412event_alloc_vector__odp_pktvec(
const mpool_elem_t *pool_elem, uint32_t size)
1414 odp_packet_vector_t odp_pktvec = ODP_PACKET_VECTOR_INVALID;
1421 subpool = pool_find_subpool(pool_elem, size);
1422 if (unlikely(subpool < 0))
1426 odp_pool_t odp_pool = pool_elem->
odp_pool[subpool];
1429 unlikely(odp_pool == ODP_POOL_INVALID))
1432 odp_pktvec = odp_packet_vector_alloc(odp_pool);
1433 if (likely(odp_pktvec != ODP_PACKET_VECTOR_INVALID))
1437 if (unlikely(odp_pktvec == ODP_PACKET_VECTOR_INVALID))
1452 event_hdr_t *
const ev_hdr = odp_packet_vector_user_area(odp_pktvec);
1453 odp_event_t odp_event = odp_packet_vector_to_event(odp_pktvec);
1454 em_event_t
event = event_odp2em(odp_event);
1459 ev_hdr->
event = event;
1466 odp_packet_vector_free(odp_pktvec);
1471event_alloc_vector__odp_evvec(
const mpool_elem_t *pool_elem, uint32_t size)
1473 odp_event_vector_t odp_evvec = ODP_EVENT_VECTOR_INVALID;
1480 subpool = pool_find_subpool(pool_elem, size);
1481 if (unlikely(subpool < 0))
1485 odp_pool_t odp_pool = pool_elem->
odp_pool[subpool];
1488 unlikely(odp_pool == ODP_POOL_INVALID))
1491 odp_evvec = odp_event_vector_alloc(odp_pool);
1492 if (likely(odp_evvec != ODP_EVENT_VECTOR_INVALID))
1496 if (unlikely(odp_evvec == ODP_EVENT_VECTOR_INVALID))
1510 event_hdr_t *
const ev_hdr = odp_event_vector_user_area(odp_evvec);
1511 odp_event_t odp_event = odp_event_vector_to_event(odp_evvec);
1512 em_event_t
event = event_odp2em(odp_event);
1517 ev_hdr->
event = event;
1524 odp_event_vector_free(odp_evvec);
1529event_alloc_vector(
const mpool_elem_t *pool_elem, uint32_t size)
1531 if (
em_shm->
opt.vector.backend == EM_VECTOR_BACKEND_PACKET)
1532 return event_alloc_vector__odp_pktvec(pool_elem, size);
1534 return event_alloc_vector__odp_evvec(pool_elem, size);
1541pktvec_alloc_multi(odp_packet_vector_t odp_pktvecs[],
int num,
1542 odp_pool_t odp_pool)
1546 for (i = 0; i < num; i++) {
1547 odp_pktvecs[i] = odp_packet_vector_alloc(odp_pool);
1548 if (unlikely(odp_pktvecs[i] == ODP_PACKET_VECTOR_INVALID))
1552 const int num_vecs = i;
1554 if (unlikely(num_vecs == 0))
1562 for (i = 0; i < num_vecs; i++)
1563 odp_packet_vector_user_flag_set(odp_pktvecs[i],
USER_FLAG_SET);
1572evvec_alloc_multi(odp_event_vector_t odp_evvecs[],
int num,
1573 odp_pool_t odp_pool)
1577 for (i = 0; i < num; i++) {
1578 odp_evvecs[i] = odp_event_vector_alloc(odp_pool);
1579 if (unlikely(odp_evvecs[i] == ODP_EVENT_VECTOR_INVALID))
1583 const int num_vecs = i;
1585 if (unlikely(num_vecs == 0))
1592 for (i = 0; i < num_vecs; i++)
1593 odp_event_vector_user_flag_set(odp_evvecs[i],
USER_FLAG_SET);
1599event_alloc_vector_multi__odp_pktvec(em_event_t events[],
const int num,
1603 odp_packet_vector_t odp_pktvecs[num];
1605 odp_event_t *
const odp_events = (odp_event_t *)events;
1608 const bool esv_ena = esv_enabled();
1614 subpool = pool_find_subpool(pool_elem, size);
1615 if (unlikely(subpool < 0))
1623 odp_pool_t odp_pool = pool_elem->
odp_pool[subpool];
1626 unlikely(odp_pool == ODP_POOL_INVALID))
1629 int ret = pktvec_alloc_multi(&odp_pktvecs[num_vecs], num_req, odp_pool);
1631 if (unlikely(ret <= 0))
1638 for (i = num_vecs; i < num_vecs + ret; i++) {
1639 odp_events[i] = odp_packet_vector_to_event(odp_pktvecs[i]);
1640 ev_hdrs[i] = odp_packet_vector_user_area(odp_pktvecs[i]);
1649 evstate_alloc_multi(&events[num_vecs] ,
1650 &ev_hdrs[num_vecs], ret);
1653 for (i = num_vecs; i < num_vecs + ret; i++) {
1654 ev_hdrs[i]->
flags.all = 0;
1658 ev_hdrs[i]->
event = events[i];
1669 if (likely(num_vecs == num))
1678event_alloc_vector_multi__odp_evvec(em_event_t events[],
const int num,
1682 odp_event_vector_t odp_evvecs[num];
1684 odp_event_t *
const odp_events = (odp_event_t *)events;
1687 const bool esv_ena = esv_enabled();
1693 subpool = pool_find_subpool(pool_elem, size);
1694 if (unlikely(subpool < 0))
1702 odp_pool_t odp_pool = pool_elem->
odp_pool[subpool];
1705 unlikely(odp_pool == ODP_POOL_INVALID))
1708 int ret = evvec_alloc_multi(&odp_evvecs[num_vecs], num_req, odp_pool);
1710 if (unlikely(ret <= 0))
1717 for (i = num_vecs; i < num_vecs + ret; i++) {
1718 odp_events[i] = odp_event_vector_to_event(odp_evvecs[i]);
1719 ev_hdrs[i] = odp_event_vector_user_area(odp_evvecs[i]);
1728 evstate_alloc_multi(&events[num_vecs] ,
1729 &ev_hdrs[num_vecs], ret);
1732 for (i = num_vecs; i < num_vecs + ret; i++) {
1733 ev_hdrs[i]->
flags.all = 0;
1737 ev_hdrs[i]->
event = events[i];
1748 if (likely(num_vecs == num))
1760event_alloc_vector_multi(em_event_t events[],
const int num,
1764 if (
em_shm->
opt.vector.backend == EM_VECTOR_BACKEND_PACKET)
1765 return event_alloc_vector_multi__odp_pktvec(events , num,
1766 pool_elem, size, type);
1768 return event_alloc_vector_multi__odp_evvec(events , num,
1769 pool_elem, size, type);
1775static inline em_event_t
1777 const uint16_t api_op)
1790 ev_hdr = event_alloc_pkt(pool_elem, size);
1792 ev_hdr = event_alloc_buf(pool_elem, size);
1794 ev_hdr = event_alloc_vector(pool_elem, size);
1796 if (unlikely(!ev_hdr))
1805 (void)evstate_alloc(ev_hdr->
event, ev_hdr, api_op);
1807 ev_hdr->
flags.all = 0;
1817 return ev_hdr->
event;
1825event_pointer(em_event_t event)
1827 const odp_event_t odp_event = event_em2odp(event);
1828 const odp_event_type_t odp_etype = odp_event_type(odp_event);
1829 void *ev_ptr = NULL;
1831 if (odp_etype == ODP_EVENT_PACKET) {
1832 const odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
1834 ev_ptr = odp_packet_data(odp_pkt);
1835 }
else if (odp_etype == ODP_EVENT_BUFFER) {
1836 const odp_buffer_t odp_buf = odp_buffer_from_event(odp_event);
1837 const event_hdr_t *ev_hdr = odp_buffer_user_area(odp_buf);
1840 ev_ptr = odp_buffer_addr(odp_buf);
1843 ev_ptr = (
void *)((uintptr_t)ev_ptr + 32 - align_offset);
1850event_has_ref(em_event_t event)
1852 odp_event_t odp_event = event_em2odp(event);
1853 odp_event_type_t odp_etype = odp_event_type(odp_event);
1855 if (odp_etype != ODP_EVENT_PACKET)
1858 odp_packet_t odp_pkt = odp_packet_from_event(odp_event);
1860 return odp_packet_has_ref(odp_pkt) ? true :
false;
ENV_LOCAL em_locm_t em_locm
#define EM_EVENT_GROUP_UNDEF
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_t odp_pool[EM_MAX_SUBPOOLS]
em_event_type_t event_type