From: Jay Vosburgh <jv@jvosburgh.net>
To: Louis Scalbert <louis.scalbert@6wind.com>
Cc: netdev@vger.kernel.org, jandrew+netdev@lunn.ch,
edumazet@google.com, kuba@kernel.org, pabeni@redhat.com,
fbl@redhat.com, andy@greyhouse.net, shemminger@vyatta.com
Subject: Re: [PATCH net 2/2] bonding: 3ad: fix mux port state on oper down
Date: Wed, 18 Mar 2026 18:40:48 -0700 [thread overview]
Message-ID: <1944595.1773884448@famine> (raw)
In-Reply-To: <20260316131838.3257889-3-louis.scalbert@6wind.com>
Louis Scalbert <louis.scalbert@6wind.com> wrote:
>When the bonding interface has carrier down due to the absence of
>valid slaves and a slave transitions from down to up, the bonding
>interface briefly goes carrier up, then down again, and finally up
>once LACP negotiates collecting and distributing on the port.
>
>The interface should not transition to carrier up until LACP
>negotiation is complete.
>
>This happens because the actor and partner port states remain in
>collecting (and distributing) when the port goes down. When the port
>comes back up, it temporarily remains in this state until LACP
>renegotiation occurs.
>
>Previously this was mostly cosmetic, but since the bonding carrier
>state now depends on the LACP negotiation state, it causes the
>interface to flap.
>
>Fix this by unsetting the SELECTED flag when a port goes down so that
>the mux state machine transitions through ATTACHED and DETACHED,
>which clears the actor collecting and distributing flags.
>
>Fixes: 655f8919d549 ("bonding: add min links parameter to 802.3ad")
>Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
>---
> drivers/net/bonding/bond_3ad.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
>diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
>index 7d7661972c5e..367d89977000 100644
>--- a/drivers/net/bonding/bond_3ad.c
>+++ b/drivers/net/bonding/bond_3ad.c
>@@ -716,6 +716,8 @@ static int __agg_ports_are_ready(struct aggregator *aggregator)
> for (port = aggregator->lag_ports;
> port;
> port = port->next_port_in_aggregator) {
>+ if (!port->is_enabled)
>+ continue;
Your commit message mentions clearing SELECTED, further below,
but not the new two tests for port->is_enabled. In this change,
__agg_ports_are_ready is testing that all ports of an aggregator are
READY_N, but if a port of the aggregator is not is_enabled, then
logically it would not be READY_N, either. So why exclude it here?
Is a this is an optimization to settle the aggregator state more
quickly, as an !is_enabled port is likely to be transitioning out of the
aggregator?
> if (!(port->sm_vars & AD_PORT_READY_N)) {
> retval = 0;
> break;
>@@ -1570,6 +1572,9 @@ static void ad_port_selection_logic(struct port *port, bool *update_slave_arr)
> struct slave *slave;
> int found = 0;
>
>+ if (!port->is_enabled)
>+ return;
>+
Same question as above, why exclude !is_enabled ports here?
-J
> /* if the port is already Selected, do nothing */
> if (port->sm_vars & AD_PORT_SELECTED)
> return;
>@@ -2794,6 +2799,7 @@ void bond_3ad_handle_link_change(struct slave *slave, char link)
> /* link has failed */
> port->is_enabled = false;
> ad_update_actor_keys(port, true);
>+ port->sm_vars &= ~AD_PORT_SELECTED;
> }
> agg = __get_first_agg(port);
> ad_agg_selection_logic(agg, &dummy);
>--
>2.39.2
>
---
-Jay Vosburgh, jv@jvosburgh.net
next prev parent reply other threads:[~2026-03-19 1:40 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-16 13:18 [PATCH net 0/2] bonding: 3ad: fix carrier state with no valid slaves Louis Scalbert
2026-03-16 13:18 ` [PATCH net 1/2] bonding: 3ad: fix carrier when " Louis Scalbert
2026-03-19 1:14 ` Jay Vosburgh
2026-03-20 14:06 ` Louis Scalbert
2026-03-16 13:18 ` [PATCH net 2/2] bonding: 3ad: fix mux port state on oper down Louis Scalbert
2026-03-19 1:40 ` Jay Vosburgh [this message]
2026-03-20 10:01 ` Louis Scalbert
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=1944595.1773884448@famine \
--to=jv@jvosburgh.net \
--cc=andy@greyhouse.net \
--cc=edumazet@google.com \
--cc=fbl@redhat.com \
--cc=jandrew+netdev@lunn.ch \
--cc=kuba@kernel.org \
--cc=louis.scalbert@6wind.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=shemminger@vyatta.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.