slave_id = prandom_u32();
                break;
        case 1:
-               slave_id = bond->rr_tx_counter;
+               slave_id = this_cpu_inc_return(*bond->rr_tx_counter);
                break;
        default:
                reciprocal_packets_per_slave =
                        bond->params.reciprocal_packets_per_slave;
-               slave_id = reciprocal_divide(bond->rr_tx_counter,
+               slave_id = this_cpu_inc_return(*bond->rr_tx_counter);
+               slave_id = reciprocal_divide(slave_id,
                                             reciprocal_packets_per_slave);
                break;
        }
-       bond->rr_tx_counter++;
 
        return slave_id;
 }
 
        if (bond->wq)
                destroy_workqueue(bond->wq);
+
+       if (bond->rr_tx_counter)
+               free_percpu(bond->rr_tx_counter);
 }
 
 void bond_setup(struct net_device *bond_dev)
        if (!bond->wq)
                return -ENOMEM;
 
+       if (BOND_MODE(bond) == BOND_MODE_ROUNDROBIN) {
+               bond->rr_tx_counter = alloc_percpu(u32);
+               if (!bond->rr_tx_counter) {
+                       destroy_workqueue(bond->wq);
+                       bond->wq = NULL;
+                       return -ENOMEM;
+               }
+       }
+
        spin_lock_init(&bond->stats_lock);
        netdev_lockdep_set_classes(bond_dev);
 
 
        char     proc_file_name[IFNAMSIZ];
 #endif /* CONFIG_PROC_FS */
        struct   list_head bond_list;
-       u32      rr_tx_counter;
+       u32 __percpu *rr_tx_counter;
        struct   ad_bond_info ad_info;
        struct   alb_bond_info alb_info;
        struct   bond_params params;