From: fengchengwen <fengchengwen@huawei.com>
To: Talluri Chaitanyababu <chaitanyababux.talluri@intel.com>,
<dev@dpdk.org>, <bruce.richardson@intel.com>,
<stephen@networkplumber.org>, <aman.deep.singh@intel.com>
Cc: <shaiq.wani@intel.com>, <stable@dpdk.org>
Subject: Re: [PATCH v3] app/testpmd: fix DCB forwarding TC mask and queue guard
Date: Tue, 17 Mar 2026 09:23:33 +0800 [thread overview]
Message-ID: <ee1ff3fc-32c2-4b6c-8790-83451f6a15e9@huawei.com> (raw)
In-Reply-To: <20260316062118.1508009-1-chaitanyababux.talluri@intel.com>
On 3/16/2026 2:21 PM, Talluri Chaitanyababu wrote:
> Update forwarding TC mask based on configured traffic classes to properly
> handle both 4 TC and 8 TC modes. The bitmask calculation (1u << nb_tcs) - 1
> correctly creates masks for all available traffic classes (0xF for 4 TCs,
> 0xFF for 8 TCs).
>
> When the mask is not updated after a TC configuration change, it stays at
> the default 0xFF, which causes dcb_fwd_tc_update_dcb_info() to skip the
> compress logic entirely (early return when mask ==
> DEFAULT_DCB_FWD_TC_MASK).
> This can lead to inconsistent queue allocations.
>
> Additionally, the existing VMDQ pool guard in dcb_fwd_config_setup() only
> checks RX queue counts, missing the case where the TX port has zero queues
> for a given pool/TC combination. When nb_tx_queue is 0, the expression
> "j % nb_tx_queue" triggers a SIGFPE (integer division by zero).
>
> Fix this by:
> 1. Updating dcb_fwd_tc_mask after port DCB reconfiguration using the
> user requested num_tcs value, so fwd_config_setup() sees the correct
> mask.
> 2. Extending the existing pool guard to also check TX queue counts.
> 3. Adding a defensive break after the division by dcb_fwd_tc_cores to
> catch integer truncation to zero.
>
> Fixes: 0ecbf93f5001 ("app/testpmd: add command to disable DCB")
Why this commit?
> Cc: stable@dpdk.org
>
> Signed-off-by: Talluri Chaitanyababu <chaitanyababux.talluri@intel.com>
> Signed-off-by: Shaiq Wani <shaiq.wani@intel.com>
> ---
>
> v3: Removed old email address.
>
> v2:
> * Used res->num_tcs to derive dcb_fwd_tc_mask.
> * Removed redundant rte_eth_dev_get_dcb_info().
> ---
> app/test-pmd/cmdline.c | 3 +++
> app/test-pmd/config.c | 9 ++++++++-
> 2 files changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index e9a1331071..a53af7e72b 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -3682,6 +3682,9 @@ cmd_config_dcb_parsed(void *parsed_result,
> return;
> }
>
> + /* Update forwarding TC mask to match the configured number of TCs. */
> + dcb_fwd_tc_mask = (1u << res->num_tcs) - 1;
This is just configure, please don't modify it when run command.
Combined with your detail steps last email, I may guest your problem:
1. port stop all
2. port config 0 dcb vt off 8 pfc on
3. port config 1 dcb vt off 8 pfc on
4. port start all
5. port stop all
6. port config 0 dcb vt off 4 pfc on
When the step6 executed, the port 0 has 4 TC, but the port 1 still has 8 TC which was configured in step3
If start forward after step6, the TC was mismatch, it may lead to multiple thread operators the same Tx queues.
So you want to make sure only forward 4 TC in both port0 and port1 in step6 ?
> +
> fwd_config_setup();
>
> cmd_reconfig_device_queue(port_id, 1, 1);
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
> index f9f3c542a6..9b201ac241 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -5450,7 +5450,8 @@ dcb_fwd_config_setup(void)
> /* if the nb_queue is zero, means this tc is
> * not enabled on the POOL
> */
> - if (rxp_dcb_info.tc_queue.tc_rxq[i][tc].nb_queue == 0)
> + if (rxp_dcb_info.tc_queue.tc_rxq[i][tc].nb_queue == 0 ||
> + txp_dcb_info.tc_queue.tc_txq[i][tc].nb_queue == 0)
> break;
> k = fwd_lcores[lc_id]->stream_nb +
> fwd_lcores[lc_id]->stream_idx;
> @@ -5458,6 +5459,12 @@ dcb_fwd_config_setup(void)
> dcb_fwd_tc_cores;
> nb_tx_queue = txp_dcb_info.tc_queue.tc_txq[i][tc].nb_queue /
> dcb_fwd_tc_cores;
> + /* guard against integer truncation to zero (e.g.
> + * nb_queue=1, dcb_fwd_tc_cores=2) to prevent SIGFPE
> + * from "j % nb_tx_queue" below.
> + */
> + if (nb_rx_queue == 0 || nb_tx_queue == 0)
> + break;
This could add in dcb_fwd_check_cores_per_tc():
for (port = 0; port < nb_fwd_ports; port++) {
(void)rte_eth_dev_get_dcb_info(fwd_ports_ids[port], &dcb_info);
for (tc = 0; tc < dcb_info.nb_tcs; tc++) {
for (vmdq_idx = 0; vmdq_idx < RTE_ETH_MAX_VMDQ_POOL; vmdq_idx++) {
if (dcb_info.tc_queue.tc_rxq[vmdq_idx][tc].nb_queue == 0)
break;
/* make sure nb_rx_queue can be divisible. */
if (dcb_info.tc_queue.tc_rxq[vmdq_idx][tc].nb_queue %
dcb_fwd_tc_cores)
return -1;
/* make sure nb_tx_queue can be divisible. */
if (dcb_info.tc_queue.tc_txq[vmdq_idx][tc].nb_queue %
dcb_fwd_tc_cores)
return -1;
--------/// please add here!
}
}
}
> rxq = rxp_dcb_info.tc_queue.tc_rxq[i][tc].base + nb_rx_queue * sub_core_idx;
> txq = txp_dcb_info.tc_queue.tc_txq[i][tc].base + nb_tx_queue * sub_core_idx;
> for (j = 0; j < nb_rx_queue; j++) {
next prev parent reply other threads:[~2026-03-17 1:23 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-11 8:37 [PATCH] app/testpmd: fix DCB forwarding TC mask and queue guard Talluri Chaitanyababu
2026-03-11 15:56 ` Stephen Hemminger
2026-03-12 10:36 ` [PATCH v2] " Talluri Chaitanyababu
2026-03-12 18:44 ` Stephen Hemminger
2026-03-13 0:19 ` fengchengwen
2026-03-16 6:05 ` Talluri, ChaitanyababuX
2026-03-17 1:07 ` fengchengwen
2026-03-18 7:21 ` Talluri, ChaitanyababuX
2026-03-19 1:19 ` fengchengwen
2026-03-16 6:21 ` [PATCH v3] " Talluri Chaitanyababu
2026-03-17 1:23 ` fengchengwen [this message]
2026-03-17 8:57 ` Thomas Monjalon
2026-03-17 9:02 ` Thomas Monjalon
2026-03-18 6:17 ` [PATCH v4] app/testpmd: fix DCB forwarding TC mismatch handling Talluri Chaitanyababu
2026-03-19 1:35 ` fengchengwen
2026-03-20 6:29 ` [PATCH v5] " Talluri Chaitanyababu
2026-03-20 9:38 ` fengchengwen
2026-03-24 0:06 ` 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=ee1ff3fc-32c2-4b6c-8790-83451f6a15e9@huawei.com \
--to=fengchengwen@huawei.com \
--cc=aman.deep.singh@intel.com \
--cc=bruce.richardson@intel.com \
--cc=chaitanyababux.talluri@intel.com \
--cc=dev@dpdk.org \
--cc=shaiq.wani@intel.com \
--cc=stable@dpdk.org \
--cc=stephen@networkplumber.org \
/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