From: Chengwen Feng <fengchengwen@huawei.com>
To: <thomas@monjalon.net>, <stephen@networkplumber.org>
Cc: <dev@dpdk.org>, <aman.deep.singh@intel.com>,
<liuyonglong@huawei.com>, <yangxingui@huawei.com>,
<lihuisong@huawei.com>
Subject: [PATCH v2 3/3] app/testpmd: support pause/resume specify lcore
Date: Wed, 5 Nov 2025 17:47:48 +0800 [thread overview]
Message-ID: <20251105094748.3269-4-fengchengwen@huawei.com> (raw)
In-Reply-To: <20251105094748.3269-1-fengchengwen@huawei.com>
This commit supports pause/resume specify lcore, the command:
pause fwd_core (lcore_id)
resume fwd_core (lcore_id)
The background of this command:
1. Only some TCs are expected to generate traffic when the DCB function
is tested based on txonly forwarding.
2. Because each lcore will process all the traffic of one TC, therefore,
we could pause the lcores which process unexpected TCs by this
command.
Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
app/test-pmd/cmdline.c | 126 ++++++++++++++++++++
app/test-pmd/testpmd.c | 5 +
app/test-pmd/testpmd.h | 2 +-
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 14 +++
4 files changed, 146 insertions(+), 1 deletion(-)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 22afbdbad3..dacc1921bd 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -150,6 +150,12 @@ static void cmd_help_long_parsed(void *parsed_result,
" Stop packet forwarding, and display accumulated"
" statistics.\n\n"
+ "pause fwd_core (lcore_id)\n"
+ " Pause specify lcore's forwarding.\n\n"
+
+ "resume fwd_core (lcore_id)\n"
+ " Resume specify lcore's forwarding.\n\n"
+
"quit\n"
" Quit to prompt.\n\n"
);
@@ -3975,6 +3981,124 @@ static cmdline_parse_inst_t cmd_stop = {
},
};
+/* *** pause specify forward core *** */
+struct cmd_pause_fwd_core_result {
+ cmdline_fixed_string_t pause;
+ cmdline_fixed_string_t fwd_core;
+ uint32_t lcore_id;
+};
+
+static void
+cmd_pause_fwd_core_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_pause_fwd_core_result *res = parsed_result;
+ struct fwd_lcore *fc = lcore_to_fwd_lcore(res->lcore_id);
+
+ if (test_done) {
+ fprintf(stderr, "Packet forwarding not started\n");
+ return;
+ }
+
+ if (fc == NULL) {
+ fprintf(stderr, "core: %u not in the forward corelist.\n", res->lcore_id);
+ return;
+ }
+
+ if (fc->stopped == 2) {
+ fprintf(stderr, "core: %u already paused!\n", res->lcore_id);
+ return;
+ }
+
+ printf("Telling core: %u to pause...", res->lcore_id);
+ fc->stopped = 2;
+ printf("\nWaiting for core: %u to finish...\n", res->lcore_id);
+ rte_delay_ms(10);
+ printf("Done.\n");
+}
+
+static cmdline_parse_token_string_t cmd_pause_fwd_core_pause =
+ TOKEN_STRING_INITIALIZER(struct cmd_pause_fwd_core_result,
+ pause, "pause");
+static cmdline_parse_token_string_t cmd_pause_fwd_core_fwd_core =
+ TOKEN_STRING_INITIALIZER(struct cmd_pause_fwd_core_result,
+ fwd_core, "fwd_core");
+static cmdline_parse_token_num_t cmd_pause_fwd_core_lcore_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_pause_fwd_core_result,
+ lcore_id, RTE_UINT32);
+
+static cmdline_parse_inst_t cmd_pause_fwd_core = {
+ .f = cmd_pause_fwd_core_parsed,
+ .data = NULL,
+ .help_str = "pause fwd_core <lcore_id>: pause specify lcore's forwarding.",
+ .tokens = {
+ (void *)&cmd_pause_fwd_core_pause,
+ (void *)&cmd_pause_fwd_core_fwd_core,
+ (void *)&cmd_pause_fwd_core_lcore_id,
+ NULL,
+ },
+};
+
+/* *** resume specify forward core *** */
+struct cmd_resume_fwd_core_result {
+ cmdline_fixed_string_t resume;
+ cmdline_fixed_string_t fwd_core;
+ uint32_t lcore_id;
+};
+
+static void
+cmd_resume_fwd_core_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_resume_fwd_core_result *res = parsed_result;
+ struct fwd_lcore *fc = lcore_to_fwd_lcore(res->lcore_id);
+
+ if (test_done) {
+ fprintf(stderr, "Packet forwarding not started\n");
+ return;
+ }
+
+ if (fc == NULL) {
+ fprintf(stderr, "core: %u not in the forward corelist.\n", res->lcore_id);
+ return;
+ }
+
+ if (fc->stopped != 2) {
+ fprintf(stderr, "core: %u not in pause state!\n", res->lcore_id);
+ return;
+ }
+
+ printf("Telling core: %u to resume...", res->lcore_id);
+ fc->stopped = 0;
+ printf("\nWaiting for core: %u to resume...\n", res->lcore_id);
+ rte_delay_ms(10);
+ printf("Done.\n");
+}
+
+static cmdline_parse_token_string_t cmd_resume_fwd_core_resume =
+ TOKEN_STRING_INITIALIZER(struct cmd_resume_fwd_core_result,
+ resume, "resume");
+static cmdline_parse_token_string_t cmd_resume_fwd_core_fwd_core =
+ TOKEN_STRING_INITIALIZER(struct cmd_resume_fwd_core_result,
+ fwd_core, "fwd_core");
+static cmdline_parse_token_num_t cmd_resume_fwd_core_lcore_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_resume_fwd_core_result,
+ lcore_id, RTE_UINT32);
+
+static cmdline_parse_inst_t cmd_resume_fwd_core = {
+ .f = cmd_resume_fwd_core_parsed,
+ .data = NULL,
+ .help_str = "resume fwd_core <lcore_id>: resume specify lcore's forwarding.",
+ .tokens = {
+ (void *)&cmd_resume_fwd_core_resume,
+ (void *)&cmd_resume_fwd_core_fwd_core,
+ (void *)&cmd_resume_fwd_core_lcore_id,
+ NULL,
+ },
+};
+
static unsigned int
get_ptype(char *value)
{
@@ -14051,6 +14175,8 @@ static cmdline_parse_ctx_t builtin_ctx[] = {
&cmd_config_dcb,
&cmd_read_rxd_txd,
&cmd_stop,
+ &cmd_pause_fwd_core,
+ &cmd_resume_fwd_core,
&cmd_mac_addr,
&cmd_set_fwd_eth_peer,
&cmd_set_xstats_hide_zero,
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 2360da3a48..05549be1c5 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -2247,6 +2247,7 @@ run_pkt_fwd_on_lcore(struct fwd_lcore *fc, packet_fwd_t pkt_fwd)
#endif
fsm = &fwd_streams[fc->stream_idx];
nb_fs = fc->stream_nb;
+_resume:
prev_tsc = rte_rdtsc();
do {
for (sm_id = 0; sm_id < nb_fs; sm_id++) {
@@ -2287,6 +2288,10 @@ run_pkt_fwd_on_lcore(struct fwd_lcore *fc, packet_fwd_t pkt_fwd)
prev_tsc = tsc;
}
} while (! fc->stopped);
+ while (fc->stopped == 2)
+ rte_pause();
+ if (fc->stopped == 0)
+ goto _resume;
}
static int
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index fa46865c67..c3c4373af7 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -399,7 +399,7 @@ struct fwd_lcore {
streamid_t stream_idx; /**< index of 1st stream in "fwd_streams" */
streamid_t stream_nb; /**< number of streams in "fwd_streams" */
lcoreid_t cpuid_idx; /**< index of logical core in CPU id table */
- volatile char stopped; /**< stop forwarding when set */
+ volatile char stopped; /**< stop forwarding when set to 1, pause when set to 2 */
uint64_t total_cycles; /**< used with --record-core-cycles */
};
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index e423abd40e..be125ff35c 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -143,6 +143,20 @@ Stop packet forwarding, and display accumulated statistics::
testpmd> stop
+pause fwd_core
+~~~~~~~~~~~~~~
+
+Pause specify lcore's forwarding::
+
+ testpmd> pause fwd_core (lcore_id)
+
+resume fwd_core
+~~~~~~~~~~~~~~~
+
+Resume specify lcore's forwarding::
+
+ testpmd> resume fwd_core (lcore_id)
+
quit
~~~~
--
2.17.1
next prev parent reply other threads:[~2025-11-05 9:48 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-04 4:09 [PATCH 0/3] testpmd support stop " Chengwen Feng
2025-11-04 4:09 ` [PATCH 1/3] app/testpmd: fix invalid txp when setup DCB forward Chengwen Feng
2025-11-04 4:09 ` [PATCH 2/3] app/testpmd: fix wrong Rx queues " Chengwen Feng
2025-11-04 4:09 ` [PATCH 3/3] app/testpmd: support stop specify lcore Chengwen Feng
2025-11-05 0:21 ` [PATCH 0/3] testpmd " Stephen Hemminger
2025-11-05 0:43 ` fengchengwen
2025-11-05 9:47 ` [PATCH v2 0/3] testpmd support pause/resume specify lcore's fwd Chengwen Feng
2025-11-05 9:47 ` [PATCH v2 1/3] app/testpmd: fix invalid txp when setup DCB forward Chengwen Feng
2025-11-05 9:47 ` [PATCH v2 2/3] app/testpmd: fix wrong Rx queues " Chengwen Feng
2025-11-05 9:47 ` Chengwen Feng [this message]
2025-11-05 18:59 ` [PATCH v2 0/3] testpmd support pause/resume specify lcore's fwd Stephen Hemminger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251105094748.3269-4-fengchengwen@huawei.com \
--to=fengchengwen@huawei.com \
--cc=aman.deep.singh@intel.com \
--cc=dev@dpdk.org \
--cc=lihuisong@huawei.com \
--cc=liuyonglong@huawei.com \
--cc=stephen@networkplumber.org \
--cc=thomas@monjalon.net \
--cc=yangxingui@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).