if (bond == NULL)
                return 0;
 
-       return BOND_AD_INFO(bond).agg_select_timer ? 1 : 0;
+       return atomic_read(&BOND_AD_INFO(bond).agg_select_timer) ? 1 : 0;
 }
 
 /**
  */
 void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout)
 {
-       BOND_AD_INFO(bond).agg_select_timer = timeout;
+       atomic_set(&BOND_AD_INFO(bond).agg_select_timer, timeout);
 }
 
 /**
        spin_unlock_bh(&bond->mode_lock);
 }
 
+/**
+ * bond_agg_timer_advance - advance agg_select_timer
+ * @bond:  bonding structure
+ *
+ * Return true when agg_select_timer reaches 0.
+ */
+static bool bond_agg_timer_advance(struct bonding *bond)
+{
+       int val, nval;
+
+       while (1) {
+               val = atomic_read(&BOND_AD_INFO(bond).agg_select_timer);
+               if (!val)
+                       return false;
+               nval = val - 1;
+               if (atomic_cmpxchg(&BOND_AD_INFO(bond).agg_select_timer,
+                                  val, nval) == val)
+                       break;
+       }
+       return nval == 0;
+}
+
 /**
  * bond_3ad_state_machine_handler - handle state machines timeout
  * @work: work context to fetch bonding struct to work on from
        if (!bond_has_slaves(bond))
                goto re_arm;
 
-       /* check if agg_select_timer timer after initialize is timed out */
-       if (BOND_AD_INFO(bond).agg_select_timer &&
-           !(--BOND_AD_INFO(bond).agg_select_timer)) {
+       if (bond_agg_timer_advance(bond)) {
                slave = bond_first_slave_rcu(bond);
                port = slave ? &(SLAVE_AD_INFO(slave)->port) : NULL;
 
 
 struct ad_bond_info {
        struct ad_system system;        /* 802.3ad system structure */
        struct bond_3ad_stats stats;
-       u32 agg_select_timer;           /* Timer to select aggregator after all adapter's hand shakes */
+       atomic_t agg_select_timer;              /* Timer to select aggregator after all adapter's hand shakes */
        u16 aggregator_identifier;
 };