Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

vlan: clean up vlan_dev_hard_start_xmit()

Clean up vlan_dev_hard_start_xmit() function.

Cc: Benjamin LaHaise <bcrl@kvack.org>
Cc: Patrick McHardy <kaber@trash.net>
Cc: David Miller <davem@davemloft.net>
Signed-off-by: Cong Wang <amwang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Amerigo Wang and committed by
David S. Miller
6eacf8ad f3da3893

+20 -7
+20 -7
net/8021q/vlan_dev.c
··· 137 137 return rc; 138 138 } 139 139 140 + static inline netdev_tx_t vlan_netpoll_send_skb(struct vlan_dev_priv *vlan, struct sk_buff *skb) 141 + { 142 + #ifdef CONFIG_NET_POLL_CONTROLLER 143 + if (vlan->netpoll) 144 + netpoll_send_skb(vlan->netpoll, skb); 145 + #else 146 + BUG(); 147 + #endif 148 + return NETDEV_TX_OK; 149 + } 150 + 140 151 static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb, 141 152 struct net_device *dev) 142 153 { 154 + struct vlan_dev_priv *vlan = vlan_dev_priv(dev); 143 155 struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data); 144 156 unsigned int len; 145 157 int ret; ··· 162 150 * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs... 163 151 */ 164 152 if (veth->h_vlan_proto != htons(ETH_P_8021Q) || 165 - vlan_dev_priv(dev)->flags & VLAN_FLAG_REORDER_HDR) { 153 + vlan->flags & VLAN_FLAG_REORDER_HDR) { 166 154 u16 vlan_tci; 167 - vlan_tci = vlan_dev_priv(dev)->vlan_id; 155 + vlan_tci = vlan->vlan_id; 168 156 vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb); 169 157 skb = __vlan_hwaccel_put_tag(skb, vlan_tci); 170 158 } 171 159 172 - skb->dev = vlan_dev_priv(dev)->real_dev; 160 + skb->dev = vlan->real_dev; 173 161 len = skb->len; 174 - if (netpoll_tx_running(dev)) 175 - return skb->dev->netdev_ops->ndo_start_xmit(skb, skb->dev); 162 + if (unlikely(netpoll_tx_running(dev))) 163 + return vlan_netpoll_send_skb(vlan, skb); 164 + 176 165 ret = dev_queue_xmit(skb); 177 166 178 167 if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) { 179 168 struct vlan_pcpu_stats *stats; 180 169 181 - stats = this_cpu_ptr(vlan_dev_priv(dev)->vlan_pcpu_stats); 170 + stats = this_cpu_ptr(vlan->vlan_pcpu_stats); 182 171 u64_stats_update_begin(&stats->syncp); 183 172 stats->tx_packets++; 184 173 stats->tx_bytes += len; 185 174 u64_stats_update_end(&stats->syncp); 186 175 } else { 187 - this_cpu_inc(vlan_dev_priv(dev)->vlan_pcpu_stats->tx_dropped); 176 + this_cpu_inc(vlan->vlan_pcpu_stats->tx_dropped); 188 177 } 189 178 190 179 return ret;