Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: lpc_eth: free skbs in start_xmit

Transmitted skbs can be freed immediately in lpc_eth_hard_start_xmit()
instead of at TX completion, since driver copies the frames in DMA area.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Tested-by: Roland Stigge <stigge@antcom.de>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Eric Dumazet and committed by
David S. Miller
a7e2eaad 79504d70

+5 -6
+5 -6
drivers/net/ethernet/nxp/lpc_eth.c
··· 440 440 spinlock_t lock; 441 441 void __iomem *net_base; 442 442 u32 msg_enable; 443 - struct sk_buff *skb[ENET_TX_DESC]; 443 + unsigned int skblen[ENET_TX_DESC]; 444 444 unsigned int last_tx_idx; 445 445 unsigned int num_used_tx_buffs; 446 446 struct mii_bus *mii_bus; ··· 903 903 static void __lpc_handle_xmit(struct net_device *ndev) 904 904 { 905 905 struct netdata_local *pldat = netdev_priv(ndev); 906 - struct sk_buff *skb; 907 906 u32 txcidx, *ptxstat, txstat; 908 907 909 908 txcidx = readl(LPC_ENET_TXCONSUMEINDEX(pldat->net_base)); 910 909 while (pldat->last_tx_idx != txcidx) { 911 - skb = pldat->skb[pldat->last_tx_idx]; 910 + unsigned int skblen = pldat->skblen[pldat->last_tx_idx]; 912 911 913 912 /* A buffer is available, get buffer status */ 914 913 ptxstat = &pldat->tx_stat_v[pldat->last_tx_idx]; ··· 944 945 } else { 945 946 /* Update stats */ 946 947 ndev->stats.tx_packets++; 947 - ndev->stats.tx_bytes += skb->len; 948 + ndev->stats.tx_bytes += skblen; 948 949 } 949 - dev_kfree_skb_irq(skb); 950 950 951 951 txcidx = readl(LPC_ENET_TXCONSUMEINDEX(pldat->net_base)); 952 952 } ··· 1130 1132 memcpy(pldat->tx_buff_v + txidx * ENET_MAXF_SIZE, skb->data, len); 1131 1133 1132 1134 /* Save the buffer and increment the buffer counter */ 1133 - pldat->skb[txidx] = skb; 1135 + pldat->skblen[txidx] = len; 1134 1136 pldat->num_used_tx_buffs++; 1135 1137 1136 1138 /* Start transmit */ ··· 1145 1147 1146 1148 spin_unlock_irq(&pldat->lock); 1147 1149 1150 + dev_kfree_skb(skb); 1148 1151 return NETDEV_TX_OK; 1149 1152 } 1150 1153