62COMPILE_TIME_ASSERT((uintptr_t)
EM_EVENT_UNDEF == (uintptr_t)ODP_EVENT_INVALID,
63 EM_EVENT_NOT_EQUAL_TO_ODP_EVENT);
65 "EM_TMO_TYPE_NONE must be 0");
69void print_event_info(
void);
70em_event_t
pkt_clone_odp(odp_packet_t pkt, odp_pool_t pkt_pool,
71 uint32_t offset, uint32_t size,
72 bool clone_uarea,
bool is_clone_part);
73void output_queue_track(
queue_elem_t *
const output_q_elem);
74void output_queue_drain(
const queue_elem_t *output_q_elem);
75void output_queue_buffering_drain(
void);
77uint32_t event_vector_tbl(em_event_t vector_event, em_event_t **event_tbl);
79 em_event_t **event_tbl );
81 em_event_t **event_tbl );
83em_status_t event_vector_max_size(em_event_t vector_event, uint32_t *max_size ,
100 odp_event_t odp_event = event_em2odp(event);
101 odp_queue_t odp_queue = q_elem->
odp_queue;
104 (odp_event == ODP_EVENT_INVALID ||
105 odp_queue == ODP_QUEUE_INVALID)))
115 odp_event_type_t odp_etype = odp_event_type(odp_event);
122 if (odp_etype == ODP_EVENT_PACKET_VECTOR)
123 pktvec_tbl2odp(odp_event);
124 else if (odp_etype == ODP_EVENT_VECTOR)
125 evvec_tbl2odp(odp_event);
128 int ret = odp_queue_enq(odp_queue, odp_event);
132 if (odp_etype == ODP_EVENT_PACKET_VECTOR)
133 pktvec_tbl2odp_revert(odp_event);
134 else if (odp_etype == ODP_EVENT_VECTOR)
135 evvec_tbl2odp_revert(odp_event);
146 int ret = odp_queue_enq(odp_queue, odp_event);
155send_sched_multi(
const em_event_t events[],
const int num,
158 const bool esv_ena = esv_enabled();
159 odp_event_t odp_events[num];
160 odp_queue_t odp_queue = q_elem->
odp_queue;
162 if (unlikely(
EM_CHECK_LEVEL > 1 && odp_queue == ODP_QUEUE_INVALID))
170 events_em2odp(events, odp_events, num);
177 odp_event_type_t odp_etypes[num];
179 for (
int i = 0; i < num; i++)
180 odp_etypes[i] = odp_event_type(odp_events[i]);
182 for (
int i = 0; i < num; i++) {
183 if (odp_etypes[i] == ODP_EVENT_PACKET_VECTOR)
184 pktvec_tbl2odp(odp_events[i]);
185 else if (odp_etypes[i] == ODP_EVENT_VECTOR)
186 evvec_tbl2odp(odp_events[i]);
190 int ret = odp_queue_enq_multi(odp_queue, odp_events, num);
192 if (likely(ret == num))
198 int enq = ret < 0 ? 0 : ret;
201 for (
int i = enq; i < num; i++) {
202 if (odp_etypes[i] == ODP_EVENT_PACKET_VECTOR)
203 pktvec_tbl2odp_revert(odp_events[i]);
204 else if (odp_etypes[i] == ODP_EVENT_VECTOR)
205 evvec_tbl2odp_revert(odp_events[i]);
213 int ret = odp_queue_enq_multi(odp_queue, odp_events, num);
215 if (likely(ret == num))
221 int enq = ret < 0 ? 0 : ret;
231 evhdl_t evhdl = {.event =
event};
238 em_queue_t queue = (em_queue_t)(uintptr_t)q_elem->
queue;
240 .evptr = evhdl.evptr};
242 ret = odp_stash_put_u64(locm->
local_queues.prio[prio].stash,
244 if (likely(ret == 1)) {
254send_local_multi(
const em_event_t events[],
const int num,
266 em_queue_t queue = (em_queue_t)(uintptr_t)q_elem->
queue;
267 const uint16_t qidx = (uint16_t)queue_hdl2idx(queue);
269 for (
int i = 0; i < num; i++)
271 .evptr = evhdl_tbl[i].evptr};
273 int ret = odp_stash_put_u64(locm->
local_queues.prio[prio].stash,
274 &entry_tbl[0].u64, num);
275 if (likely(ret > 0)) {
288send_output(em_event_t event,
queue_elem_t *
const output_q_elem)
294 output_q_elem->
state != EM_QUEUE_STATE_UNSCHEDULED))
304 const odp_queue_t odp_queue = output_q_elem->
odp_queue;
305 odp_event_t odp_event = event_em2odp(event);
309 (odp_event == ODP_EVENT_INVALID ||
310 odp_queue == ODP_QUEUE_INVALID)))
314 output_queue_track(output_q_elem);
317 ret = odp_queue_enq(odp_queue, odp_event);
318 if (unlikely(ret != 0))
324 odp_ticketlock_t *
const lock =
325 &output_q_elem->output.
lock;
327 if (!odp_ticketlock_trylock(lock))
329 output_queue_drain(output_q_elem);
330 odp_ticketlock_unlock(lock);
339 const em_queue_t output_queue = (em_queue_t)(uintptr_t)output_q_elem->
queue;
342 void *
const output_fn_args =
346 sent = output_fn(&event, 1, output_queue, output_fn_args);
347 if (unlikely(sent != 1))
357send_output_multi(
const em_event_t events[],
const unsigned int num,
365 output_q_elem->
state != EM_QUEUE_STATE_UNSCHEDULED))
375 const odp_queue_t odp_queue = output_q_elem->
odp_queue;
376 odp_event_t odp_events[num];
379 odp_queue == ODP_QUEUE_INVALID))
383 output_queue_track(output_q_elem);
385 events_em2odp(events, odp_events, num);
388 sent = odp_queue_enq_multi(odp_queue, odp_events, num);
389 if (unlikely(sent <= 0))
395 odp_ticketlock_t *
const lock =
396 &output_q_elem->output.
lock;
398 if (!odp_ticketlock_trylock(lock))
400 output_queue_drain(output_q_elem);
401 odp_ticketlock_unlock(lock);
410 const em_queue_t output_queue = (em_queue_t)(uintptr_t)output_q_elem->
queue;
414 sent = output_fn(events, num, output_queue, output_fn_args);
430 odp_event_t odp_event = event_em2odp(event);
431 odp_queue_t odp_queue = q_elem->
odp_queue;
434 (odp_event == ODP_EVENT_INVALID ||
435 odp_queue == ODP_QUEUE_INVALID)))
444 q_elem->
state != EM_QUEUE_STATE_UNSCHEDULED)) {
449 odp_event_type_t odp_etype = odp_event_type(odp_event);
451 if (unlikely(odp_etype == ODP_EVENT_VECTOR ||
452 odp_etype == ODP_EVENT_PACKET_VECTOR)) {
465 int ret = odp_queue_enq(odp_queue, odp_event);
467 if (unlikely(ret != 0)) {
477send_aggr_multi(
const em_event_t events[],
event_hdr_t *
const ev_hdrs[],
480 odp_event_t odp_events[num];
481 odp_queue_t odp_queue = q_elem->
odp_queue;
483 if (unlikely(
EM_CHECK_LEVEL > 1 && odp_queue == ODP_QUEUE_INVALID))
489 q_elem->
state != EM_QUEUE_STATE_UNSCHEDULED))
492 events_em2odp(events, odp_events, num);
495 odp_event_type_t odp_etypes[num];
497 for (
int i = 0; i < num; i++)
498 odp_etypes[i] = odp_event_type(odp_events[i]);
500 for (
int i = 0; i < num; i++) {
501 if (unlikely(odp_etypes[i] == ODP_EVENT_VECTOR ||
502 odp_etypes[i] == ODP_EVENT_PACKET_VECTOR))
512 for (
int i = 0; i < num; i++) {
513 if (!ev_hdrs[i]->flags.refs_used)
519 int ret = odp_queue_enq_multi(odp_queue, odp_events, num);
521 if (likely(ret == num))
527 int enq = ret < 0 ? 0 : ret;
531 for (
int i = enq; i < num; i++) {
532 if (!ev_hdrs[i]->flags.refs_used)
event_prealloc_hdr_t * event_prealloc(const mpool_elem_t *pool_elem, uint32_t size)
uint32_t event_vector_tbl__odp_pktvec(odp_packet_vector_t pkt_vec, em_event_t **event_tbl)
em_event_t pkt_clone_odp(odp_packet_t pkt, odp_pool_t pkt_pool, uint32_t offset, uint32_t size, bool clone_uarea, bool is_clone_part)
uint32_t event_vector_tbl__odp_evvec(odp_event_vector_t evvec, em_event_t **event_tbl)
ENV_LOCAL em_locm_t em_locm
#define EM_OUTPUT_QUEUE_IMMEDIATE
@ EM_ERR_OPERATION_FAILED
int(* em_output_func_t)(const em_event_t events[], const unsigned int num, const em_queue_t output_queue, void *output_fn_args)
@ EM_SCHED_CONTEXT_TYPE_ORDERED
em_sched_context_type_t sched_context_type
em_locm_current_t current
local_queues_t local_queues
em_output_func_t output_fn
union event_hdr::@43 flags
em_output_queue_conf_t output_conf