Since the transmit and receive functions should not be invoked when the device is stopped, stop lcores during kni ops and restart them after device is started once again.
Signed-off-by: Tomasz Duszynski <t...@semihalf.com> --- examples/kni/main.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/examples/kni/main.c b/examples/kni/main.c index cb48fb5..5c50448 100644 --- a/examples/kni/main.c +++ b/examples/kni/main.c @@ -166,6 +166,23 @@ static int kni_change_mtu(uint16_t port_id, unsigned int new_mtu); static int kni_config_network_interface(uint16_t port_id, uint8_t if_up); static rte_atomic32_t kni_stop = RTE_ATOMIC32_INIT(0); +static rte_atomic32_t kni_restart = RTE_ATOMIC32_INIT(0); + +static void +kni_stop_lcores(void) +{ + unsigned int i; + + rte_atomic32_inc(&kni_restart); + rte_atomic32_inc(&kni_stop); + + RTE_LCORE_FOREACH(i) { + if (i == rte_lcore_id()) + continue; + + rte_eal_wait_lcore(i); + } +} /* Print out statistics on packets handled */ static void @@ -712,6 +729,7 @@ kni_change_mtu(uint16_t port_id, unsigned int new_mtu) RTE_LOG(INFO, APP, "Change MTU of port %d to %u\n", port_id, new_mtu); + kni_stop_lcores(); /* Stop specific port */ rte_eth_dev_stop(port_id); @@ -755,6 +773,8 @@ kni_config_network_interface(uint16_t port_id, uint8_t if_up) RTE_LOG(INFO, APP, "Configure network interface of %d %s\n", port_id, if_up ? "up" : "down"); + kni_stop_lcores(); + if (if_up != 0) { /* Configure network interface up */ rte_eth_dev_stop(port_id); ret = rte_eth_dev_start(port_id); @@ -911,6 +931,7 @@ main(int argc, char** argv) } check_all_ports_link_status(nb_sys_ports, ports_mask); +restart: /* Launch per-lcore function on every lcore */ rte_eal_mp_remote_launch(main_loop, NULL, CALL_MASTER); RTE_LCORE_FOREACH_SLAVE(i) { @@ -918,6 +939,13 @@ main(int argc, char** argv) return -1; } + if (rte_atomic32_read(&kni_restart)) { + rte_atomic32_dec(&kni_stop); + rte_atomic32_dec(&kni_restart); + + goto restart; + } + /* Release resources */ for (port = 0; port < nb_sys_ports; port++) { if (!(ports_mask & (1 << port))) -- 2.7.4