Commit 4ead4431 authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller

netpoll: Add drop checks to all entry points

The netpoll entry checks are required to ensure that we don't
receive normal packets when invoked via netpoll.  Unfortunately
it only ever worked for the netif_receive_skb/netif_rx entry
points.  The VLAN (and subsequently GRO) entry point didn't
have the check and therefore can trigger all sorts of weird
problems.

This patch adds the netpoll check to all entry points.

I'm still uneasy with receiving at all under netpoll (which
apparently is only used by the out-of-tree kdump code).  The
reason is it is perfectly legal to receive all data including
headers into highmem if netpoll is off, but if you try to do
that with netpoll on and someone gets a printk in an IRQ handler                                             
you're going to get a nice BUG_ON.
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 18963caa
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#include <linux/netpoll.h>
#include "vlan.h" #include "vlan.h"
/* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */ /* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */
int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
u16 vlan_tci, int polling) u16 vlan_tci, int polling)
{ {
if (netpoll_rx(skb))
return NET_RX_DROP;
if (skb_bond_should_drop(skb)) if (skb_bond_should_drop(skb))
goto drop; goto drop;
...@@ -100,6 +104,9 @@ int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, ...@@ -100,6 +104,9 @@ int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
{ {
int err = NET_RX_SUCCESS; int err = NET_RX_SUCCESS;
if (netpoll_receive_skb(skb))
return NET_RX_DROP;
switch (vlan_gro_common(napi, grp, vlan_tci, skb)) { switch (vlan_gro_common(napi, grp, vlan_tci, skb)) {
case -1: case -1:
return netif_receive_skb(skb); return netif_receive_skb(skb);
...@@ -126,6 +133,9 @@ int vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, ...@@ -126,6 +133,9 @@ int vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
if (!skb) if (!skb)
goto out; goto out;
if (netpoll_receive_skb(skb))
goto out;
err = NET_RX_SUCCESS; err = NET_RX_SUCCESS;
switch (vlan_gro_common(napi, grp, vlan_tci, skb)) { switch (vlan_gro_common(napi, grp, vlan_tci, skb)) {
......
...@@ -2488,6 +2488,9 @@ static int __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) ...@@ -2488,6 +2488,9 @@ static int __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
{ {
if (netpoll_receive_skb(skb))
return NET_RX_DROP;
switch (__napi_gro_receive(napi, skb)) { switch (__napi_gro_receive(napi, skb)) {
case -1: case -1:
return netif_receive_skb(skb); return netif_receive_skb(skb);
...@@ -2558,6 +2561,9 @@ int napi_gro_frags(struct napi_struct *napi, struct napi_gro_fraginfo *info) ...@@ -2558,6 +2561,9 @@ int napi_gro_frags(struct napi_struct *napi, struct napi_gro_fraginfo *info)
if (!skb) if (!skb)
goto out; goto out;
if (netpoll_receive_skb(skb))
goto out;
err = NET_RX_SUCCESS; err = NET_RX_SUCCESS;
switch (__napi_gro_receive(napi, skb)) { switch (__napi_gro_receive(napi, skb)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment