From: Hangbin Liu <hangbin.liu@linux.dev>
To: Pin-yen Lin <treapking@google.com>
Cc: Jay Vosburgh <jv@jvosburgh.net>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@kernel.org>,
Bjoern Doebel <doebel@amazon.de>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Shuah Khan <shuah@kernel.org>,
netdev@vger.kernel.org, Matthieu Baerts <matttbe@kernel.org>,
linux-kernel@vger.kernel.org,
Jonathan Toppins <jon.toppins+linux@gmail.com>,
linux-kselftest@vger.kernel.org,
Hangbin Liu <liuhangbin@gmail.com>
Subject: Re: [PATCH net] selftests: bonding: fix failover race in bond_options.sh prio test
Date: Fri, 13 Nov 2026 13:23:40 +0800 [thread overview]
Message-ID: <avaewOJD7tX1UYfE@fedora> (raw)
In-Reply-To: <20261112014942.2946303-1-treapking@google.com>
Hi Pin-yen,
On Wed, Nov 11, 2026 at 05:46:18PM -0800, Pin-yen Lin wrote:
> The prio test intermittently fails in the arp_ip_target and
> ns_ip6_target variants:
>
> TEST: prio (active-backup ns_ip6_target primary_reselect 1) [FAIL]
> Current active slave is eth0 but not eth2
>
> The ARP/NS monitor marks a slave down when it has received nothing for
> too long. With arp_interval 100 and the default arp_missed_max, that is
> about 250ms for the active slave (eth1) and 350ms for a backup slave
> (eth0, eth2). Every 100ms, eth1 sends a probe: eth1 receives the reply,
> and eth0/eth2 receive a copy forwarded by the gateway bridge. Once eth1
> is down, its probes reach no one and no slave receives anything, so
> eth1 normally times out first and the new active slave is picked by
> prio:
>
> t=0 probe: eth1 gets the reply, eth0/eth2 get a copy
> t=10 test sets eth1 down
> t=300 monitor: eth1 idle 300ms -> down
> eth0/eth2 idle 300ms -> up, eth2 picked by prio
>
> But the test takes eth1 down right after bond_check_connection(), whose
> ping replies only arrive on eth1:
>
> t=0 probe: eth1 gets the reply, eth0/eth2 get a copy
> t=70 ping reply on eth1 only
> t=85 test sets eth1 down
> t=300 monitor: eth1 idle 230ms -> still up
> t=400 monitor: eth1 idle 330ms -> down
> eth2 idle 400ms -> down too
>
> eth2 can then no longer be picked. eth0 becomes the active slave if it
> happened to receive some other packet (e.g. an MLD report), otherwise
> whichever slave comes back first does. With primary_reselect 1 or 2,
> the bond keeps eth0 even after eth2 comes back.
>
> Before taking the active slave down, wait two monitor intervals
> (200ms), so that at least one more probe is sent after the last ping
> reply and all slaves last received that probe. The miimon variants do
> not need the wait, but the extra delay is negligible.
I'm afraid the waiting time is too strict, especially with a debug kernel
since delays can happen.
Bjoern is also fixing[1] this issue by pinging a non-existent neighbor to
keep traffic flowing. Would you like to test whether that works for you?
[1] https://lore.kernel.org/netdev/20261104142018.552135-1-doebel@amazon.de/
Thanks
Hangbin
>
> Hit in our CI on GCE VMs (4 of 51 runs); the test only uses veth. On
> the same VMs, 7 of 30 loops of the prio tests failed without this
> change, and 20 of 20 loops passed with it.
>
> Fixes: 481b56e0391e ("selftests: bonding: re-format bond option tests")
> Signed-off-by: Pin-yen Lin <treapking@google.com>
> ---
>
> .../drivers/net/bonding/bond_options.sh | 26 ++++++++++++++++---
> 1 file changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/tools/testing/selftests/drivers/net/bonding/bond_options.sh b/tools/testing/selftests/drivers/net/bonding/bond_options.sh
> index 187b478d0ddf..16c1c2d97005 100755
> --- a/tools/testing/selftests/drivers/net/bonding/bond_options.sh
> +++ b/tools/testing/selftests/drivers/net/bonding/bond_options.sh
> @@ -13,6 +13,24 @@ ALL_TESTS="
>
> lib_dir=$(dirname "$0")
> source ${lib_dir}/bond_topo_3d1c.sh
> +
> +# The ARP/NS monitor marks a slave down when it has received nothing for too
> +# long: ~250ms for the active slave and ~350ms for a backup slave with
> +# arp_interval 100. The backups only receive the copies of the active slave's
> +# probes that the gateway bridge forwards, but the active slave also gets the
> +# replies to the pings in bond_check_connection(). If the active slave goes
> +# down right after such a reply, it times out in the same monitor run as the
> +# backups, and the new active slave is then not picked by prio. Wait two
> +# monitor intervals, so that at least one more probe is sent and all slaves
> +# last received that probe.
> +bond_link_down()
> +{
> + local slave=$1
> +
> + sleep 0.2
> + ip -n ${s_ns} link set "$slave" down
> +}
> +
> c_maddr="33:33:ff:00:00:10"
> g_maddr="33:33:ff:00:02:54"
>
> @@ -97,12 +115,12 @@ prio_test()
> check_active_slave eth1
>
> # active slave should be the higher prio slave
> - ip -n ${s_ns} link set $active_slave down
> + bond_link_down $active_slave
> check_active_slave eth2
> bond_check_connection "fail over"
>
> # when only 1 slave is up
> - ip -n ${s_ns} link set $active_slave down
> + bond_link_down $active_slave
> check_active_slave eth0
> bond_check_connection "only 1 slave up"
>
> @@ -134,7 +152,7 @@ prio_test()
> ;;
> "2")
> check_active_slave "$pre_active_slave"
> - ip -n ${s_ns} link set $active_slave down
> + bond_link_down $active_slave
> bond_check_connection "pre_active slave down"
> check_active_slave "eth1"
> ;;
> @@ -153,7 +171,7 @@ prio_test()
> check_err $? "eth3 prio is not -50"
> check_active_slave "eth1"
>
> - ip -n ${s_ns} link set $active_slave down
> + bond_link_down $active_slave
> check_active_slave "eth0"
> bond_check_connection "change slave prio"
> fi
> --
> 2.56.1.703.gf848ed807c-goog
>
> base-commit: 665b4149e91b781a71bce8637c3a4d7d64dba05f
next prev parent reply other threads:[~2026-11-13 5:23 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-12 1:46 [PATCH net] selftests: bonding: fix failover race in bond_options.sh prio test Pin-yen Lin
2026-11-13 5:23 ` Hangbin Liu [this message]
2026-11-13 5:59 ` Hangbin Liu
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=avaewOJD7tX1UYfE@fedora \
--to=hangbin.liu@linux.dev \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=doebel@amazon.de \
--cc=edumazet@kernel.org \
--cc=jon.toppins+linux@gmail.com \
--cc=jv@jvosburgh.net \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=liuhangbin@gmail.com \
--cc=matttbe@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=shuah@kernel.org \
--cc=treapking@google.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