From patchwork Wed Jan 25 18:32:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 122521 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 072AF42441; Wed, 25 Jan 2023 19:32:12 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9DD1442D4C; Wed, 25 Jan 2023 19:32:11 +0100 (CET) Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) by mails.dpdk.org (Postfix) with ESMTP id 7215242D47 for ; Wed, 25 Jan 2023 19:32:09 +0100 (CET) Received: by mail-pg1-f178.google.com with SMTP id e10so13981144pgc.9 for ; Wed, 25 Jan 2023 10:32:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ieW2t4rebWcCQwfCS9bd0Ux7gNXOTFsqC+yuDVGmbKU=; b=J9MAhV9jv0vNfrHb+hHJ2FN/g+NA+PS/OoNcAWyGNwHLrx9PXdvEfaBgNBwzi1TDS0 GRnInGDS6I8qFYVB4vqMmLJzMKuTKSOxlYo36kVgPDKREW36yU/aOvxWVJ6MaliAYGQY IvyC4wnp/M62QU9E0+qg9T6L7txDK69CGDBDJ8CLgA8Paf6QQNGv0bR4e4ZZCEvT8gQf MwVl/gxvq2SGlvZjhoTDYrbu2CCI9auuMkGFCRHJlKhzi32yg/TxTeuMC4BajU45zKe1 TJ/SmK7H+UR6Dy5QabmZIObNsPXJF1EMwwoWfc9BJC+89PfssMLAe7TQSwztfX5ziQlj U9ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ieW2t4rebWcCQwfCS9bd0Ux7gNXOTFsqC+yuDVGmbKU=; b=qRLHNkChPmgKKJgfsxY3aDybnjORvpQri3HBLWUCYF3i5qo23Ayb7jK7CHgeWdeBRU Z46cSqgDqv+Uq3ZP4bnqA9SEyPw/RBav9BwD7TTpLvstGcAEXkL0izKuyquZGGSljcp8 E/FLuub6TRsmYBqwSQGK96llfXmdK1TKavjaj6XV2bRejccev/CBPThz6Mq1rq2XE2pF Gri8KlWGc3jyV2x0y8h5Q/u6X9cb/vubFlGv8KcsbOpwXekQdYpIbTOxPHdQ5SpomZnN 2tt/Hg+bC5C/Mm6SIZvMoupc0pzdZ2m+I6NxfqboTS1XBHgxjZn6Y7Nn1te1JAir/DoH Y+Pg== X-Gm-Message-State: AFqh2kperGf5wloVf7PgB+S5IzUUb4Dwd5Z5/f8YwlvOFRejVbkP95yP zaQEikh0fluLgc7Xky+uFLsuSTJpaA6D+/d7wDs= X-Google-Smtp-Source: AMrXdXuc1Q4lPCn41Zx7/9JcQR4MprbpkDZV54rqdhnEvE64Jy1LIMZ7h98n6HRjAHE37XByUIWG3A== X-Received: by 2002:a62:aa0c:0:b0:58d:af0c:92f with SMTP id e12-20020a62aa0c000000b0058daf0c092fmr30968747pff.27.1674671528004; Wed, 25 Jan 2023 10:32:08 -0800 (PST) Received: from hermes.local (204-195-120-218.wavecable.com. [204.195.120.218]) by smtp.gmail.com with ESMTPSA id z2-20020aa791c2000000b0058a7bacd31fsm3938471pfa.32.2023.01.25.10.32.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Jan 2023 10:32:07 -0800 (PST) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger , Aman Singh , Yuying Zhang , Phil Yang , Jianbo Liu Subject: [PATCH v9] testpmd: cleanup cleanly from signal Date: Wed, 25 Jan 2023 10:32:05 -0800 Message-Id: <20230125183205.96554-1-stephen@networkplumber.org> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221112172839.70087-1-stephen@networkplumber.org> References: <20221112172839.70087-1-stephen@networkplumber.org> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Do a clean shutdown of testpmd when a signal is received; instead of having testpmd kill itself. This fixes the problem where a signal could be received in the middle of a PMD and then the signal handler would call PMD's close routine leading to locking problems. An added benefit is it gets rid of some Windows specific code. Fixes: d9a191a00e81 ("app/testpmd: fix quitting in container") Signed-off-by: Stephen Hemminger --- v9 - also handle the interactive case. use cmdine_poll() rather than signals and atexit app/test-pmd/cmdline.c | 28 +++++---------- app/test-pmd/testpmd.c | 77 ++++++++++++++++++++---------------------- app/test-pmd/testpmd.h | 1 + 3 files changed, 46 insertions(+), 60 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index b32dc8bfd445..fbe9ad694dee 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -65,7 +65,6 @@ #include "cmdline_tm.h" #include "bpf_cmd.h" -static struct cmdline *testpmd_cl; static cmdline_parse_ctx_t *main_ctx; static TAILQ_HEAD(, testpmd_driver_commands) driver_commands_head = TAILQ_HEAD_INITIALIZER(driver_commands_head); @@ -12921,28 +12920,19 @@ cmdline_read_from_file(const char *filename) void prompt(void) { - int ret; + struct cmdline *cl; - testpmd_cl = cmdline_stdin_new(main_ctx, "testpmd> "); - if (testpmd_cl == NULL) + cl = cmdline_stdin_new(main_ctx, "testpmd> "); + if (cl == NULL) return; - ret = atexit(prompt_exit); - if (ret != 0) - fprintf(stderr, "Cannot set exit function for cmdline\n"); - - cmdline_interact(testpmd_cl); - if (ret != 0) - cmdline_stdin_exit(testpmd_cl); -} - -void -prompt_exit(void) -{ - if (testpmd_cl != NULL) { - cmdline_quit(testpmd_cl); - cmdline_stdin_exit(testpmd_cl); + while (f_quit == 0 && cl_quit == 0) { + if (cmdline_poll(cl) < 0) + break; } + + cmdline_quit(cl); + cmdline_stdin_exit(cl); } void diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 134d79a55547..d01b6105b7de 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -11,6 +11,7 @@ #include #ifndef RTE_EXEC_ENV_WINDOWS #include +#include #endif #include #include @@ -231,7 +232,7 @@ unsigned int xstats_display_num; /**< Size of extended statistics to show */ * In container, it cannot terminate the process which running with 'stats-period' * option. Set flag to exit stats period loop after received SIGINT/SIGTERM. */ -static volatile uint8_t f_quit; +volatile uint8_t f_quit; uint8_t cl_quit; /* Quit testpmd from cmdline. */ /* @@ -4315,13 +4316,6 @@ init_port(void) memset(txring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS); } -static void -force_quit(void) -{ - pmd_test_exit(); - prompt_exit(); -} - static void print_stats(void) { @@ -4340,28 +4334,9 @@ print_stats(void) } static void -signal_handler(int signum) +signal_handler(int signum __rte_unused) { - if (signum == SIGINT || signum == SIGTERM) { - fprintf(stderr, "\nSignal %d received, preparing to exit...\n", - signum); -#ifdef RTE_LIB_PDUMP - /* uninitialize packet capture framework */ - rte_pdump_uninit(); -#endif -#ifdef RTE_LIB_LATENCYSTATS - if (latencystats_enabled != 0) - rte_latencystats_uninit(); -#endif - force_quit(); - /* Set flag to indicate the force termination. */ - f_quit = 1; - /* exit with the expected status */ -#ifndef RTE_EXEC_ENV_WINDOWS - signal(signum, SIG_DFL); - kill(getpid(), signum); -#endif - } + f_quit = 1; } int @@ -4536,15 +4511,9 @@ main(int argc, char** argv) start_packet_forwarding(0); } prompt(); - pmd_test_exit(); } else #endif { - char c; - int rc; - - f_quit = 0; - printf("No commandline core given, start packet forwarding\n"); start_packet_forwarding(tx_first); if (stats_period != 0) { @@ -4567,15 +4536,41 @@ main(int argc, char** argv) prev_time = cur_time; rte_delay_us_sleep(US_PER_S); } - } + } else { + char c; + fd_set fds; + + printf("Press enter to exit\n"); - printf("Press enter to exit\n"); - rc = read(0, &c, 1); - pmd_test_exit(); - if (rc < 0) - return 1; + FD_ZERO(&fds); + FD_SET(0, &fds); + + /* wait for signal or enter */ + ret = select(1, &fds, NULL, NULL, NULL); + if (ret < 0 && errno != EINTR) + rte_exit(EXIT_FAILURE, + "Select failed: %s\n", + strerror(errno)); + + /* if got enter then consume it */ + if (ret == 1 && read(0, &c, 1) < 0) + rte_exit(EXIT_FAILURE, + "Read failed: %s\n", + strerror(errno)); + } } + pmd_test_exit(); + +#ifdef RTE_LIB_PDUMP + /* uninitialize packet capture framework */ + rte_pdump_uninit(); +#endif +#ifdef RTE_LIB_LATENCYSTATS + if (latencystats_enabled != 0) + rte_latencystats_uninit(); +#endif + ret = rte_eal_cleanup(); if (ret != 0) rte_exit(EXIT_FAILURE, diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 7d24d25970d2..022210a7a964 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -34,6 +34,7 @@ #define RTE_PORT_HANDLING (uint16_t)3 extern uint8_t cl_quit; +extern volatile uint8_t f_quit; /* * It is used to allocate the memory for hash key.