245 lines
7.6 KiB
Diff
245 lines
7.6 KiB
Diff
From: Ben Hutchings <bhutchings@solarflare.com>
|
|
Date: Thu, 29 Oct 2009 21:36:53 -0700
|
|
Subject: [PATCH] gro: Change all receive functions to return GRO result codes
|
|
|
|
commit c7c4b3b6e976b95facbb723951bdcd554a3530a4 upstream.
|
|
|
|
This will allow drivers to adjust their receive path dynamically
|
|
based on whether GRO is being applied successfully.
|
|
|
|
Currently all in-tree callers ignore the return values of these
|
|
functions and do not need to be changed.
|
|
|
|
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
|
|
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
[bwh: adjusted to apply on top of the VLAN-GRO fix]
|
|
---
|
|
include/linux/if_vlan.h | 25 ++++++++++++++-----------
|
|
include/linux/netdevice.h | 8 ++++----
|
|
net/8021q/vlan_core.c | 16 +++++++++-------
|
|
net/core/dev.c | 38 +++++++++++++++-----------------------
|
|
4 files changed, 42 insertions(+), 45 deletions(-)
|
|
|
|
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h
|
|
index 71a4870..153f6b9 100644
|
|
--- a/include/linux/if_vlan.h
|
|
+++ b/include/linux/if_vlan.h
|
|
@@ -120,10 +120,12 @@ extern u16 vlan_dev_vlan_id(const struct net_device *dev);
|
|
extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
|
|
u16 vlan_tci, int polling);
|
|
extern int vlan_hwaccel_do_receive(struct sk_buff *skb);
|
|
-extern int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
|
|
- unsigned int vlan_tci, struct sk_buff *skb);
|
|
-extern int vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
|
|
- unsigned int vlan_tci);
|
|
+extern gro_result_t
|
|
+vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
|
|
+ unsigned int vlan_tci, struct sk_buff *skb);
|
|
+extern gro_result_t
|
|
+vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
|
|
+ unsigned int vlan_tci);
|
|
|
|
#else
|
|
static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev)
|
|
@@ -150,17 +152,18 @@ static inline int vlan_hwaccel_do_receive(struct sk_buff *skb)
|
|
return 0;
|
|
}
|
|
|
|
-static inline int vlan_gro_receive(struct napi_struct *napi,
|
|
- struct vlan_group *grp,
|
|
- unsigned int vlan_tci, struct sk_buff *skb)
|
|
+static inline gro_result_t
|
|
+vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
|
|
+ unsigned int vlan_tci, struct sk_buff *skb)
|
|
{
|
|
- return NET_RX_DROP;
|
|
+ return GRO_DROP;
|
|
}
|
|
|
|
-static inline int vlan_gro_frags(struct napi_struct *napi,
|
|
- struct vlan_group *grp, unsigned int vlan_tci)
|
|
+static inline gro_result_t
|
|
+vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
|
|
+ unsigned int vlan_tci)
|
|
{
|
|
- return NET_RX_DROP;
|
|
+ return GRO_DROP;
|
|
}
|
|
#endif
|
|
|
|
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
|
|
index 6e777ef..193b637 100644
|
|
--- a/include/linux/netdevice.h
|
|
+++ b/include/linux/netdevice.h
|
|
@@ -1483,17 +1483,17 @@ extern int netif_receive_skb(struct sk_buff *skb);
|
|
extern void napi_gro_flush(struct napi_struct *napi);
|
|
extern gro_result_t dev_gro_receive(struct napi_struct *napi,
|
|
struct sk_buff *skb);
|
|
-extern int napi_skb_finish(gro_result_t ret, struct sk_buff *skb);
|
|
-extern int napi_gro_receive(struct napi_struct *napi,
|
|
+extern gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb);
|
|
+extern gro_result_t napi_gro_receive(struct napi_struct *napi,
|
|
struct sk_buff *skb);
|
|
extern void napi_reuse_skb(struct napi_struct *napi,
|
|
struct sk_buff *skb);
|
|
extern struct sk_buff * napi_get_frags(struct napi_struct *napi);
|
|
-extern int napi_frags_finish(struct napi_struct *napi,
|
|
+extern gro_result_t napi_frags_finish(struct napi_struct *napi,
|
|
struct sk_buff *skb,
|
|
gro_result_t ret);
|
|
extern struct sk_buff * napi_frags_skb(struct napi_struct *napi);
|
|
-extern int napi_gro_frags(struct napi_struct *napi);
|
|
+extern gro_result_t napi_gro_frags(struct napi_struct *napi);
|
|
|
|
static inline void napi_free_frags(struct napi_struct *napi)
|
|
{
|
|
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c
|
|
index 47a80d6..8d5ca2a 100644
|
|
--- a/net/8021q/vlan_core.c
|
|
+++ b/net/8021q/vlan_core.c
|
|
@@ -102,11 +102,12 @@ drop:
|
|
return GRO_DROP;
|
|
}
|
|
|
|
-int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
|
|
- unsigned int vlan_tci, struct sk_buff *skb)
|
|
+gro_result_t vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
|
|
+ unsigned int vlan_tci, struct sk_buff *skb)
|
|
{
|
|
if (netpoll_rx_on(skb))
|
|
- return vlan_hwaccel_receive_skb(skb, grp, vlan_tci);
|
|
+ return vlan_hwaccel_receive_skb(skb, grp, vlan_tci)
|
|
+ ? GRO_DROP : GRO_NORMAL;
|
|
|
|
skb_gro_reset_offset(skb);
|
|
|
|
@@ -114,17 +115,18 @@ int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
|
|
}
|
|
EXPORT_SYMBOL(vlan_gro_receive);
|
|
|
|
-int vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
|
|
- unsigned int vlan_tci)
|
|
+gro_result_t vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
|
|
+ unsigned int vlan_tci)
|
|
{
|
|
struct sk_buff *skb = napi_frags_skb(napi);
|
|
|
|
if (!skb)
|
|
- return NET_RX_DROP;
|
|
+ return GRO_DROP;
|
|
|
|
if (netpoll_rx_on(skb)) {
|
|
skb->protocol = eth_type_trans(skb, skb->dev);
|
|
- return vlan_hwaccel_receive_skb(skb, grp, vlan_tci);
|
|
+ return vlan_hwaccel_receive_skb(skb, grp, vlan_tci)
|
|
+ ? GRO_DROP : GRO_NORMAL;
|
|
}
|
|
|
|
return napi_frags_finish(napi, skb,
|
|
diff --git a/net/core/dev.c b/net/core/dev.c
|
|
index 1dc1374..631cc40 100644
|
|
--- a/net/core/dev.c
|
|
+++ b/net/core/dev.c
|
|
@@ -2586,18 +2586,15 @@ __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
|
|
return dev_gro_receive(napi, skb);
|
|
}
|
|
|
|
-int napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
|
|
+gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
|
|
{
|
|
- int err = NET_RX_SUCCESS;
|
|
-
|
|
switch (ret) {
|
|
case GRO_NORMAL:
|
|
- return netif_receive_skb(skb);
|
|
+ if (netif_receive_skb(skb))
|
|
+ ret = GRO_DROP;
|
|
+ break;
|
|
|
|
case GRO_DROP:
|
|
- err = NET_RX_DROP;
|
|
- /* fall through */
|
|
-
|
|
case GRO_MERGED_FREE:
|
|
kfree_skb(skb);
|
|
break;
|
|
@@ -2607,7 +2604,7 @@ int napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
|
|
break;
|
|
}
|
|
|
|
- return err;
|
|
+ return ret;
|
|
}
|
|
EXPORT_SYMBOL(napi_skb_finish);
|
|
|
|
@@ -2627,7 +2624,7 @@ void skb_gro_reset_offset(struct sk_buff *skb)
|
|
}
|
|
EXPORT_SYMBOL(skb_gro_reset_offset);
|
|
|
|
-int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
|
|
+gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
|
|
{
|
|
skb_gro_reset_offset(skb);
|
|
|
|
@@ -2657,26 +2654,21 @@ struct sk_buff *napi_get_frags(struct napi_struct *napi)
|
|
}
|
|
EXPORT_SYMBOL(napi_get_frags);
|
|
|
|
-int napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb,
|
|
- gro_result_t ret)
|
|
+gro_result_t napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb,
|
|
+ gro_result_t ret)
|
|
{
|
|
- int err = NET_RX_SUCCESS;
|
|
-
|
|
switch (ret) {
|
|
case GRO_NORMAL:
|
|
case GRO_HELD:
|
|
skb->protocol = eth_type_trans(skb, skb->dev);
|
|
|
|
- if (ret == GRO_NORMAL)
|
|
- return netif_receive_skb(skb);
|
|
-
|
|
- skb_gro_pull(skb, -ETH_HLEN);
|
|
+ if (ret == GRO_HELD)
|
|
+ skb_gro_pull(skb, -ETH_HLEN);
|
|
+ else if (netif_receive_skb(skb))
|
|
+ ret = GRO_DROP;
|
|
break;
|
|
|
|
case GRO_DROP:
|
|
- err = NET_RX_DROP;
|
|
- /* fall through */
|
|
-
|
|
case GRO_MERGED_FREE:
|
|
napi_reuse_skb(napi, skb);
|
|
break;
|
|
@@ -2685,7 +2677,7 @@ int napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb,
|
|
break;
|
|
}
|
|
|
|
- return err;
|
|
+ return ret;
|
|
}
|
|
EXPORT_SYMBOL(napi_frags_finish);
|
|
|
|
@@ -2726,12 +2718,12 @@ out:
|
|
}
|
|
EXPORT_SYMBOL(napi_frags_skb);
|
|
|
|
-int napi_gro_frags(struct napi_struct *napi)
|
|
+gro_result_t napi_gro_frags(struct napi_struct *napi)
|
|
{
|
|
struct sk_buff *skb = napi_frags_skb(napi);
|
|
|
|
if (!skb)
|
|
- return NET_RX_DROP;
|
|
+ return GRO_DROP;
|
|
|
|
return napi_frags_finish(napi, skb, __napi_gro_receive(napi, skb));
|
|
}
|
|
--
|
|
1.6.5.4
|
|
|