diff options
| author | Eric W. Biederman <ebiederm@xmission.com> | 2014-03-14 20:44:37 -0700 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-03-17 15:47:21 -0400 | 
| commit | b249b51b983db1773d3531b7266c397b6b16a7cd (patch) | |
| tree | f753532433847e389a9b07a15d112dfd19d4fc23 /net/core/netpoll.c | |
| parent | e86e180b824e00733bd0e499d412a595078f9b51 (diff) | |
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" <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/netpoll.c')
| -rw-r--r-- | net/core/netpoll.c | 16 | 
1 files changed, 8 insertions, 8 deletions
| diff --git a/net/core/netpoll.c b/net/core/netpoll.c index a664f7829a6d..ef4f45df539f 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) { | 
