From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tomasz Duszynski Subject: [PATCH 2/2] examples/kni: stop lcores while doing kni ops Date: Mon, 16 Oct 2017 13:45:48 +0200 Message-ID: <1508154348-10988-3-git-send-email-tdu@semihalf.com> References: <1508154348-10988-1-git-send-email-tdu@semihalf.com> Cc: Tomasz Duszynski To: dev@dpdk.org Return-path: Received: from mail-lf0-f49.google.com (mail-lf0-f49.google.com [209.85.215.49]) by dpdk.org (Postfix) with ESMTP id A0D851B6C8 for ; Mon, 16 Oct 2017 13:46:02 +0200 (CEST) Received: by mail-lf0-f49.google.com with SMTP id w21so9000551lfc.6 for ; Mon, 16 Oct 2017 04:46:02 -0700 (PDT) In-Reply-To: <1508154348-10988-1-git-send-email-tdu@semihalf.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- 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