RE: [net] e1000: Small packets may get corrupted during padding by HW
From: Dave, Tushar N <hidden>
Date: 2012-09-16 01:25:47
-----Original Message----- From: Michał Mirosław [mailto:mirqus@gmail.com] Sent: Saturday, September 15, 2012 1:45 PM To: Kirsher, Jeffrey T Cc: davem@davemloft.net; Dave, Tushar N; netdev@vger.kernel.org; gospo@redhat.com; sassmann@redhat.com Subject: Re: [net] e1000: Small packets may get corrupted during padding by HW 2012/9/15 Jeff Kirsher [off-list ref]:quoted
From: Tushar Dave <redacted> On PCI/PCI-X HW, if packet size is less than ETH_ZLEN, packets may get corrupted during padding by HW. To WA this issue, pad all small packets manually. Signed-off-by: Tushar Dave <redacted> Tested-by: Aaron Brown <redacted> Signed-off-by: Jeff Kirsher <redacted> --- drivers/net/ethernet/intel/e1000/e1000_main.c | 11 +++++++++++ 1 file changed, 11 insertions(+)diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.cb/drivers/net/ethernet/intel/e1000/e1000_main.c index 3bfbb8d..bde337e 100644--- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c@@ -3149,6 +3149,17 @@ static netdev_tx_t e1000_xmit_frame(structsk_buff *skb,quoted
return NETDEV_TX_OK; } + /* On PCI/PCI-X HW, if packet size is less than ETH_ZLEN, + * packets may get corrupted during padding by HW. + * To WA this issue, pad all small packets manually. + */ + if (skb->len < ETH_ZLEN) { + if (skb_pad(skb, ETH_ZLEN - skb->len)) + return NETDEV_TX_OK; + skb->len = ETH_ZLEN; + skb_set_tail_pointer(skb, ETH_ZLEN); + } +Isn't there a skb_padto() that does just this?
Skb_padto calls skb_pad(). Calling skb_pad directly saves some cycles.