numam-dpdk/examples/l3fwd/l3fwd_event.h
Shijith Thotton e8adca1951 examples/l3fwd: support event vector
Added changes to receive packets as event vector. By default this is
disabled and can be enabled using the option --event-vector. Vector
size and timeout to form the vector can be configured using options
--event-vector-size and --event-vector-tmo.

Example:
dpdk-l3fwd -l 0-3 -n 4 -- -p 0x03 --mode=eventdev \
	--eventq-sched=ordered --event-vector --event-vector-size 16

Signed-off-by: Shijith Thotton <sthotton@marvell.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
2021-10-21 10:16:00 +02:00

113 lines
2.8 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(C) 2019 Marvell International Ltd.
*/
#ifndef __L3FWD_EVENTDEV_H__
#define __L3FWD_EVENTDEV_H__
#include <rte_common.h>
#include <rte_eventdev.h>
#include <rte_event_eth_rx_adapter.h>
#include <rte_event_eth_tx_adapter.h>
#include <rte_service.h>
#include <rte_spinlock.h>
#include "l3fwd.h"
#define L3FWD_EVENT_SINGLE 0x1
#define L3FWD_EVENT_BURST 0x2
#define L3FWD_EVENT_TX_DIRECT 0x4
#define L3FWD_EVENT_TX_ENQ 0x8
typedef uint32_t (*event_device_setup_cb)(void);
typedef void (*event_queue_setup_cb)(uint32_t event_queue_cfg);
typedef void (*event_port_setup_cb)(void);
typedef void (*adapter_setup_cb)(void);
typedef int (*event_loop_cb)(void *);
struct l3fwd_event_queues {
uint8_t *event_q_id;
uint8_t nb_queues;
};
struct l3fwd_event_ports {
uint8_t *event_p_id;
uint8_t nb_ports;
rte_spinlock_t lock;
};
struct l3fwd_event_rx_adptr {
uint32_t service_id;
uint8_t nb_rx_adptr;
uint8_t *rx_adptr;
};
struct l3fwd_event_tx_adptr {
uint32_t service_id;
uint8_t nb_tx_adptr;
uint8_t *tx_adptr;
};
struct l3fwd_event_setup_ops {
event_device_setup_cb event_device_setup;
event_queue_setup_cb event_queue_setup;
event_port_setup_cb event_port_setup;
adapter_setup_cb adapter_setup;
event_loop_cb lpm_event_loop;
event_loop_cb em_event_loop;
event_loop_cb fib_event_loop;
};
struct l3fwd_event_resources {
struct rte_event_port_conf def_p_conf;
struct l3fwd_event_rx_adptr rx_adptr;
struct l3fwd_event_tx_adptr tx_adptr;
uint8_t disable_implicit_release;
struct l3fwd_event_setup_ops ops;
struct rte_mempool * (*pkt_pool)[NB_SOCKETS];
struct rte_mempool **vec_pool;
struct l3fwd_event_queues evq;
struct l3fwd_event_ports evp;
uint32_t port_mask;
uint8_t per_port_pool;
uint8_t event_d_id;
uint8_t sched_type;
uint8_t tx_mode_q;
uint8_t deq_depth;
uint8_t has_burst;
uint8_t enabled;
uint8_t eth_rx_queues;
uint8_t vector_enabled;
uint16_t vector_size;
uint64_t vector_tmo_ns;
};
static inline void
event_vector_attr_validate(struct rte_event_vector *vec, struct rte_mbuf *mbuf)
{
/* l3fwd application only changes mbuf port while processing */
if (vec->attr_valid && (vec->port != mbuf->port))
vec->attr_valid = 0;
}
static inline void
event_vector_txq_set(struct rte_event_vector *vec, uint16_t txq)
{
if (vec->attr_valid) {
vec->queue = txq;
} else {
int i;
for (i = 0; i < vec->nb_elem; i++)
rte_event_eth_tx_adapter_txq_set(vec->mbufs[i], txq);
}
}
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);
#endif /* __L3FWD_EVENTDEV_H__ */