Ajith Adapa <adapa.aj...@gmail.com> wrote:

>On 26 June 2015 at 07:45, Jay Vosburgh <jay.vosbu...@canonical.com> wrote:
>> echo 'module bonding =p' > /sys/kernel/debug/dynamic_debug/control
>Hi,
>
>thanks for the reply.

        I tried this out a bit here, and could reproduce the problem on
3.13, but not on 4.0.0.  A bit of checking suggests that this problem is
fixed by the following commit:

commit 63b46242f707849a1df10b70e026281bfa40e849
Author: Wilson Kok <w...@cumulusnetworks.com>
Date:   Mon Jan 26 01:16:59 2015 -0500

    bonding: fix incorrect lacp mux state when agg not active

        which looks to have first appeared in the 4.0 kernel.  I did a
quick backport of that to 3.13 (leaving out the style and pr_debug
changes), and it appears to resolve the problem.

        Ajith: can you test this patch?  If this resolves the problem
for you, we can request this patch for -stable to get it into the older
kernels.

diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
index dc0c56a..8c62f90 100644
--- a/drivers/net/bonding/bond_3ad.c
+++ b/drivers/net/bonding/bond_3ad.c
@@ -890,19 +890,23 @@ static void ad_mux_machine(struct port *port)
                case AD_MUX_ATTACHED:
                        // check also if agg_select_timer expired(so the edable 
port will take place only after this timer)
                        if ((port->sm_vars & AD_PORT_SELECTED) && 
(port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) && 
!__check_agg_selection_timer(port)) {
-                               port->sm_mux_state = 
AD_MUX_COLLECTING_DISTRIBUTING;// next state
+                               if (port->aggregator->is_active)
+                                       port->sm_mux_state = 
AD_MUX_COLLECTING_DISTRIBUTING;// next state
                        } else if (!(port->sm_vars & AD_PORT_SELECTED) || 
(port->sm_vars & AD_PORT_STANDBY)) {    // if UNSELECTED or STANDBY
                                port->sm_vars &= ~AD_PORT_READY_N;
                                // in order to withhold the selection logic to 
check all ports READY_N value
                                // every callback cycle to update ready 
variable, we check READY_N and update READY here
                                __set_agg_ports_ready(port->aggregator, 
__agg_ports_are_ready(port->aggregator));
                                port->sm_mux_state = AD_MUX_DETACHED;// next 
state
+                       } else if (port->aggregator->is_active) {
+                               port->actor_oper_port_state |=
+                                       AD_STATE_SYNCHRONIZATION;
                        }
                        break;
                case AD_MUX_COLLECTING_DISTRIBUTING:
                        if (!(port->sm_vars & AD_PORT_SELECTED) || 
(port->sm_vars & AD_PORT_STANDBY) ||
-                           !(port->partner_oper.port_state & 
AD_STATE_SYNCHRONIZATION)
-                          ) {
+                           !(port->partner_oper.port_state & 
AD_STATE_SYNCHRONIZATION) ||
+                           !(port->actor_oper_port_state & 
AD_STATE_SYNCHRONIZATION)) {
                                port->sm_mux_state = AD_MUX_ATTACHED;// next 
state
 
                        } else {
@@ -941,7 +945,12 @@ static void ad_mux_machine(struct port *port)
                        break;
                case AD_MUX_ATTACHED:
                        __attach_bond_to_agg(port);
-                       port->actor_oper_port_state |= AD_STATE_SYNCHRONIZATION;
+                       if (port->aggregator->is_active)
+                               port->actor_oper_port_state |=
+                                       AD_STATE_SYNCHRONIZATION;
+                       else
+                               port->actor_oper_port_state &=
+                                       ~AD_STATE_SYNCHRONIZATION;
                        port->actor_oper_port_state &= ~AD_STATE_COLLECTING;
                        port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING;
                        ad_disable_collecting_distributing(port);
@@ -950,6 +959,7 @@ static void ad_mux_machine(struct port *port)
                case AD_MUX_COLLECTING_DISTRIBUTING:
                        port->actor_oper_port_state |= AD_STATE_COLLECTING;
                        port->actor_oper_port_state |= AD_STATE_DISTRIBUTING;
+                       port->actor_oper_port_state |= AD_STATE_SYNCHRONIZATION;
                        ad_enable_collecting_distributing(port);
                        port->ntt = true;
                        break;
@@ -1350,6 +1360,9 @@ static void ad_port_selection_logic(struct port *port)
 
        aggregator = __get_first_agg(port);
        ad_agg_selection_logic(aggregator);
+
+       if (!port->aggregator->is_active)
+               port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION;
 }
 
 /*


        -J

---
        -Jay Vosburgh, jay.vosbu...@canonical.com
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to