linux-kselftest.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 net 0/2] fix wrong hds-thresh value setting
@ 2025-04-04 12:21 Taehee Yoo
  2025-04-04 12:21 ` [PATCH v2 net 1/2] net: ethtool: fix ethtool_ringparam_get_cfg() returns a hds_thresh value always as 0 Taehee Yoo
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Taehee Yoo @ 2025-04-04 12:21 UTC (permalink / raw)
  To: davem, kuba, pabeni, edumazet, andrew+netdev, horms, shuah,
	netdev, linux-kselftest
  Cc: kory.maincent, willemb, aleksander.lobakin, ecree.xilinx,
	almasrymina, daniel.zahka, jianbol, gal, michael.chan, ap420073

A hds-thresh value is not set correctly if input value is 0.
The cause is that ethtool_ringparam_get_cfg(), which is a internal
function that returns ringparameters from both ->get_ringparam() and
dev->cfg can't return a correct hds-thresh value.

The first patch fixes ethtool_ringparam_get_cfg() to set hds-thresh
value correcltly.

The second patch adds random test for hds-thresh value.
So that we can test 0 value for a hds-thresh properly.

v2:
 - Skips set_hds_thresh_random test when hds-thresh-max value is too
   small. (2/2)
 - Change random range from 1-MAX to 1-(MAX-1). (2/2)

Taehee Yoo (2):
  net: ethtool: fix ethtool_ringparam_get_cfg() returns a hds_thresh
    value always as 0.
  selftests: drv-net: test random value for hds-thresh

 net/ethtool/common.c                       |  1 +
 tools/testing/selftests/drivers/net/hds.py | 33 +++++++++++++++++++++-
 2 files changed, 33 insertions(+), 1 deletion(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v2 net 1/2] net: ethtool: fix ethtool_ringparam_get_cfg() returns a hds_thresh value always as 0.
  2025-04-04 12:21 [PATCH v2 net 0/2] fix wrong hds-thresh value setting Taehee Yoo
@ 2025-04-04 12:21 ` Taehee Yoo
  2025-04-04 12:21 ` [PATCH v2 net 2/2] selftests: drv-net: test random value for hds-thresh Taehee Yoo
  2025-04-07 18:40 ` [PATCH v2 net 0/2] fix wrong hds-thresh value setting patchwork-bot+netdevbpf
  2 siblings, 0 replies; 4+ messages in thread
From: Taehee Yoo @ 2025-04-04 12:21 UTC (permalink / raw)
  To: davem, kuba, pabeni, edumazet, andrew+netdev, horms, shuah,
	netdev, linux-kselftest
  Cc: kory.maincent, willemb, aleksander.lobakin, ecree.xilinx,
	almasrymina, daniel.zahka, jianbol, gal, michael.chan, ap420073

When hds-thresh is configured, ethnl_set_rings() is called, and it calls
ethtool_ringparam_get_cfg() to get ringparameters from .get_ringparam()
callback and dev->cfg.
Both hds_config and hds_thresh values should be set from dev->cfg, not
from .get_ringparam().
But ethtool_ringparam_get_cfg() sets only hds_config from dev->cfg.
So, ethtool_ringparam_get_cfg() returns always a hds_thresh as 0.

If an input value of hds-thresh is 0, a hds_thresh value from
ethtool_ringparam_get_cfg() are same. So ethnl_set_rings() does
nothing and returns immediately.
It causes a bug that setting a hds-thresh value to 0 is not working.

Reproducer:
    modprobe netdevsim
    echo 1 > /sys/bus/netdevsim/new_device
    ethtool -G eth0 hds-thresh 100
    ethtool -G eth0 hds-thresh 0
    ethtool -g eth0
    #hds-thresh value should be 0, but it shows 100.

The tools/testing/selftests/drivers/net/hds.py can test it too with
applying a following patch for hds.py.

Fixes: 928459bbda19 ("net: ethtool: populate the default HDS params in the core")
Signed-off-by: Taehee Yoo <ap420073@gmail.com>
---

The ethtool command doesn't support hds-thresh option yet.
So, RFC[1] patch is needed to be applied.

v2:
 - No changes.

 net/ethtool/common.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/net/ethtool/common.c b/net/ethtool/common.c
index 0cb6da1f692a..49bea6b45bd5 100644
--- a/net/ethtool/common.c
+++ b/net/ethtool/common.c
@@ -830,6 +830,7 @@ void ethtool_ringparam_get_cfg(struct net_device *dev,
 
 	/* Driver gives us current state, we want to return current config */
 	kparam->tcp_data_split = dev->cfg->hds_config;
+	kparam->hds_thresh = dev->cfg->hds_thresh;
 }
 
 static void ethtool_init_tsinfo(struct kernel_ethtool_ts_info *info)
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 net 2/2] selftests: drv-net: test random value for hds-thresh
  2025-04-04 12:21 [PATCH v2 net 0/2] fix wrong hds-thresh value setting Taehee Yoo
  2025-04-04 12:21 ` [PATCH v2 net 1/2] net: ethtool: fix ethtool_ringparam_get_cfg() returns a hds_thresh value always as 0 Taehee Yoo
@ 2025-04-04 12:21 ` Taehee Yoo
  2025-04-07 18:40 ` [PATCH v2 net 0/2] fix wrong hds-thresh value setting patchwork-bot+netdevbpf
  2 siblings, 0 replies; 4+ messages in thread
From: Taehee Yoo @ 2025-04-04 12:21 UTC (permalink / raw)
  To: davem, kuba, pabeni, edumazet, andrew+netdev, horms, shuah,
	netdev, linux-kselftest
  Cc: kory.maincent, willemb, aleksander.lobakin, ecree.xilinx,
	almasrymina, daniel.zahka, jianbol, gal, michael.chan, ap420073

hds.py has been testing 0(set_hds_thresh_zero()),
MAX(set_hds_thresh_max()), GT(set_hds_thresh_gt()) values for hds-thresh.
However if a hds-thresh value was already 0, set_hds_thresh_zero()
can't test properly.
So, it tests random value first and then tests 0, MAX, GT values.

Testing bnxt:
    TAP version 13
    1..13
    ok 1 hds.get_hds
    ok 2 hds.get_hds_thresh
    ok 3 hds.set_hds_disable # SKIP disabling of HDS not supported by
    the device
    ok 4 hds.set_hds_enable
    ok 5 hds.set_hds_thresh_random
    ok 6 hds.set_hds_thresh_zero
    ok 7 hds.set_hds_thresh_max
    ok 8 hds.set_hds_thresh_gt
    ok 9 hds.set_xdp
    ok 10 hds.enabled_set_xdp
    ok 11 hds.ioctl
    ok 12 hds.ioctl_set_xdp
    ok 13 hds.ioctl_enabled_set_xdp
    # Totals: pass:12 fail:0 xfail:0 xpass:0 skip:1 error:0

Testing lo:
    TAP version 13
    1..13
    ok 1 hds.get_hds # SKIP tcp-data-split not supported by device
    ok 2 hds.get_hds_thresh # SKIP hds-thresh not supported by device
    ok 3 hds.set_hds_disable # SKIP ring-set not supported by the device
    ok 4 hds.set_hds_enable # SKIP ring-set not supported by the device
    ok 5 hds.set_hds_thresh_random # SKIP hds-thresh not supported by
    device
    ok 6 hds.set_hds_thresh_zero # SKIP ring-set not supported by the
    device
    ok 7 hds.set_hds_thresh_max # SKIP hds-thresh not supported by
    device
    ok 8 hds.set_hds_thresh_gt # SKIP hds-thresh not supported by device
    ok 9 hds.set_xdp # SKIP tcp-data-split not supported by device
    ok 10 hds.enabled_set_xdp # SKIP tcp-data-split not supported by
    device
    ok 11 hds.ioctl # SKIP tcp-data-split not supported by device
    ok 12 hds.ioctl_set_xdp # SKIP tcp-data-split not supported by
    device
    ok 13 hds.ioctl_enabled_set_xdp # SKIP tcp-data-split not supported
    by device
    # Totals: pass:0 fail:0 xfail:0 xpass:0 skip:13 error:0

Signed-off-by: Taehee Yoo <ap420073@gmail.com>
---

v2:
 - Skips set_hds_thresh_random test when hds-thresh-max value is too
 small.
 - Change random range from 1-MAX to 1-(MAX-1).

 tools/testing/selftests/drivers/net/hds.py | 33 +++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/drivers/net/hds.py b/tools/testing/selftests/drivers/net/hds.py
index 8b7f6acad15f..7c90a040ce45 100755
--- a/tools/testing/selftests/drivers/net/hds.py
+++ b/tools/testing/selftests/drivers/net/hds.py
@@ -6,7 +6,7 @@ import os
 from lib.py import ksft_run, ksft_exit, ksft_eq, ksft_raises, KsftSkipEx
 from lib.py import CmdExitFailure, EthtoolFamily, NlError
 from lib.py import NetDrvEnv
-from lib.py import defer, ethtool, ip
+from lib.py import defer, ethtool, ip, random
 
 
 def _get_hds_mode(cfg, netnl) -> str:
@@ -109,6 +109,36 @@ def set_hds_thresh_zero(cfg, netnl) -> None:
 
     ksft_eq(0, rings['hds-thresh'])
 
+def set_hds_thresh_random(cfg, netnl) -> None:
+    try:
+        rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}})
+    except NlError as e:
+        raise KsftSkipEx('ring-get not supported by device')
+    if 'hds-thresh' not in rings:
+        raise KsftSkipEx('hds-thresh not supported by device')
+    if 'hds-thresh-max' not in rings:
+        raise KsftSkipEx('hds-thresh-max not defined by device')
+
+    if rings['hds-thresh-max'] < 2:
+        raise KsftSkipEx('hds-thresh-max is too small')
+    elif rings['hds-thresh-max'] == 2:
+        hds_thresh = 1
+    else:
+        while True:
+            hds_thresh = random.randint(1, rings['hds-thresh-max'] - 1)
+            if hds_thresh != rings['hds-thresh']:
+                break
+
+    try:
+        netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'hds-thresh': hds_thresh})
+    except NlError as e:
+        if e.error == errno.EINVAL:
+            raise KsftSkipEx("hds-thresh-set not supported by the device")
+        elif e.error == errno.EOPNOTSUPP:
+            raise KsftSkipEx("ring-set not supported by the device")
+    rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}})
+    ksft_eq(hds_thresh, rings['hds-thresh'])
+
 def set_hds_thresh_max(cfg, netnl) -> None:
     try:
         rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}})
@@ -243,6 +273,7 @@ def main() -> None:
                   get_hds_thresh,
                   set_hds_disable,
                   set_hds_enable,
+                  set_hds_thresh_random,
                   set_hds_thresh_zero,
                   set_hds_thresh_max,
                   set_hds_thresh_gt,
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 net 0/2] fix wrong hds-thresh value setting
  2025-04-04 12:21 [PATCH v2 net 0/2] fix wrong hds-thresh value setting Taehee Yoo
  2025-04-04 12:21 ` [PATCH v2 net 1/2] net: ethtool: fix ethtool_ringparam_get_cfg() returns a hds_thresh value always as 0 Taehee Yoo
  2025-04-04 12:21 ` [PATCH v2 net 2/2] selftests: drv-net: test random value for hds-thresh Taehee Yoo
@ 2025-04-07 18:40 ` patchwork-bot+netdevbpf
  2 siblings, 0 replies; 4+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-04-07 18:40 UTC (permalink / raw)
  To: Taehee Yoo
  Cc: davem, kuba, pabeni, edumazet, andrew+netdev, horms, shuah,
	netdev, linux-kselftest, kory.maincent, willemb,
	aleksander.lobakin, ecree.xilinx, almasrymina, daniel.zahka,
	jianbol, gal, michael.chan

Hello:

This series was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Fri,  4 Apr 2025 12:21:24 +0000 you wrote:
> A hds-thresh value is not set correctly if input value is 0.
> The cause is that ethtool_ringparam_get_cfg(), which is a internal
> function that returns ringparameters from both ->get_ringparam() and
> dev->cfg can't return a correct hds-thresh value.
> 
> The first patch fixes ethtool_ringparam_get_cfg() to set hds-thresh
> value correcltly.
> 
> [...]

Here is the summary with links:
  - [v2,net,1/2] net: ethtool: fix ethtool_ringparam_get_cfg() returns a hds_thresh value always as 0.
    https://git.kernel.org/netdev/net/c/216a61d33c07
  - [v2,net,2/2] selftests: drv-net: test random value for hds-thresh
    https://git.kernel.org/netdev/net/c/22d3a63d5321

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2025-04-07 18:40 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-04 12:21 [PATCH v2 net 0/2] fix wrong hds-thresh value setting Taehee Yoo
2025-04-04 12:21 ` [PATCH v2 net 1/2] net: ethtool: fix ethtool_ringparam_get_cfg() returns a hds_thresh value always as 0 Taehee Yoo
2025-04-04 12:21 ` [PATCH v2 net 2/2] selftests: drv-net: test random value for hds-thresh Taehee Yoo
2025-04-07 18:40 ` [PATCH v2 net 0/2] fix wrong hds-thresh value setting patchwork-bot+netdevbpf

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).