From: Eric W. Biederman Date: Sat, 15 Mar 2014 03:44:37 +0000 (-0700) Subject: netpoll: move setting of NETPOLL_RX_DROP into netpoll_poll_dev X-Git-Tag: v3.15-rc1~113^2~143^2~9 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=b249b51b983db1773d3531b7266c397b6b16a7cd;p=~emulex%2Finfiniband.git netpoll: move setting of NETPOLL_RX_DROP into netpoll_poll_dev Today netpoll depends on setting NETPOLL_RX_DROP before networking drivers receive packets in interrupt context so that the packets can be dropped. Move this setting into netpoll_poll_dev from poll_one_napi so that if ndo_poll_controller happens to receive packets we will drop the packets on the floor instead of letting the packets bounce through the networking stack and potentially cause problems. Signed-off-by: "Eric W. Biederman" Signed-off-by: David S. Miller --- diff --git a/net/core/netpoll.c b/net/core/netpoll.c index a664f7829a6..ef4f45df539 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c @@ -144,8 +144,7 @@ static __sum16 checksum_udp(struct sk_buff *skb, struct udphdr *uh, * network adapter, forcing superfluous retries and possibly timeouts. * Thus, we set our budget to greater than 1. */ -static int poll_one_napi(struct netpoll_info *npinfo, - struct napi_struct *napi, int budget) +static int poll_one_napi(struct napi_struct *napi, int budget) { int work; @@ -156,16 +155,12 @@ static int poll_one_napi(struct netpoll_info *npinfo, if (!test_bit(NAPI_STATE_SCHED, &napi->state)) return budget; - npinfo->rx_flags |= NETPOLL_RX_DROP; - atomic_inc(&trapped); set_bit(NAPI_STATE_NPSVC, &napi->state); work = napi->poll(napi, budget); trace_napi_poll(napi); clear_bit(NAPI_STATE_NPSVC, &napi->state); - atomic_dec(&trapped); - npinfo->rx_flags &= ~NETPOLL_RX_DROP; return budget - work; } @@ -178,8 +173,7 @@ static void poll_napi(struct net_device *dev) list_for_each_entry(napi, &dev->napi_list, dev_list) { if (napi->poll_owner != smp_processor_id() && spin_trylock(&napi->poll_lock)) { - budget = poll_one_napi(rcu_dereference_bh(dev->npinfo), - napi, budget); + budget = poll_one_napi(napi, budget); spin_unlock(&napi->poll_lock); if (!budget) @@ -215,6 +209,9 @@ static void netpoll_poll_dev(struct net_device *dev) return; } + ni->rx_flags |= NETPOLL_RX_DROP; + atomic_inc(&trapped); + ops = dev->netdev_ops; if (!ops->ndo_poll_controller) { up(&ni->dev_lock); @@ -226,6 +223,9 @@ static void netpoll_poll_dev(struct net_device *dev) poll_napi(dev); + atomic_dec(&trapped); + ni->rx_flags &= ~NETPOLL_RX_DROP; + up(&ni->dev_lock); if (dev->flags & IFF_SLAVE) {