Commit 6eacf8ad8d01c49b95b994b0bf379db2b5b29460
Committed by
David S. Miller
1 parent
f3da38932b
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
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>
Showing 1 changed file with 20 additions and 7 deletions Side-by-side Diff
net/8021q/vlan_dev.c
... | ... | @@ -137,9 +137,21 @@ |
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; |
146 | 158 | |
147 | 159 | |
148 | 160 | |
149 | 161 | |
150 | 162 | |
... | ... | @@ -150,29 +162,30 @@ |
150 | 162 | * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs... |
151 | 163 | */ |
152 | 164 | if (veth->h_vlan_proto != htons(ETH_P_8021Q) || |
153 | - vlan_dev_priv(dev)->flags & VLAN_FLAG_REORDER_HDR) { | |
165 | + vlan->flags & VLAN_FLAG_REORDER_HDR) { | |
154 | 166 | u16 vlan_tci; |
155 | - vlan_tci = vlan_dev_priv(dev)->vlan_id; | |
167 | + vlan_tci = vlan->vlan_id; | |
156 | 168 | vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb); |
157 | 169 | skb = __vlan_hwaccel_put_tag(skb, vlan_tci); |
158 | 170 | } |
159 | 171 | |
160 | - skb->dev = vlan_dev_priv(dev)->real_dev; | |
172 | + skb->dev = vlan->real_dev; | |
161 | 173 | len = skb->len; |
162 | - if (netpoll_tx_running(dev)) | |
163 | - return skb->dev->netdev_ops->ndo_start_xmit(skb, skb->dev); | |
174 | + if (unlikely(netpoll_tx_running(dev))) | |
175 | + return vlan_netpoll_send_skb(vlan, skb); | |
176 | + | |
164 | 177 | ret = dev_queue_xmit(skb); |
165 | 178 | |
166 | 179 | if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) { |
167 | 180 | struct vlan_pcpu_stats *stats; |
168 | 181 | |
169 | - stats = this_cpu_ptr(vlan_dev_priv(dev)->vlan_pcpu_stats); | |
182 | + stats = this_cpu_ptr(vlan->vlan_pcpu_stats); | |
170 | 183 | u64_stats_update_begin(&stats->syncp); |
171 | 184 | stats->tx_packets++; |
172 | 185 | stats->tx_bytes += len; |
173 | 186 | u64_stats_update_end(&stats->syncp); |
174 | 187 | } else { |
175 | - this_cpu_inc(vlan_dev_priv(dev)->vlan_pcpu_stats->tx_dropped); | |
188 | + this_cpu_inc(vlan->vlan_pcpu_stats->tx_dropped); | |
176 | 189 | } |
177 | 190 | |
178 | 191 | return ret; |