gro: Change all receive functions to return GRO result codes

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>
This commit is contained in:
Ben Hutchings 2009-10-29 21:36:53 -07:00 committed by David S. Miller
parent 5b252f0c2f
commit c7c4b3b6e9
4 changed files with 42 additions and 45 deletions

View file

@ -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, extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
u16 vlan_tci, int polling); u16 vlan_tci, int polling);
extern int vlan_hwaccel_do_receive(struct sk_buff *skb); extern int vlan_hwaccel_do_receive(struct sk_buff *skb);
extern int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, extern gro_result_t
unsigned int vlan_tci, struct sk_buff *skb); vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
extern int vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, unsigned int vlan_tci, struct sk_buff *skb);
unsigned int vlan_tci); extern gro_result_t
vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
unsigned int vlan_tci);
#else #else
static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) 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; return 0;
} }
static inline int vlan_gro_receive(struct napi_struct *napi, static inline gro_result_t
struct vlan_group *grp, vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
unsigned int vlan_tci, struct sk_buff *skb) 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, static inline gro_result_t
struct vlan_group *grp, unsigned int vlan_tci) vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
unsigned int vlan_tci)
{ {
return NET_RX_DROP; return GRO_DROP;
} }
#endif #endif

View file

@ -1483,17 +1483,17 @@ extern int netif_receive_skb(struct sk_buff *skb);
extern void napi_gro_flush(struct napi_struct *napi); extern void napi_gro_flush(struct napi_struct *napi);
extern gro_result_t dev_gro_receive(struct napi_struct *napi, extern gro_result_t dev_gro_receive(struct napi_struct *napi,
struct sk_buff *skb); struct sk_buff *skb);
extern int napi_skb_finish(gro_result_t ret, struct sk_buff *skb); extern gro_result_t 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_gro_receive(struct napi_struct *napi,
struct sk_buff *skb); struct sk_buff *skb);
extern void napi_reuse_skb(struct napi_struct *napi, extern void napi_reuse_skb(struct napi_struct *napi,
struct sk_buff *skb); struct sk_buff *skb);
extern struct sk_buff * napi_get_frags(struct napi_struct *napi); 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, struct sk_buff *skb,
gro_result_t ret); gro_result_t ret);
extern struct sk_buff * napi_frags_skb(struct napi_struct *napi); 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) static inline void napi_free_frags(struct napi_struct *napi)
{ {

View file

@ -102,11 +102,12 @@ drop:
return GRO_DROP; return GRO_DROP;
} }
int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, gro_result_t vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
unsigned int vlan_tci, struct sk_buff *skb) unsigned int vlan_tci, struct sk_buff *skb)
{ {
if (netpoll_rx_on(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); 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); EXPORT_SYMBOL(vlan_gro_receive);
int vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, gro_result_t vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
unsigned int vlan_tci) unsigned int vlan_tci)
{ {
struct sk_buff *skb = napi_frags_skb(napi); struct sk_buff *skb = napi_frags_skb(napi);
if (!skb) if (!skb)
return NET_RX_DROP; return GRO_DROP;
if (netpoll_rx_on(skb)) { if (netpoll_rx_on(skb)) {
skb->protocol = eth_type_trans(skb, skb->dev); 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, return napi_frags_finish(napi, skb,

View file

@ -2586,18 +2586,15 @@ __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
return dev_gro_receive(napi, 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) { switch (ret) {
case GRO_NORMAL: case GRO_NORMAL:
return netif_receive_skb(skb); if (netif_receive_skb(skb))
ret = GRO_DROP;
break;
case GRO_DROP: case GRO_DROP:
err = NET_RX_DROP;
/* fall through */
case GRO_MERGED_FREE: case GRO_MERGED_FREE:
kfree_skb(skb); kfree_skb(skb);
break; break;
@ -2607,7 +2604,7 @@ int napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
break; break;
} }
return err; return ret;
} }
EXPORT_SYMBOL(napi_skb_finish); EXPORT_SYMBOL(napi_skb_finish);
@ -2627,7 +2624,7 @@ void skb_gro_reset_offset(struct sk_buff *skb)
} }
EXPORT_SYMBOL(skb_gro_reset_offset); 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); skb_gro_reset_offset(skb);
@ -2657,26 +2654,21 @@ struct sk_buff *napi_get_frags(struct napi_struct *napi)
} }
EXPORT_SYMBOL(napi_get_frags); EXPORT_SYMBOL(napi_get_frags);
int napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb, gro_result_t napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb,
gro_result_t ret) gro_result_t ret)
{ {
int err = NET_RX_SUCCESS;
switch (ret) { switch (ret) {
case GRO_NORMAL: case GRO_NORMAL:
case GRO_HELD: case GRO_HELD:
skb->protocol = eth_type_trans(skb, napi->dev); skb->protocol = eth_type_trans(skb, napi->dev);
if (ret == GRO_NORMAL) if (ret == GRO_HELD)
return netif_receive_skb(skb); skb_gro_pull(skb, -ETH_HLEN);
else if (netif_receive_skb(skb))
skb_gro_pull(skb, -ETH_HLEN); ret = GRO_DROP;
break; break;
case GRO_DROP: case GRO_DROP:
err = NET_RX_DROP;
/* fall through */
case GRO_MERGED_FREE: case GRO_MERGED_FREE:
napi_reuse_skb(napi, skb); napi_reuse_skb(napi, skb);
break; break;
@ -2685,7 +2677,7 @@ int napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb,
break; break;
} }
return err; return ret;
} }
EXPORT_SYMBOL(napi_frags_finish); EXPORT_SYMBOL(napi_frags_finish);
@ -2726,12 +2718,12 @@ out:
} }
EXPORT_SYMBOL(napi_frags_skb); 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); struct sk_buff *skb = napi_frags_skb(napi);
if (!skb) if (!skb)
return NET_RX_DROP; return GRO_DROP;
return napi_frags_finish(napi, skb, __napi_gro_receive(napi, skb)); return napi_frags_finish(napi, skb, __napi_gro_receive(napi, skb));
} }