diff -ur linux-2.6.38-orig/drivers/net/bonding/bond_main.c linux-2.6.38/drivers/net/bonding/bond_main.c --- linux-2.6.38-orig/drivers/net/bonding/bond_main.c 2011-07-20 12:39:13.000000000 +0200 +++ linux-2.6.38/drivers/net/bonding/bond_main.c 2011-07-20 13:05:49.000000000 +0200 @@ -4531,11 +4531,19 @@ { /* * This helper function exists to help dev_pick_tx get the correct - * destination queue. Using a helper function skips the a call to + * destination queue. Using a helper function skips a call to * skb_tx_hash and will put the skbs in the queue we expect on their * way down to the bonding driver. */ return skb->queue_mapping; + u16 txq = skb_rx_queue_recorded(skb) ? skb_get_rx_queue(skb) : 0; + + if (unlikely(txq >= dev->real_num_tx_queues)) { + do + txq -= dev->real_num_tx_queues; + while (txq >= dev->real_num_tx_queues); + } + return txq; } static netdev_tx_t bond_start_xmit(struct sk_buff *skb, struct net_device *dev) Only in linux-2.6.38/drivers/net/bonding: bond_main.c~