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:
committed by
David S. Miller
parent
5b252f0c2f
commit
c7c4b3b6e9
@ -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
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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,
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user