diff options
author | Rajan Gupta <rajan.gupta@freescale.com> | 2013-05-25 01:29:48 (GMT) |
---|---|---|
committer | Fleming Andrew-AFLEMING <AFLEMING@freescale.com> | 2013-05-28 18:59:51 (GMT) |
commit | c8a2d92fef102e1c03155d6554023b7a58781b28 (patch) | |
tree | be3f774600678cc9fc6681402de63ea031040784 /drivers | |
parent | a07349fdfe45486050fbebebb54d002561f8a709 (diff) | |
download | linux-fsl-qoriq-c8a2d92fef102e1c03155d6554023b7a58781b28.tar.xz |
gianfar: asf: optimizations for ASF IPsec forwarding
Patch optimizes the skb clean up for packets processed by ASF IPsec
by using gfar_asf_reclaim_skb() instead of skb_recycle(). Patch also
re-cycles the SKB after DMA to eTsec, instead of recycling it when the
TX BD is used next time.
Change-Id: Iaa396ee2ac89a1ee8b5e8434870481f18674a6d9
Signed-off-by: Rajan Gupta <rajan.gupta@freescale.com>
Reviewed-on: http://git.am.freescale.net:8181/2713
Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com>
Reviewed-by: Manoil Claudiu-B08782 <claudiu.manoil@freescale.com>
Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/freescale/gianfar.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index f68940b..a53231c 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c @@ -2561,7 +2561,6 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) int i, rq = 0, do_tstamp = 0; u32 bufaddr; #ifdef CONFIG_RX_TX_BUFF_XCHG - struct sk_buff *new_skb; int skb_curtx = 0; #else unsigned long flags; @@ -2660,10 +2659,6 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) /* BD is free to be used by s/w */ /* Free skb for this BD if not recycled */ - if (tx_queue->tx_skbuff[skb_curtx]) { - gfar_recycle_skb(priv, tx_queue->tx_skbuff[skb_curtx]); - tx_queue->tx_skbuff[skb_curtx] = NULL; - } txbdp->lstatus &= BD_LFLAG(TXBD_WRAP); skb_curtx = (skb_curtx + 1) @@ -2853,8 +2848,8 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) #ifdef CONFIG_RX_TX_BUFF_XCHG if ((skb->owner != RT_PKT_ID) || (!skb_is_recycleable(skb, DEFAULT_RX_BUFFER_SIZE + RXBUF_ALIGNMENT))) { - tx_queue->tx_skbuff[skb_curtx] = skb; skb->new_skb = NULL; + gfar_recycle_skb(priv, skb); } else { #ifdef CONFIG_AS_FASTPATH if (skb->pkt_type == PACKET_FASTROUTE) @@ -2885,7 +2880,6 @@ int gfar_fast_xmit(struct sk_buff *skb, struct net_device *dev) u32 lstatus; int rq = 0; #ifdef CONFIG_RX_TX_BUFF_XCHG - struct sk_buff *new_skb; int skb_curtx = 0; #else unsigned long flags; @@ -2934,11 +2928,6 @@ int gfar_fast_xmit(struct sk_buff *skb, struct net_device *dev) /* BD is free to be used by s/w */ /* Free skb for this BD if not recycled */ - if (tx_queue->tx_skbuff[skb_curtx]) { - gfar_recycle_skb(priv, tx_queue->tx_skbuff[skb_curtx]); - tx_queue->tx_skbuff[skb_curtx] = NULL; - } - txbdp->lstatus &= BD_LFLAG(TXBD_WRAP); #endif /* Update transmit stats */ @@ -3027,8 +3016,8 @@ int gfar_fast_xmit(struct sk_buff *skb, struct net_device *dev) #ifdef CONFIG_RX_TX_BUFF_XCHG if ((skb->owner != RT_PKT_ID) || (!skb_is_recycleable(skb, DEFAULT_RX_BUFFER_SIZE + RXBUF_ALIGNMENT))) { - tx_queue->tx_skbuff[skb_curtx] = skb; skb->new_skb = NULL; + gfar_recycle_skb(priv, skb); } else { gfar_asf_reclaim_skb(skb); gfar_align_skb(skb); @@ -3245,6 +3234,11 @@ static void gfar_recycle_skb(struct gfar_private *priv, struct sk_buff *skb) if (likely(skb_queue_len(&local->recycle_q) < GFAR_RECYCLE_MAX)) { local->recycle_cnt++; +#ifdef CONFIG_AS_FASTPATH + if (skb->pkt_type == PACKET_FASTROUTE) + gfar_asf_reclaim_skb(skb); + else +#endif skb_recycle(skb); gfar_align_skb(skb); |