Commit 86cac58b authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

skge: add GRO support

- napi_gro_flush() is exported from net/core/dev.c, to avoid
  an irq_save/irq_restore in the packet receive path.
- use napi_gro_receive() instead of netif_receive_skb()
- use napi_gro_flush() before calling __napi_complete()
- turn on NETIF_F_GRO by default
- Tested on a Marvell 88E8001 Gigabit NIC
Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent aed5029e
...@@ -3178,8 +3178,7 @@ static int skge_poll(struct napi_struct *napi, int to_do) ...@@ -3178,8 +3178,7 @@ static int skge_poll(struct napi_struct *napi, int to_do)
skb = skge_rx_get(dev, e, control, rd->status, rd->csum2); skb = skge_rx_get(dev, e, control, rd->status, rd->csum2);
if (likely(skb)) { if (likely(skb)) {
netif_receive_skb(skb); napi_gro_receive(napi, skb);
++work_done; ++work_done;
} }
} }
...@@ -3192,6 +3191,7 @@ static int skge_poll(struct napi_struct *napi, int to_do) ...@@ -3192,6 +3191,7 @@ static int skge_poll(struct napi_struct *napi, int to_do)
if (work_done < to_do) { if (work_done < to_do) {
unsigned long flags; unsigned long flags;
napi_gro_flush(napi);
spin_lock_irqsave(&hw->hw_lock, flags); spin_lock_irqsave(&hw->hw_lock, flags);
__napi_complete(napi); __napi_complete(napi);
hw->intr_mask |= napimask[skge->port]; hw->intr_mask |= napimask[skge->port];
...@@ -3849,6 +3849,7 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port, ...@@ -3849,6 +3849,7 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port,
dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG; dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
skge->rx_csum = 1; skge->rx_csum = 1;
} }
dev->features |= NETIF_F_GRO;
/* read the mac address */ /* read the mac address */
memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port*8, ETH_ALEN); memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port*8, ETH_ALEN);
......
...@@ -1702,6 +1702,7 @@ extern gro_result_t dev_gro_receive(struct napi_struct *napi, ...@@ -1702,6 +1702,7 @@ extern gro_result_t dev_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_skb_finish(gro_result_t ret, struct sk_buff *skb);
extern gro_result_t 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_gro_flush(struct napi_struct *napi);
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);
......
...@@ -3063,7 +3063,7 @@ static int napi_gro_complete(struct sk_buff *skb) ...@@ -3063,7 +3063,7 @@ static int napi_gro_complete(struct sk_buff *skb)
return netif_receive_skb(skb); return netif_receive_skb(skb);
} }
static void napi_gro_flush(struct napi_struct *napi) inline void napi_gro_flush(struct napi_struct *napi)
{ {
struct sk_buff *skb, *next; struct sk_buff *skb, *next;
...@@ -3076,6 +3076,7 @@ static void napi_gro_flush(struct napi_struct *napi) ...@@ -3076,6 +3076,7 @@ static void napi_gro_flush(struct napi_struct *napi)
napi->gro_count = 0; napi->gro_count = 0;
napi->gro_list = NULL; napi->gro_list = NULL;
} }
EXPORT_SYMBOL(napi_gro_flush);
enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb) enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff *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