File tree Expand file tree Collapse file tree 1 file changed +8
-2
lines changed Expand file tree Collapse file tree 1 file changed +8
-2
lines changed Original file line number Diff line number Diff line change @@ -105,15 +105,21 @@ static void queue_process(struct work_struct *work)
105105 while ((skb = skb_dequeue (& npinfo -> txq ))) {
106106 struct net_device * dev = skb -> dev ;
107107 struct netdev_queue * txq ;
108+ unsigned int q_index ;
108109
109110 if (!netif_device_present (dev ) || !netif_running (dev )) {
110111 kfree_skb (skb );
111112 continue ;
112113 }
113114
114- txq = skb_get_tx_queue (dev , skb );
115-
116115 local_irq_save (flags );
116+ /* check if skb->queue_mapping is still valid */
117+ q_index = skb_get_queue_mapping (skb );
118+ if (unlikely (q_index >= dev -> real_num_tx_queues )) {
119+ q_index = q_index % dev -> real_num_tx_queues ;
120+ skb_set_queue_mapping (skb , q_index );
121+ }
122+ txq = netdev_get_tx_queue (dev , q_index );
117123 HARD_TX_LOCK (dev , txq , smp_processor_id ());
118124 if (netif_xmit_frozen_or_stopped (txq ) ||
119125 netpoll_start_xmit (skb , dev , txq ) != NETDEV_TX_OK ) {
You can’t perform that action at this time.
0 commit comments