Netdev List
 help / color / mirror / Atom feed
* [PATCH net] bonding: avoid ARP flood on RTNL contention in active-backup mode
@ 2026-08-31  9:09 Eric Dumazet
  2026-09-01 10:06 ` Hangbin Liu
  2026-09-01 11:32 ` Paolo Abeni
  0 siblings, 2 replies; 4+ messages in thread
From: Eric Dumazet @ 2026-08-31  9:09 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: Simon Horman, Andrew Lunn, netdev, eric.dumazet, Eric Dumazet,
	Tonghao Zhang, Hangbin Liu, Jay Vosburgh

Commit f1986b3a9f2e ("net: bonding: skip the 2nd trylock when first one
fail") changed bond_activebackup_arp_mon() to reschedule arp_work in
1 tick if the second rtnl_trylock() fails (for sending peer/slave
notifications).

However, by the time bond_activebackup_arp_mon() reaches this second lock
check, bond_ab_arp_probe() has already been executed and sent an ARP probe.
If RTNL remains contended, rescheduling every 1 tick causes
bond_activebackup_arp_mon() to re-execute bond_ab_arp_probe() every jiffy,
flooding the network with ARP probes at HZ frequency (e.g. 1000 pkts/sec)
instead of respecting the configured arp_interval.

If rtnl_trylock() fails at the second check, do not change delta_in_ticks
to 1 so that the next ARP monitor execution is scheduled according to the
configured arp_interval, matching the behavior in
bond_loadbalance_arp_mon().

Fixes: f1986b3a9f2e ("net: bonding: skip the 2nd trylock when first one fail")
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
Cc: Tonghao Zhang <tonghao@bamaicloud.com>
Cc: Hangbin Liu <liuhangbin@gmail.com>
Cc: Jay Vosburgh <jv@jvosburgh.net>
---
 drivers/net/bonding/bond_main.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index ef9eb0c53c66..c23cf18a996a 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -3871,10 +3871,8 @@ static void bond_activebackup_arp_mon(struct bonding *bond)
 	rcu_read_unlock();
 
 	if (READ_ONCE(bond->send_peer_notif) || should_notify_rtnl) {
-		if (!rtnl_trylock()) {
-			delta_in_ticks = 1;
+		if (!rtnl_trylock())
 			goto re_arm;
-		}
 
 		if (bond->send_peer_notif)
 			bond_peer_notify_may_events(bond, true);
-- 
2.55.0.897.gb25b4bd76c-goog


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

* Re: [PATCH net] bonding: avoid ARP flood on RTNL contention in active-backup mode
  2026-08-31  9:09 [PATCH net] bonding: avoid ARP flood on RTNL contention in active-backup mode Eric Dumazet
@ 2026-09-01 10:06 ` Hangbin Liu
  2026-09-01 11:32 ` Paolo Abeni
  1 sibling, 0 replies; 4+ messages in thread
From: Hangbin Liu @ 2026-09-01 10:06 UTC (permalink / raw)
  To: Eric Dumazet
  Cc: David S . Miller, Jakub Kicinski, Paolo Abeni, Simon Horman,
	Andrew Lunn, netdev, eric.dumazet, Tonghao Zhang, Hangbin Liu,
	Jay Vosburgh

On Mon, Aug 31, 2026 at 09:09:37AM +0000, Eric Dumazet wrote:
> Commit f1986b3a9f2e ("net: bonding: skip the 2nd trylock when first one
> fail") changed bond_activebackup_arp_mon() to reschedule arp_work in
> 1 tick if the second rtnl_trylock() fails (for sending peer/slave
> notifications).
> 
> However, by the time bond_activebackup_arp_mon() reaches this second lock
> check, bond_ab_arp_probe() has already been executed and sent an ARP probe.
> If RTNL remains contended, rescheduling every 1 tick causes
> bond_activebackup_arp_mon() to re-execute bond_ab_arp_probe() every jiffy,
> flooding the network with ARP probes at HZ frequency (e.g. 1000 pkts/sec)
> instead of respecting the configured arp_interval.
> 
> If rtnl_trylock() fails at the second check, do not change delta_in_ticks
> to 1 so that the next ARP monitor execution is scheduled according to the
> configured arp_interval, matching the behavior in
> bond_loadbalance_arp_mon().
> 
> Fixes: f1986b3a9f2e ("net: bonding: skip the 2nd trylock when first one fail")
> Signed-off-by: Eric Dumazet <edumazet@google.com>
> ---
> Cc: Tonghao Zhang <tonghao@bamaicloud.com>
> Cc: Hangbin Liu <liuhangbin@gmail.com>
> Cc: Jay Vosburgh <jv@jvosburgh.net>
> ---
>  drivers/net/bonding/bond_main.c | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)
> 
> diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
> index ef9eb0c53c66..c23cf18a996a 100644
> --- a/drivers/net/bonding/bond_main.c
> +++ b/drivers/net/bonding/bond_main.c
> @@ -3871,10 +3871,8 @@ static void bond_activebackup_arp_mon(struct bonding *bond)
>  	rcu_read_unlock();
>  
>  	if (READ_ONCE(bond->send_peer_notif) || should_notify_rtnl) {
> -		if (!rtnl_trylock()) {
> -			delta_in_ticks = 1;
> +		if (!rtnl_trylock())
>  			goto re_arm;
> -		}
>  
>  		if (bond->send_peer_notif)
>  			bond_peer_notify_may_events(bond, true);
> -- 
> 2.55.0.897.gb25b4bd76c-goog
> 

Thanks for the fix.

Reviewed-by: Hangbin Liu <liuhangbin@kylinos.cn>

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

* Re: [PATCH net] bonding: avoid ARP flood on RTNL contention in active-backup mode
  2026-08-31  9:09 [PATCH net] bonding: avoid ARP flood on RTNL contention in active-backup mode Eric Dumazet
  2026-09-01 10:06 ` Hangbin Liu
@ 2026-09-01 11:32 ` Paolo Abeni
  2026-09-01 23:44   ` Jay Vosburgh
  1 sibling, 1 reply; 4+ messages in thread
From: Paolo Abeni @ 2026-09-01 11:32 UTC (permalink / raw)
  To: Eric Dumazet, David S . Miller, Jakub Kicinski, Jay Vosburgh
  Cc: Simon Horman, Andrew Lunn, netdev, eric.dumazet, Tonghao Zhang,
	Hangbin Liu

On 8/31/26 11:09 AM, Eric Dumazet wrote:
> Commit f1986b3a9f2e ("net: bonding: skip the 2nd trylock when first one
> fail") changed bond_activebackup_arp_mon() to reschedule arp_work in
> 1 tick if the second rtnl_trylock() fails (for sending peer/slave
> notifications).
> 
> However, by the time bond_activebackup_arp_mon() reaches this second lock
> check, bond_ab_arp_probe() has already been executed and sent an ARP probe.
> If RTNL remains contended, rescheduling every 1 tick causes
> bond_activebackup_arp_mon() to re-execute bond_ab_arp_probe() every jiffy,
> flooding the network with ARP probes at HZ frequency (e.g. 1000 pkts/sec)
> instead of respecting the configured arp_interval.
> 
> If rtnl_trylock() fails at the second check, do not change delta_in_ticks
> to 1 so that the next ARP monitor execution is scheduled according to the
> configured arp_interval, matching the behavior in
> bond_loadbalance_arp_mon().
> 
> Fixes: f1986b3a9f2e ("net: bonding: skip the 2nd trylock when first one fail")
> Signed-off-by: Eric Dumazet <edumazet@google.com>
> ---
> Cc: Tonghao Zhang <tonghao@bamaicloud.com>
> Cc: Hangbin Liu <liuhangbin@gmail.com>
> Cc: Jay Vosburgh <jv@jvosburgh.net>
> ---
>  drivers/net/bonding/bond_main.c | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)
> 
> diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
> index ef9eb0c53c66..c23cf18a996a 100644
> --- a/drivers/net/bonding/bond_main.c
> +++ b/drivers/net/bonding/bond_main.c
> @@ -3871,10 +3871,8 @@ static void bond_activebackup_arp_mon(struct bonding *bond)
>  	rcu_read_unlock();
>  
>  	if (READ_ONCE(bond->send_peer_notif) || should_notify_rtnl) {
> -		if (!rtnl_trylock()) {
> -			delta_in_ticks = 1;
> +		if (!rtnl_trylock())
>  			goto re_arm;

Sashiko noted this should cause a regression, with notifications
potentially delayed for an unbounded time:

https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260831090937.3342052-1-edumazet%40google.com

That was also the behavior prior to f1986b3a9f2e, so I guess is 
a reasonable trade-off, but a 2nd opinion would help :)

/P


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

* Re: [PATCH net] bonding: avoid ARP flood on RTNL contention in active-backup mode
  2026-09-01 11:32 ` Paolo Abeni
@ 2026-09-01 23:44   ` Jay Vosburgh
  0 siblings, 0 replies; 4+ messages in thread
From: Jay Vosburgh @ 2026-09-01 23:44 UTC (permalink / raw)
  To: Paolo Abeni
  Cc: Eric Dumazet, David S . Miller, Jakub Kicinski, Simon Horman,
	Andrew Lunn, netdev, eric.dumazet, Tonghao Zhang, Hangbin Liu

Paolo Abeni <pabeni@redhat.com> wrote:

>On 8/31/26 11:09 AM, Eric Dumazet wrote:
>> Commit f1986b3a9f2e ("net: bonding: skip the 2nd trylock when first one
>> fail") changed bond_activebackup_arp_mon() to reschedule arp_work in
>> 1 tick if the second rtnl_trylock() fails (for sending peer/slave
>> notifications).
>> 
>> However, by the time bond_activebackup_arp_mon() reaches this second lock
>> check, bond_ab_arp_probe() has already been executed and sent an ARP probe.
>> If RTNL remains contended, rescheduling every 1 tick causes
>> bond_activebackup_arp_mon() to re-execute bond_ab_arp_probe() every jiffy,
>> flooding the network with ARP probes at HZ frequency (e.g. 1000 pkts/sec)
>> instead of respecting the configured arp_interval.
>> 
>> If rtnl_trylock() fails at the second check, do not change delta_in_ticks
>> to 1 so that the next ARP monitor execution is scheduled according to the
>> configured arp_interval, matching the behavior in
>> bond_loadbalance_arp_mon().
>> 
>> Fixes: f1986b3a9f2e ("net: bonding: skip the 2nd trylock when first one fail")
>> Signed-off-by: Eric Dumazet <edumazet@google.com>
>> ---
>> Cc: Tonghao Zhang <tonghao@bamaicloud.com>
>> Cc: Hangbin Liu <liuhangbin@gmail.com>
>> Cc: Jay Vosburgh <jv@jvosburgh.net>
>> ---
>>  drivers/net/bonding/bond_main.c | 4 +---
>>  1 file changed, 1 insertion(+), 3 deletions(-)
>> 
>> diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
>> index ef9eb0c53c66..c23cf18a996a 100644
>> --- a/drivers/net/bonding/bond_main.c
>> +++ b/drivers/net/bonding/bond_main.c
>> @@ -3871,10 +3871,8 @@ static void bond_activebackup_arp_mon(struct bonding *bond)
>>  	rcu_read_unlock();
>>  
>>  	if (READ_ONCE(bond->send_peer_notif) || should_notify_rtnl) {
>> -		if (!rtnl_trylock()) {
>> -			delta_in_ticks = 1;
>> +		if (!rtnl_trylock())
>>  			goto re_arm;
>
>Sashiko noted this should cause a regression, with notifications
>potentially delayed for an unbounded time:
>
>https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260831090937.3342052-1-edumazet%40google.com
>
>That was also the behavior prior to f1986b3a9f2e, so I guess is 
>a reasonable trade-off, but a 2nd opinion would help :)

	Yeah, without reworking all of this so it's just one round trip
on RTNL, it's a choice between possible ARP spam or an unlikely
possibility of egregiously delayed probes.  At the default missed_max of
2, with the rearm interval set to delta_in_ticks (i.e., this patch
applied), the ARP mon will fail over if it misses RTNL twice, with
caveat that the first miss needs to be the second RTNL acquisition in
bond_activebackup_arp_mon.

	I suppose another possibility would be to set delta_in_ticks to
something larger than 1, on the theory that RTNL shouldn't generally be
held for very long, so a sufficiently large value would be likely to
miss the contention but not wait too long.  Choosing a value is going to
have voodoo in there, and would likely have to be some fraction of
delta_in_ticks.

	Regardless of the rearm interval (1, delta_in_ticks, or
somewhere in between), the notification can be delayed for unbounded
time if we are sufficiently unlucky, although it's more likely with the
larger value from delta_in_ticks.

	That said, I don't have a major objection to changing this back.

Acked-by: Jay Vosburgh <jv@jvosburgh.net>

	-J

---
	-Jay Vosburgh, jv@jvosburgh.net


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

end of thread, other threads:[~2026-09-01 23:44 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-31  9:09 [PATCH net] bonding: avoid ARP flood on RTNL contention in active-backup mode Eric Dumazet
2026-09-01 10:06 ` Hangbin Liu
2026-09-01 11:32 ` Paolo Abeni
2026-09-01 23:44   ` Jay Vosburgh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox