Skip to content

Commit

Permalink
gro: Move common completion code into helpers
Browse files Browse the repository at this point in the history
Currently VLAN still has a bit of common code handling the aftermath
of GRO that's shared with the common path.  This patch moves them
into shared helpers to reduce code duplication.

Signed-off-by: Herbert Xu <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
herbertx authored and davem330 committed Jan 30, 2009
1 parent 7019298 commit 5d0d9be
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 59 deletions.
3 changes: 3 additions & 0 deletions include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -1375,12 +1375,15 @@ extern int netif_receive_skb(struct sk_buff *skb);
extern void napi_gro_flush(struct napi_struct *napi);
extern int dev_gro_receive(struct napi_struct *napi,
struct sk_buff *skb);
extern int napi_skb_finish(int ret, struct sk_buff *skb);
extern int 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_fraginfo_skb(struct napi_struct *napi,
struct napi_gro_fraginfo *info);
extern int napi_frags_finish(struct napi_struct *napi,
struct sk_buff *skb, int ret);
extern int napi_gro_frags(struct napi_struct *napi,
struct napi_gro_fraginfo *info);
extern void netif_nit_deliver(struct sk_buff *skb);
Expand Down
39 changes: 4 additions & 35 deletions net/8021q/vlan_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,50 +98,19 @@ static int vlan_gro_common(struct napi_struct *napi, struct vlan_group *grp,
int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
unsigned int vlan_tci, struct sk_buff *skb)
{
int err = NET_RX_SUCCESS;

switch (vlan_gro_common(napi, grp, vlan_tci, skb)) {
case -1:
return netif_receive_skb(skb);

case 2:
err = NET_RX_DROP;
/* fall through */

case 1:
kfree_skb(skb);
break;
}

return err;
return napi_skb_finish(vlan_gro_common(napi, grp, vlan_tci, skb), skb);
}
EXPORT_SYMBOL(vlan_gro_receive);

int vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
unsigned int vlan_tci, struct napi_gro_fraginfo *info)
{
struct sk_buff *skb = napi_fraginfo_skb(napi, info);
int err = NET_RX_DROP;

if (!skb)
goto out;

err = NET_RX_SUCCESS;

switch (vlan_gro_common(napi, grp, vlan_tci, skb)) {
case -1:
return netif_receive_skb(skb);

case 2:
err = NET_RX_DROP;
/* fall through */

case 1:
napi_reuse_skb(napi, skb);
break;
}
return NET_RX_DROP;

out:
return err;
return napi_frags_finish(napi, skb,
vlan_gro_common(napi, grp, vlan_tci, skb));
}
EXPORT_SYMBOL(vlan_gro_frags);
76 changes: 52 additions & 24 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,14 @@
/* This should be increased if a protocol with a bigger head is added. */
#define GRO_MAX_HEAD (MAX_HEADER + 128)

enum {
GRO_MERGED,
GRO_MERGED_FREE,
GRO_HELD,
GRO_NORMAL,
GRO_DROP,
};

/*
* The list of packet types we will receive (as opposed to discard)
* and the routines to invoke.
Expand Down Expand Up @@ -2369,7 +2377,7 @@ int dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
int count = 0;
int same_flow;
int mac_len;
int free;
int ret;

if (!(skb->dev->features & NETIF_F_GRO))
goto normal;
Expand Down Expand Up @@ -2412,7 +2420,7 @@ int dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
goto normal;

same_flow = NAPI_GRO_CB(skb)->same_flow;
free = NAPI_GRO_CB(skb)->free;
ret = NAPI_GRO_CB(skb)->free ? GRO_MERGED_FREE : GRO_MERGED;

if (pp) {
struct sk_buff *nskb = *pp;
Expand All @@ -2435,12 +2443,13 @@ int dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
skb_shinfo(skb)->gso_size = skb->len;
skb->next = napi->gro_list;
napi->gro_list = skb;
ret = GRO_HELD;

ok:
return free;
return ret;

normal:
return -1;
return GRO_NORMAL;
}
EXPORT_SYMBOL(dev_gro_receive);

Expand All @@ -2456,18 +2465,30 @@ static int __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
return dev_gro_receive(napi, skb);
}

int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
int napi_skb_finish(int ret, struct sk_buff *skb)
{
switch (__napi_gro_receive(napi, skb)) {
case -1:
int err = NET_RX_SUCCESS;

switch (ret) {
case GRO_NORMAL:
return netif_receive_skb(skb);

case 1:
case GRO_DROP:
err = NET_RX_DROP;
/* fall through */

case GRO_MERGED_FREE:
kfree_skb(skb);
break;
}

return NET_RX_SUCCESS;
return err;
}
EXPORT_SYMBOL(napi_skb_finish);

int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
{
return napi_skb_finish(__napi_gro_receive(napi, skb), skb);
}
EXPORT_SYMBOL(napi_gro_receive);

Expand Down Expand Up @@ -2520,29 +2541,36 @@ struct sk_buff *napi_fraginfo_skb(struct napi_struct *napi,
}
EXPORT_SYMBOL(napi_fraginfo_skb);

int napi_gro_frags(struct napi_struct *napi, struct napi_gro_fraginfo *info)
int napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb, int ret)
{
struct sk_buff *skb = napi_fraginfo_skb(napi, info);
int err = NET_RX_DROP;

if (!skb)
goto out;
int err = NET_RX_SUCCESS;

err = NET_RX_SUCCESS;

switch (__napi_gro_receive(napi, skb)) {
case -1:
switch (ret) {
case GRO_NORMAL:
return netif_receive_skb(skb);

case 0:
goto out;
}
case GRO_DROP:
err = NET_RX_DROP;
/* fall through */

napi_reuse_skb(napi, skb);
case GRO_MERGED_FREE:
napi_reuse_skb(napi, skb);
break;
}

out:
return err;
}
EXPORT_SYMBOL(napi_frags_finish);

int napi_gro_frags(struct napi_struct *napi, struct napi_gro_fraginfo *info)
{
struct sk_buff *skb = napi_fraginfo_skb(napi, info);

if (!skb)
return NET_RX_DROP;

return napi_frags_finish(napi, skb, __napi_gro_receive(napi, skb));
}
EXPORT_SYMBOL(napi_gro_frags);

static int process_backlog(struct napi_struct *napi, int quota)
Expand Down

0 comments on commit 5d0d9be

Please sign in to comment.