public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
From: Paolo Abeni <pabeni@redhat.com>
To: Jakub Kicinski <kuba@kernel.org>, davem@davemloft.net
Cc: netdev@vger.kernel.org, edumazet@google.com,
	andrew+netdev@lunn.ch, horms@kernel.org, donald.hunter@gmail.com,
	shuah@kernel.org, matttbe@kernel.org, chuck.lever@oracle.com,
	hawk@kernel.org, linux-kselftest@vger.kernel.org
Subject: Re: [PATCH net-next 2/2] selftests: net: add tests for filtered dumps of page pool
Date: Thu, 19 Mar 2026 15:14:09 +0100	[thread overview]
Message-ID: <c1fe7bdb-2e24-4dcc-a804-4f1f180eb4bc@redhat.com> (raw)
In-Reply-To: <20260319035649.2396137-2-kuba@kernel.org>

On 3/19/26 4:56 AM, Jakub Kicinski wrote:
> Add tests for page pool dumps of a specific ifindex.
> 
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> ---
>  tools/testing/selftests/net/nl_netdev.py | 119 ++++++++++++++++++++++-
>  1 file changed, 117 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/testing/selftests/net/nl_netdev.py b/tools/testing/selftests/net/nl_netdev.py
> index eff55c64a012..ceb44c8e1fec 100755
> --- a/tools/testing/selftests/net/nl_netdev.py
> +++ b/tools/testing/selftests/net/nl_netdev.py
> @@ -9,7 +9,7 @@ import errno
>  from os import system
>  from lib.py import ksft_run, ksft_exit
>  from lib.py import ksft_eq, ksft_ge, ksft_ne, ksft_raises, ksft_busy_wait
> -from lib.py import NetdevFamily, NetdevSimDev, NlError, ip
> +from lib.py import NetdevFamily, NetdevSimDev, NlError, defer, ip
>  
>  
>  def empty_check(nf) -> None:
> @@ -255,6 +255,117 @@ from lib.py import NetdevFamily, NetdevSimDev, NlError, ip
>          nsim.dfs_write("pp_hold", "y")
>  
>  
> +def page_pool_dump_ifindex(nf) -> None:
> +    """Test page pool dump filtering by ifindex."""
> +    nsimdev1 = NetdevSimDev(queue_count=3)
> +    rm_nsim1 = defer(nsimdev1.remove)
> +    nsimdev2 = NetdevSimDev(queue_count=5)
> +    defer(nsimdev2.remove)
> +
> +    nsim1 = nsimdev1.nsims[0]
> +    nsim2 = nsimdev2.nsims[0]
> +
> +    ip(f"link set dev {nsim1.ifname} up")
> +    ip(f"link set dev {nsim2.ifname} up")
> +
> +    # Unfiltered dump should have pools from both devices
> +    all_pp = nf.page_pool_get({}, dump=True)
> +    pp1_all = [pp for pp in all_pp
> +               if pp.get("ifindex") == nsim1.ifindex]
> +    pp2_all = [pp for pp in all_pp
> +               if pp.get("ifindex") == nsim2.ifindex]
> +    ksft_ge(len(pp1_all), 1)
> +    ksft_ge(len(pp2_all), 1)
> +
> +    # Filtered dump should only return pools for that device
> +    pp1_flt = nf.page_pool_get({'ifindex': nsim1.ifindex}, dump=True)
> +    ksft_eq(pp1_flt, pp1_all)
> +
> +    pp2_flt = nf.page_pool_get({'ifindex': nsim2.ifindex}, dump=True)
> +    ksft_eq(pp2_flt, pp2_all)
> +
> +    # Non-existent ifindex should return empty dump
> +    pp_none = nf.page_pool_get({'ifindex': 12345678}, dump=True)
> +    ksft_eq(len(pp_none), 0)
> +
> +    # Device down - no pools for that ifindex
> +    ip(f"link set dev {nsim1.ifname} down")
> +    pp1_down = nf.page_pool_get({'ifindex': nsim1.ifindex}, dump=True)
> +    ksft_eq(len(pp1_down), 0)
> +
> +    # Remove device, dump by its old ifindex should return empty
> +    old_ifindex = nsim1.ifindex
> +    rm_nsim1.exec()
> +    pp1_gone = nf.page_pool_get({'ifindex': old_ifindex}, dump=True)
> +    ksft_eq(len(pp1_gone), 0)
> +
> +
> +def page_pool_ifindex_leak_check(nf) -> None:
> +    """Test that zombie page pools don't show up under the original ifindex."""
> +    nsimdev = NetdevSimDev()
> +    rm_nsim = defer(nsimdev.remove)
> +    nsim = nsimdev.nsims[0]
> +
> +    ip(f"link set dev {nsim.ifname} up")
> +    nsim.dfs_write("pp_hold", "y")
> +
> +    pp_up = nf.page_pool_get({'ifindex': nsim.ifindex}, dump=True)
> +    ksft_ge(len(pp_up), 1)
> +
> +    # Remove device with leaked page - pool becomes zombie (orphaned to lo)
> +    old_ifindex = nsim.ifindex
> +    rm_nsim.exec()
> +
> +    # Zombie pool should NOT appear under the original device
> +    pp_down = nf.page_pool_get({'ifindex': old_ifindex}, dump=True)
> +    ksft_eq(len(pp_down), 0)
> +
> +    # But it should appear in an unfiltered dump (under loopback)
> +    pp_all = nf.page_pool_get({}, dump=True)
> +    orphans = [pp for pp in pp_all
> +               if "detach-time" in pp and "ifindex" not in pp]
> +    ksft_ge(len(orphans), 1)
> +
> +
> +def page_pool_stats_ifindex_check(nf) -> None:
> +    """Test page pool stats dump filtering by ifindex."""
> +    nsimdev1 = NetdevSimDev(queue_count=3)
> +    defer(nsimdev1.remove)
> +    nsimdev2 = NetdevSimDev(queue_count=5)
> +    defer(nsimdev2.remove)
> +
> +    nsim1 = nsimdev1.nsims[0]
> +    nsim2 = nsimdev2.nsims[0]
> +
> +    ip(f"link set dev {nsim1.ifname} up")
> +    ip(f"link set dev {nsim2.ifname} up")
> +
> +    # Unfiltered stats dump
> +    all_stats = nf.page_pool_stats_get({}, dump=True)
> +    s1_all = [s for s in all_stats
> +              if s.get("info", {}).get("ifindex") == nsim1.ifindex]
> +    s2_all = [s for s in all_stats
> +              if s.get("info", {}).get("ifindex") == nsim2.ifindex]
> +    ksft_ge(len(s1_all), 1)
> +    ksft_ge(len(s2_all), 1)
> +
> +    # Filtered stats dump
> +    s1_flt = nf.page_pool_stats_get({'info': {'ifindex': nsim1.ifindex}},
> +                                    dump=True)
> +    ksft_eq(s1_flt, s1_all)
> +
> +    # Non-existent ifindex should return empty
> +    s_none = nf.page_pool_stats_get({'info': {'ifindex': 12345678}}, dump=True)
> +    ksft_eq(len(s_none), 0)
> +
> +    # info.id should be rejected for stats dump
> +    with ksft_raises(NlError) as cm:
> +        nf.page_pool_stats_get({'info': {'id': s1_all[0]['info']['id']}},
> +                               dump=True)
> +    ksft_eq(cm.exception.nl_msg.error, -errno.EINVAL)
> +    ksft_eq(cm.exception.nl_msg.extack['bad-attr'], '.info.id')
> +
> +
>  def main() -> None:
>      """ Ksft boiler plate main """
>      nf = NetdevFamily()
> @@ -265,7 +376,11 @@ from lib.py import NetdevFamily, NetdevSimDev, NlError, ip
>                napi_set_threaded,
>                dev_set_threaded,
>                nsim_rxq_reset_down,
> -              page_pool_check],
> +              page_pool_check,
> +              page_pool_dump_ifindex,
> +              page_pool_ifindex_leak_check,
> +              page_pool_stats_ifindex_check

It looks like the new selftests are consistently failing?!?

# 5.79 [+0.24] ok 10 nl_netdev.page_pool_ifindex_leak_check
# 6.21 [+0.42] # Exception| Traceback (most recent call last):
# 6.22 [+0.00] # Exception|   File
"/srv/vmksft/testing/wt-2/tools/testing/selftests/net/lib/py/ksft.py",
line 338, in ksft_run
# 6.23 [+0.01] # Exception|     func(*args)
# 6.23 [+0.00] # Exception|     ~~~~^^^^^^^
# 6.23 [+0.00] # Exception|   File
"/srv/vmksft/testing/wt-2/tools/testing/selftests/net/./nl_netdev.py",
line 344, in page_pool_stats_ifindex_check
# 6.25 [+0.02] # Exception|     all_stats = nf.page_pool_stats_get({},
dump=True)
# 6.25 [+0.00] # Exception|   File
"/srv/vmksft/testing/wt-2/tools/net/ynl/pyynl/lib/ynl.py", line 1385, in _op
# 6.26 [+0.01] # Exception|     return self._ops(ops)[0]
# 6.26 [+0.00] # Exception|            ~~~~~~~~~^^^^^
# 6.26 [+0.00] # Exception|   File
"/srv/vmksft/testing/wt-2/tools/net/ynl/pyynl/lib/ynl.py", line 1342, in
_ops
# 6.27 [+0.01] # Exception|     raise NlError(nl_msg)
# 6.27 [+0.00] # Exception| net.ynl.pyynl.lib.ynl.NlError: Netlink
error: Operation not supported
# 6.28 [+0.01] # Exception|
# 6.32 [+0.04] not ok 11 nl_netdev.page_pool_stats_ifindex_check
# 6.32 [+0.00] # Totals: pass:10 fail:1 xfail:0 xpass:0 skip:0 error:0
not ok 1 selftests: net: nl_netdev.py # exit=1


  reply	other threads:[~2026-03-19 14:14 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-19  3:56 [PATCH net-next 1/2] net: page_pool: support dumping pps of a specific ifindex via Netlink Jakub Kicinski
2026-03-19  3:56 ` [PATCH net-next 2/2] selftests: net: add tests for filtered dumps of page pool Jakub Kicinski
2026-03-19 14:14   ` Paolo Abeni [this message]
2026-03-19 19:56 ` [PATCH net-next 1/2] net: page_pool: support dumping pps of a specific ifindex via Netlink Maxime Chevallier
2026-03-19 20:18   ` Jakub Kicinski
2026-03-19 21:04     ` Maxime Chevallier

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=c1fe7bdb-2e24-4dcc-a804-4f1f180eb4bc@redhat.com \
    --to=pabeni@redhat.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=chuck.lever@oracle.com \
    --cc=davem@davemloft.net \
    --cc=donald.hunter@gmail.com \
    --cc=edumazet@google.com \
    --cc=hawk@kernel.org \
    --cc=horms@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=matttbe@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=shuah@kernel.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