Commit f1986b3a authored by Tonghao Zhang's avatar Tonghao Zhang Committed by Paolo Abeni
Browse files

net: bonding: skip the 2nd trylock when first one fail



After the first trylock fail, retrying immediately is
not advised as there is a high probability of failing
to acquire the lock again. This optimization makes sense.

Cc: Jay Vosburgh <jv@jvosburgh.net>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Paolo Abeni <pabeni@redhat.com>
Cc: Simon Horman <horms@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Andrew Lunn <andrew+netdev@lunn.ch>
Cc: Nikolay Aleksandrov <razor@blackwall.org>
Cc: Hangbin Liu <liuhangbin@gmail.com>
Cc: Jason Xing <kerneljasonxing@gmail.com>
Signed-off-by: default avatarTonghao Zhang <tonghao@bamaicloud.com>
Reviewed-by: default avatarHangbin Liu <liuhangbin@gmail.com>
Link: https://patch.msgid.link/9aba44f02163e8fe8dbaba63ff2df921bc2b114e.1768709239.git.tonghao@bamaicloud.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 70fc6649
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -3759,7 +3759,7 @@ static bool bond_ab_arp_probe(struct bonding *bond)

static void bond_activebackup_arp_mon(struct bonding *bond)
{
	bool should_notify_rtnl = false;
	bool should_notify_rtnl;
	int delta_in_ticks;

	delta_in_ticks = msecs_to_jiffies(bond->params.arp_interval);
@@ -3787,13 +3787,11 @@ static void bond_activebackup_arp_mon(struct bonding *bond)
	should_notify_rtnl = bond_ab_arp_probe(bond);
	rcu_read_unlock();

re_arm:
	if (bond->params.arp_interval)
		queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks);

	if (bond->send_peer_notif || should_notify_rtnl) {
		if (!rtnl_trylock())
			return;
		if (!rtnl_trylock()) {
			delta_in_ticks = 1;
			goto re_arm;
		}

		if (bond->send_peer_notif)
			bond_peer_notify_may_events(bond, true);
@@ -3805,6 +3803,10 @@ static void bond_activebackup_arp_mon(struct bonding *bond)

		rtnl_unlock();
	}

re_arm:
	if (bond->params.arp_interval)
		queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks);
}

static void bond_arp_monitor(struct work_struct *work)