From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Fastabend Subject: Re: [net] e1000: Small packets may get corrupted during padding by HW Date: Sat, 15 Sep 2012 19:30:47 -0700 Message-ID: <505539D7.1010906@intel.com> References: <1347740217-10257-1-git-send-email-jeffrey.t.kirsher@intel.com> <061C8A8601E8EE4CA8D8FD6990CEA89130DC20AA@ORSMSX102.amr.corp.intel.com> <50552FF1.5030708@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: Michal Miroslaw , "Kirsher, Jeffrey T" , "davem@davemloft.net" , "netdev@vger.kernel.org" , "gospo@redhat.com" , "sassmann@redhat.com" To: "Dave, Tushar N" Return-path: Received: from mga11.intel.com ([192.55.52.93]:50247 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750740Ab2IPCax (ORCPT ); Sat, 15 Sep 2012 22:30:53 -0400 In-Reply-To: <50552FF1.5030708@intel.com> Sender: netdev-owner@vger.kernel.org List-ID: On 9/15/2012 6:48 PM, John Fastabend wrote: > On 9/15/2012 6:25 PM, Dave, Tushar N wrote: >>> -----Original Message----- >>> From: Micha=B3 Miros=B3aw [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 pa= dding >>> by HW >>> >>> 2012/9/15 Jeff Kirsher : >>>> From: Tushar Dave >>>> >>>> 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 >>>> Tested-by: Aaron Brown >>>> Signed-off-by: Jeff Kirsher >>>> --- >>>> drivers/net/ethernet/intel/e1000/e1000_main.c | 11 +++++++++++ >>>> 1 file changed, 11 insertions(+) >>>> >>>> diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c >>>> b/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(struct >>> sk_buff *skb, >>>> 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 =3D 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 cycle= s. >> > > How/where? > OK maybe you avoid an if case.