@@ -663,6 +663,7 @@ em_main_loop(__rte_unused void *dummy)
return 0;
}
+#ifdef RTE_LIB_EVENTDEV
static __rte_always_inline void
em_event_loop_single(struct l3fwd_event_resources *evt_rsrc,
const uint8_t flags)
@@ -959,6 +960,7 @@ em_event_main_loop_tx_q_burst_vector(__rte_unused void *dummy)
em_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_ENQ);
return 0;
}
+#endif
/* Initialize exact match (hash) parameters. 8< */
void
@@ -253,6 +253,7 @@ fib_main_loop(__rte_unused void *dummy)
return 0;
}
+#ifdef RTE_LIB_EVENTDEV
/* One eventdev loop for single and burst using fib. */
static __rte_always_inline void
fib_event_loop(struct l3fwd_event_resources *evt_rsrc,
@@ -635,6 +636,7 @@ fib_event_main_loop_tx_q_burst_vector(__rte_unused void *dummy)
fib_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_ENQ);
return 0;
}
+#endif
/* Function to setup fib. 8< */
void
@@ -226,6 +226,7 @@ lpm_main_loop(__rte_unused void *dummy)
return 0;
}
+#ifdef RTE_LIB_EVENTDEV
static __rte_always_inline uint16_t
lpm_process_event_pkt(const struct lcore_conf *lconf, struct rte_mbuf *mbuf)
{
@@ -554,6 +555,7 @@ lpm_event_main_loop_tx_q_burst_vector(__rte_unused void *dummy)
lpm_event_loop_vector(evt_rsrc, L3FWD_EVENT_TX_ENQ);
return 0;
}
+#endif
void
setup_lpm(const int socketid)
@@ -135,8 +135,10 @@ static struct rte_eth_conf port_conf = {
uint32_t max_pkt_len;
-static struct rte_mempool *pktmbuf_pool[RTE_MAX_ETHPORTS][NB_SOCKETS];
+#ifdef RTE_LIB_EVENTDEV
static struct rte_mempool *vector_pool[RTE_MAX_ETHPORTS];
+#endif
+static struct rte_mempool *pktmbuf_pool[RTE_MAX_ETHPORTS][NB_SOCKETS];
static uint8_t lkp_per_socket[NB_SOCKETS];
struct l3fwd_lkp_mode {
@@ -398,8 +400,10 @@ print_usage(const char *prgname)
" [--parse-ptype]"
" [--per-port-pool]"
" [--mode]"
+#ifdef RTE_LIB_EVENTDEV
" [--eventq-sched]"
" [--event-vector [--event-vector-size SIZE] [--event-vector-tmo NS]]"
+#endif
" [-E]"
" [-L]\n\n"
@@ -422,6 +426,7 @@ print_usage(const char *prgname)
" --per-port-pool: Use separate buffer pool per port\n"
" --mode: Packet transfer mode for I/O, poll or eventdev\n"
" Default mode = poll\n"
+#ifdef RTE_LIB_EVENTDEV
" --eventq-sched: Event queue synchronization method\n"
" ordered, atomic or parallel.\n"
" Default: atomic\n"
@@ -432,6 +437,7 @@ print_usage(const char *prgname)
" --event-vector: Enable event vectorization.\n"
" --event-vector-size: Max vector size if event vectorization is enabled.\n"
" --event-vector-tmo: Max timeout to form vector in nanoseconds if event vectorization is enabled\n"
+#endif
" -E : Enable exact match, legacy flag please use --lookup=em instead\n"
" -L : Enable longest prefix match, legacy flag please use --lookup=lpm instead\n"
" --rule_ipv4=FILE: Specify the ipv4 rules entries file.\n"
@@ -559,14 +565,16 @@ parse_eth_dest(const char *optarg)
}
static void
-parse_mode(const char *optarg)
+parse_mode(const char *optarg __rte_unused)
{
+#ifdef RTE_LIB_EVENTDEV
struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
if (!strcmp(optarg, "poll"))
evt_rsrc->enabled = false;
else if (!strcmp(optarg, "eventdev"))
evt_rsrc->enabled = true;
+#endif
}
static void
@@ -601,6 +609,7 @@ parse_queue_size(const char *queue_size_arg, uint16_t *queue_size, int rx)
*queue_size = value;
}
+#ifdef RTE_LIB_EVENTDEV
static void
parse_eventq_sched(const char *optarg)
{
@@ -631,6 +640,7 @@ parse_event_eth_rx_queues(const char *eth_rx_queues)
evt_rsrc->eth_rx_queues = num_eth_rx_queues;
}
+#endif
static int
parse_lookup(const char *optarg)
@@ -756,9 +766,11 @@ parse_args(int argc, char **argv)
int option_index;
char *prgname = argv[0];
uint8_t lcore_params = 0;
+#ifdef RTE_LIB_EVENTDEV
uint8_t eventq_sched = 0;
uint8_t eth_rx_q = 0;
struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
+#endif
argvopt = argv;
@@ -850,6 +862,7 @@ parse_args(int argc, char **argv)
parse_mode(optarg);
break;
+#ifdef RTE_LIB_EVENTDEV
case CMD_LINE_OPT_EVENTQ_SYNC_NUM:
parse_eventq_sched(optarg);
eventq_sched = 1;
@@ -860,6 +873,20 @@ parse_args(int argc, char **argv)
eth_rx_q = 1;
break;
+ case CMD_LINE_OPT_ENABLE_VECTOR_NUM:
+ printf("event vectorization is enabled\n");
+ evt_rsrc->vector_enabled = 1;
+ break;
+
+ case CMD_LINE_OPT_VECTOR_SIZE_NUM:
+ evt_rsrc->vector_size = strtol(optarg, NULL, 10);
+ break;
+
+ case CMD_LINE_OPT_VECTOR_TMO_NS_NUM:
+ evt_rsrc->vector_tmo_ns = strtoull(optarg, NULL, 10);
+ break;
+#endif
+
case CMD_LINE_OPT_LOOKUP_NUM:
if (lookup_mode != L3FWD_LOOKUP_DEFAULT) {
fprintf(stderr, "Only one lookup mode is allowed at a time!\n");
@@ -875,16 +902,6 @@ parse_args(int argc, char **argv)
return -1;
break;
- case CMD_LINE_OPT_ENABLE_VECTOR_NUM:
- printf("event vectorization is enabled\n");
- evt_rsrc->vector_enabled = 1;
- break;
- case CMD_LINE_OPT_VECTOR_SIZE_NUM:
- evt_rsrc->vector_size = strtol(optarg, NULL, 10);
- break;
- case CMD_LINE_OPT_VECTOR_TMO_NS_NUM:
- evt_rsrc->vector_tmo_ns = strtoull(optarg, NULL, 10);
- break;
case CMD_LINE_OPT_RULE_IPV4_NUM:
l3fwd_set_rule_ipv4_name(optarg);
break;
@@ -900,6 +917,8 @@ parse_args(int argc, char **argv)
}
}
+ RTE_SET_USED(lcore_params); /* needed if no eventdev block */
+#ifdef RTE_LIB_EVENTDEV
if (evt_rsrc->enabled && lcore_params) {
fprintf(stderr, "lcore config is not valid when event mode is selected\n");
return -1;
@@ -927,6 +946,7 @@ parse_args(int argc, char **argv)
"vector timeout set to default (%" PRIu64 " ns)\n",
evt_rsrc->vector_tmo_ns);
}
+#endif
/*
* Nothing is selected, pick longest-prefix match
@@ -962,7 +982,9 @@ print_ethaddr(const char *name, const struct rte_ether_addr *eth_addr)
int
init_mem(uint16_t portid, unsigned int nb_mbuf)
{
+#ifdef RTE_LIB_EVENTDEV
struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
+#endif
struct lcore_conf *qconf;
int socketid;
unsigned lcore_id;
@@ -1007,6 +1029,7 @@ init_mem(uint16_t portid, unsigned int nb_mbuf)
}
}
+#ifdef RTE_LIB_EVENTDEV
if (evt_rsrc->vector_enabled && vector_pool[portid] == NULL) {
unsigned int nb_vec;
@@ -1025,6 +1048,7 @@ init_mem(uint16_t portid, unsigned int nb_mbuf)
printf("Allocated vector pool for port %d\n",
portid);
}
+#endif
qconf = &lcore_conf[lcore_id];
qconf->ipv4_lookup_struct =
@@ -1406,6 +1430,7 @@ l3fwd_service_enable(uint32_t service_id)
return 0;
}
+#ifdef RTE_LIB_EVENTDEV
static void
l3fwd_event_service_setup(void)
{
@@ -1458,16 +1483,20 @@ l3fwd_event_service_setup(void)
l3fwd_service_enable(service_id);
}
}
+#endif
int
main(int argc, char **argv)
{
+#ifdef RTE_LIB_EVENTDEV
struct l3fwd_event_resources *evt_rsrc;
+ int i;
+#endif
struct lcore_conf *qconf;
uint16_t queueid, portid;
unsigned int lcore_id;
uint8_t queue;
- int i, ret;
+ int ret;
/* init EAL */
ret = rte_eal_init(argc, argv);
@@ -1487,7 +1516,9 @@ main(int argc, char **argv)
*(uint64_t *)(val_eth + portid) = dest_eth_addr[portid];
}
+#ifdef RTE_LIB_EVENTDEV
evt_rsrc = l3fwd_get_eventdev_rsrc();
+#endif
/* parse application arguments (after the EAL ones) */
ret = parse_args(argc, argv);
if (ret < 0)
@@ -1499,6 +1530,7 @@ main(int argc, char **argv)
/* Add the config file rules */
l3fwd_lkp.read_config_files();
+#ifdef RTE_LIB_EVENTDEV
evt_rsrc->per_port_pool = per_port_pool;
evt_rsrc->pkt_pool = pktmbuf_pool;
evt_rsrc->vec_pool = vector_pool;
@@ -1514,6 +1546,7 @@ main(int argc, char **argv)
l3fwd_lkp.main_loop = evt_rsrc->ops.lpm_event_loop;
l3fwd_event_service_setup();
} else
+#endif
l3fwd_poll_resource_setup();
/* start ports */
@@ -1562,6 +1595,8 @@ main(int argc, char **argv)
ret = 0;
/* launch per-lcore init on every lcore */
rte_eal_mp_remote_launch(l3fwd_lkp.main_loop, NULL, CALL_MAIN);
+
+#ifdef RTE_LIB_EVENTDEV
if (evt_rsrc->enabled) {
for (i = 0; i < evt_rsrc->rx_adptr.nb_rx_adptr; i++)
rte_event_eth_rx_adapter_stop(
@@ -1589,7 +1624,9 @@ main(int argc, char **argv)
rte_event_dev_stop(evt_rsrc->event_d_id);
rte_event_dev_close(evt_rsrc->event_d_id);
- } else {
+ } else
+#endif
+ {
rte_eal_mp_wait_lcore();
RTE_ETH_FOREACH_DEV(portid) {
@@ -7,14 +7,19 @@
# DPDK instance, use 'make'
allow_experimental_apis = true
-deps += ['acl', 'hash', 'lpm', 'fib', 'eventdev']
+deps += ['acl', 'hash', 'lpm', 'fib']
sources = files(
'l3fwd_acl.c',
'l3fwd_em.c',
- 'l3fwd_event.c',
- 'l3fwd_event_internal_port.c',
- 'l3fwd_event_generic.c',
'l3fwd_fib.c',
'l3fwd_lpm.c',
'main.c',
)
+if dpdk_conf.has('RTE_LIB_EVENTDEV')
+ sources += files(
+ 'l3fwd_event.c',
+ 'l3fwd_event_internal_port.c',
+ 'l3fwd_event_generic.c',
+ )
+ deps += 'eventdev'
+endif