aboutsummaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2014-03-14 23:50:25 -0400
committerDavid S. Miller <davem@davemloft.net>2014-03-17 15:47:23 -0400
commit18b37535f861b7eb053040b0b9502331a781c782 (patch)
tree38c924b99d68c77255595140880b61c4542fa866 /net/core
parentad8d475244b4112a0f5331e78d043d3a4c9eb37e (diff)
netpoll: Consolidate neigh_tx processing in service_neigh_queue
Move the bond slave device neigh_tx handling into service_neigh_queue. In connection with neigh_tx processing remove unnecessary tests of a NULL netpoll_info. As the netpoll_poll_dev has already used and thus verified the existince of the netpoll_info. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/netpoll.c38
1 files changed, 16 insertions, 22 deletions
diff --git a/net/core/netpoll.c b/net/core/netpoll.c
index 0e45835f1737..b69bb3f1ba3f 100644
--- a/net/core/netpoll.c
+++ b/net/core/netpoll.c
@@ -179,14 +179,23 @@ static void poll_napi(struct net_device *dev, int budget)
179 } 179 }
180} 180}
181 181
182static void service_neigh_queue(struct netpoll_info *npi) 182static void service_neigh_queue(struct net_device *dev,
183 struct netpoll_info *npi)
183{ 184{
184 if (npi) { 185 struct sk_buff *skb;
185 struct sk_buff *skb; 186 if (dev->flags & IFF_SLAVE) {
186 187 struct net_device *bond_dev;
187 while ((skb = skb_dequeue(&npi->neigh_tx))) 188 struct netpoll_info *bond_ni;
188 netpoll_neigh_reply(skb, npi); 189
190 bond_dev = netdev_master_upper_dev_get_rcu(dev);
191 bond_ni = rcu_dereference_bh(bond_dev->npinfo);
192 while ((skb = skb_dequeue(&npi->neigh_tx))) {
193 skb->dev = bond_dev;
194 skb_queue_tail(&bond_ni->neigh_tx, skb);
195 }
189 } 196 }
197 while ((skb = skb_dequeue(&npi->neigh_tx)))
198 netpoll_neigh_reply(skb, npi);
190} 199}
191 200
192static void netpoll_poll_dev(struct net_device *dev) 201static void netpoll_poll_dev(struct net_device *dev)
@@ -227,22 +236,7 @@ static void netpoll_poll_dev(struct net_device *dev)
227 236
228 up(&ni->dev_lock); 237 up(&ni->dev_lock);
229 238
230 if (dev->flags & IFF_SLAVE) { 239 service_neigh_queue(dev, ni);
231 if (ni) {
232 struct net_device *bond_dev;
233 struct sk_buff *skb;
234 struct netpoll_info *bond_ni;
235
236 bond_dev = netdev_master_upper_dev_get_rcu(dev);
237 bond_ni = rcu_dereference_bh(bond_dev->npinfo);
238 while ((skb = skb_dequeue(&ni->neigh_tx))) {
239 skb->dev = bond_dev;
240 skb_queue_tail(&bond_ni->neigh_tx, skb);
241 }
242 }
243 }
244
245 service_neigh_queue(ni);
246 240
247 zap_completion_queue(); 241 zap_completion_queue();
248} 242}