From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5304B458EB for ; Mon, 2 Sep 2024 21:50:29 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 26E5740662; Mon, 2 Sep 2024 21:50:29 +0200 (CEST) Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) by mails.dpdk.org (Postfix) with ESMTP id DB14E402C0 for ; Mon, 2 Sep 2024 21:50:27 +0200 (CEST) Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-20696938f86so158905ad.3 for ; Mon, 02 Sep 2024 12:50:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1725306627; x=1725911427; darn=dpdk.org; 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=MGUwJ1bbeEUUC1qya7BRQq6D6NmbXe9VVDfxkrZAK+4=; b=We+4Mnp4eS7/bAkStJjJE1bTr282l1cTJcRUTMZ5Yql8/Ce9UOFkcVC5y+UeH0WgII frcP8zqitJHRDjKHoyvxhHmrR5FC+mMIdLCHFf7y7/hVCnv7csyua6MogwRC4N8ZbCzy 1wMqluUqJMiJKXRh8ELFAVbfiM8ijoEiBkK2Gb0ALFSm4FwdD7TFx7p8n8HSokfu19LD GcAv3w7P4TIcSsO12iyOaqRRmiER6jtuBr80ur91VIe6Q1vxyXV8wudOtFsonpxTl4nO 5GG7/R0PDiwWPV7YCrMNENlxzvk07yqfd1Urq1qcYme62wiaPN+HGc/SZlMU2Op2o0bv Rlxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725306627; x=1725911427; 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=MGUwJ1bbeEUUC1qya7BRQq6D6NmbXe9VVDfxkrZAK+4=; b=xOUNnT8JB2KEGPdi8Ndt0m2eEegRMemLu7qn7BMA5kvJDJCWesFB1sJxHycE/J9EQP nslxkft8MWIp4lncsgIdmMNFU6zK8LXkFzNhLOkFkxLjVjYd2hnbg3/v6XjD/xssYS4k sH/5VxXqQNTVsrBrx0tfSpsnXMP8YryoE22Qpvnn/nrrR3VWIZXaAntIsj3Wue5STHTd tZwXHkE0xZnjLW+/cjEXeHGV1Ga8B1SOBgcqIYWfHNJogA99+h+oNsAGwQNAscYiaHvQ iEl2RDxaZBNtsDPSAnWhcCgIj6IkTkpHy/ySxGe7fvyMCoDQA/KoWJ6fvCPfOHP7mHdj 55Aw== X-Forwarded-Encrypted: i=1; AJvYcCUy3/Uu/nJT4xhVibgouBOV5mhTjOfnhUtEttXDSYZE09/qRpsOcxzfG4YCXde8wihhTBLdS4U=@dpdk.org X-Gm-Message-State: AOJu0Ywx80QbAXq/W4/kU3GMYj32Cwes9Rv2lnNl0ffxeM/UuOJMkNxU vofjLUstFKKwqHB791RO0POw3feSTDHkJp81H9nRQEwwlVYvdl6i2ZDKUHvu2h0= X-Google-Smtp-Source: AGHT+IHPBXMTNlX9sfTxFiWF+jqrRnB2g3f7G95AR443hGoys1H73sPYmcYVmxrxMGPDL9xRfO/QMA== X-Received: by 2002:a17:902:daca:b0:202:54b8:72e5 with SMTP id d9443c01a7336-205444f14d9mr74409195ad.22.1725306626615; Mon, 02 Sep 2024 12:50:26 -0700 (PDT) Received: from hermes.local (204-195-96-226.wavecable.com. [204.195.96.226]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-205e970d0b6sm8449975ad.214.2024.09.02.12.50.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Sep 2024 12:50:26 -0700 (PDT) From: Stephen Hemminger To: Kevin Traynor Cc: Stephen Hemminger , stable@dpdk.org, Ferruh Yigit Subject: [PATCH v2 1/3] app/testpmd: cleanup cleanly from signal Date: Mon, 2 Sep 2024 12:47:53 -0700 Message-ID: <20240902194909.132478-2-stephen@networkplumber.org> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240902194909.132478-1-stephen@networkplumber.org> References: <20240902194909.132478-1-stephen@networkplumber.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-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. The cmdline structure no longer needs to be global it can just be local to the prompt() function. An added benefit is it gets rid of some Windows specific code. (cherry picked from commit 0fd1386c30c3ad9365d7fdd2829bf7cb2e1b9dff) Fixes: d9a191a00e81 ("app/testpmd: fix quitting in container") Cc: stable@dpdk.org Signed-off-by: Stephen Hemminger Acked-by: Ferruh Yigit --- app/test-pmd/cmdline.c | 31 +++++++---------- app/test-pmd/testpmd.c | 77 ++++++++++++++++++++---------------------- app/test-pmd/testpmd.h | 1 + 3 files changed, 49 insertions(+), 60 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 43857c8008..eeca7171a7 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -68,8 +68,6 @@ #include "cmdline_tm.h" #include "bpf_cmd.h" -static struct cmdline *testpmd_cl; - static void cmd_reconfig_device_queue(portid_t id, uint8_t dev, uint8_t queue); /* *** Help command with introduction. *** */ @@ -18045,31 +18043,26 @@ cmdline_read_from_file(const char *filename) void prompt(void) { - int ret; + struct cmdline *cl; + /* initialize non-constant commands */ cmd_set_fwd_mode_init(); cmd_set_fwd_retry_mode_init(); - 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"); + /* loop until signal or quit command */ + while (f_quit == 0 && cl_quit == 0) { + int status = cmdline_poll(cl); - 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); + if (status < 0 || status == RDLINE_EXITED) + break; } + + cmdline_quit(cl); + cmdline_stdin_exit(cl); } static void diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 5f34641e90..57e7fa0637 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 @@ -228,7 +229,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. */ /* @@ -4300,13 +4301,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) { @@ -4325,28 +4319,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 @@ -4522,15 +4497,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) { @@ -4553,15 +4522,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 e53320e630..e3a322402e 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -33,6 +33,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. -- 2.45.2