const uint8_t tx_q_id = evt_rsrc->evq.event_q_id[
evt_rsrc->evq.nb_queues - 1];
const uint8_t event_d_id = evt_rsrc->event_d_id;
+ uint8_t deq = 0, enq = 0;
struct lcore_conf *lconf;
unsigned int lcore_id;
struct rte_event ev;
RTE_LOG(INFO, L3FWD, "entering %s on lcore %u\n", __func__, lcore_id);
while (!force_quit) {
- if (!rte_event_dequeue_burst(event_d_id, event_p_id, &ev, 1, 0))
+ deq = rte_event_dequeue_burst(event_d_id, event_p_id, &ev, 1,
+ 0);
+ if (!deq)
continue;
struct rte_mbuf *mbuf = ev.mbuf;
if (flags & L3FWD_EVENT_TX_ENQ) {
ev.queue_id = tx_q_id;
ev.op = RTE_EVENT_OP_FORWARD;
- while (rte_event_enqueue_burst(event_d_id, event_p_id,
- &ev, 1) && !force_quit)
- ;
+ do {
+ enq = rte_event_enqueue_burst(
+ event_d_id, event_p_id, &ev, 1);
+ } while (!enq && !force_quit);
}
if (flags & L3FWD_EVENT_TX_DIRECT) {
rte_event_eth_tx_adapter_txq_set(mbuf, 0);
- while (!rte_event_eth_tx_adapter_enqueue(event_d_id,
- event_p_id, &ev, 1, 0) &&
- !force_quit)
- ;
+ do {
+ enq = rte_event_eth_tx_adapter_enqueue(
+ event_d_id, event_p_id, &ev, 1, 0);
+ } while (!enq && !force_quit);
}
}
+
+ l3fwd_event_worker_cleanup(event_d_id, event_p_id, &ev, enq, deq, 0);
}
static __rte_always_inline void
const uint8_t event_d_id = evt_rsrc->event_d_id;
const uint16_t deq_len = evt_rsrc->deq_depth;
struct rte_event events[MAX_PKT_BURST];
+ int i, nb_enq = 0, nb_deq = 0;
struct lcore_conf *lconf;
unsigned int lcore_id;
- int i, nb_enq, nb_deq;
if (event_p_id < 0)
return;
nb_deq - nb_enq, 0);
}
}
+
+ l3fwd_event_worker_cleanup(event_d_id, event_p_id, events, nb_enq,
+ nb_deq, 0);
}
static __rte_always_inline void
const uint8_t event_d_id = evt_rsrc->event_d_id;
const uint16_t deq_len = evt_rsrc->deq_depth;
struct rte_event events[MAX_PKT_BURST];
+ int i, nb_enq = 0, nb_deq = 0;
struct lcore_conf *lconf;
unsigned int lcore_id;
- int i, nb_enq, nb_deq;
if (event_p_id < 0)
return;
nb_deq - nb_enq, 0);
}
}
+
+ l3fwd_event_worker_cleanup(event_d_id, event_p_id, events, nb_enq,
+ nb_deq, 1);
}
int __rte_noinline
fib_event_loop[evt_rsrc->vector_enabled][evt_rsrc->tx_mode_q]
[evt_rsrc->has_burst];
}
+
+static void
+l3fwd_event_vector_array_free(struct rte_event events[], uint16_t num)
+{
+ uint16_t i;
+
+ for (i = 0; i < num; i++) {
+ rte_pktmbuf_free_bulk(events[i].vec->mbufs,
+ events[i].vec->nb_elem);
+ rte_mempool_put(rte_mempool_from_obj(events[i].vec),
+ events[i].vec);
+ }
+}
+
+void
+l3fwd_event_worker_cleanup(uint8_t event_d_id, uint8_t event_p_id,
+ struct rte_event events[], uint16_t nb_enq,
+ uint16_t nb_deq, uint8_t is_vector)
+{
+ int i;
+
+ if (nb_deq) {
+ if (is_vector)
+ l3fwd_event_vector_array_free(events + nb_enq,
+ nb_deq - nb_enq);
+ else
+ for (i = nb_enq; i < nb_deq; i++)
+ rte_pktmbuf_free(events[i].mbuf);
+
+ for (i = 0; i < nb_deq; i++)
+ events[i].op = RTE_EVENT_OP_RELEASE;
+ rte_event_enqueue_burst(event_d_id, event_p_id, events, nb_deq);
+ }
+}
}
}
+
+
struct l3fwd_event_resources *l3fwd_get_eventdev_rsrc(void);
void l3fwd_event_resource_setup(struct rte_eth_conf *port_conf);
int l3fwd_get_free_event_port(struct l3fwd_event_resources *eventdev_rsrc);
void l3fwd_event_set_generic_ops(struct l3fwd_event_setup_ops *ops);
void l3fwd_event_set_internal_port_ops(struct l3fwd_event_setup_ops *ops);
+void l3fwd_event_worker_cleanup(uint8_t event_d_id, uint8_t event_p_id,
+ struct rte_event events[], uint16_t nb_enq,
+ uint16_t nb_deq, uint8_t is_vector);
#endif /* __L3FWD_EVENTDEV_H__ */
const uint8_t event_d_id = evt_rsrc->event_d_id;
const uint16_t deq_len = evt_rsrc->deq_depth;
struct rte_event events[MAX_PKT_BURST];
+ int i, nb_enq = 0, nb_deq = 0;
struct lcore_conf *lconf;
unsigned int lcore_id;
- int nb_enq, nb_deq, i;
uint32_t ipv4_arr[MAX_PKT_BURST];
uint8_t ipv6_arr[MAX_PKT_BURST][RTE_FIB6_IPV6_ADDR_SIZE];
nb_deq - nb_enq, 0);
}
}
+
+ l3fwd_event_worker_cleanup(event_d_id, event_p_id, events, nb_enq,
+ nb_deq, 0);
}
int __rte_noinline
const uint8_t event_d_id = evt_rsrc->event_d_id;
const uint16_t deq_len = evt_rsrc->deq_depth;
struct rte_event events[MAX_PKT_BURST];
- int nb_enq, nb_deq, i;
+ int nb_enq = 0, nb_deq = 0, i;
if (event_p_id < 0)
return;
nb_deq - nb_enq, 0);
}
}
+
+ l3fwd_event_worker_cleanup(event_d_id, event_p_id, events, nb_enq,
+ nb_deq, 1);
}
int __rte_noinline
const uint8_t tx_q_id = evt_rsrc->evq.event_q_id[
evt_rsrc->evq.nb_queues - 1];
const uint8_t event_d_id = evt_rsrc->event_d_id;
+ uint8_t enq = 0, deq = 0;
struct lcore_conf *lconf;
unsigned int lcore_id;
struct rte_event ev;
RTE_LOG(INFO, L3FWD, "entering %s on lcore %u\n", __func__, lcore_id);
while (!force_quit) {
- if (!rte_event_dequeue_burst(event_d_id, event_p_id, &ev, 1, 0))
+ deq = rte_event_dequeue_burst(event_d_id, event_p_id, &ev, 1,
+ 0);
+ if (!deq)
continue;
if (lpm_process_event_pkt(lconf, ev.mbuf) == BAD_PORT) {
if (flags & L3FWD_EVENT_TX_ENQ) {
ev.queue_id = tx_q_id;
ev.op = RTE_EVENT_OP_FORWARD;
- while (rte_event_enqueue_burst(event_d_id, event_p_id,
- &ev, 1) && !force_quit)
- ;
+ do {
+ enq = rte_event_enqueue_burst(
+ event_d_id, event_p_id, &ev, 1);
+ } while (!enq && !force_quit);
}
if (flags & L3FWD_EVENT_TX_DIRECT) {
rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0);
- while (!rte_event_eth_tx_adapter_enqueue(event_d_id,
- event_p_id, &ev, 1, 0) &&
- !force_quit)
- ;
+ do {
+ enq = rte_event_eth_tx_adapter_enqueue(
+ event_d_id, event_p_id, &ev, 1, 0);
+ } while (!enq && !force_quit);
}
}
+
+ l3fwd_event_worker_cleanup(event_d_id, event_p_id, &ev, enq, deq, 0);
}
static __rte_always_inline void
const uint8_t event_d_id = evt_rsrc->event_d_id;
const uint16_t deq_len = evt_rsrc->deq_depth;
struct rte_event events[MAX_PKT_BURST];
+ int i, nb_enq = 0, nb_deq = 0;
struct lcore_conf *lconf;
unsigned int lcore_id;
- int i, nb_enq, nb_deq;
if (event_p_id < 0)
return;
nb_deq - nb_enq, 0);
}
}
+
+ l3fwd_event_worker_cleanup(event_d_id, event_p_id, events, nb_enq,
+ nb_deq, 0);
}
static __rte_always_inline void
const uint8_t event_d_id = evt_rsrc->event_d_id;
const uint16_t deq_len = evt_rsrc->deq_depth;
struct rte_event events[MAX_PKT_BURST];
+ int i, nb_enq = 0, nb_deq = 0;
struct lcore_conf *lconf;
unsigned int lcore_id;
- int i, nb_enq, nb_deq;
if (event_p_id < 0)
return;
nb_deq - nb_enq, 0);
}
}
+
+ l3fwd_event_worker_cleanup(event_d_id, event_p_id, events, nb_enq,
+ nb_deq, 1);
}
int __rte_noinline