]> git.baikalelectronics.ru Git - kernel.git/commit
vmxnet3: cap copy length at size of skb to prevent dropped frames on tx
authorNeil Horman <nhorman@tuxdriver.com>
Thu, 16 Feb 2012 01:48:56 +0000 (01:48 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 19 Feb 2012 23:57:51 +0000 (18:57 -0500)
commit0e7ca3bb9ad3fe469e2960e43d32a0af7c23d658
treee178f7d30f8c53f7e9ad139fc585d6038cc8314e
parent4c1068f0a76b0c96d70e94a745b3593609681f66
vmxnet3: cap copy length at size of skb to prevent dropped frames on tx

I was recently shown that vmxnet3 devices on transmit, will drop very small udp
frames consistently.  This is due to a regression introduced by commit
1cd1155ac769bc3be1877deb7240cf0639f11b7f.  This commit attempts to introduce an
optimization to the tx path, indicating that the underlying hardware behaves
optimally when at least 54 bytes of header data are available for direct access.
This causes problems however, if the entire frame is less than 54 bytes long.
The subsequent pskb_may_pull in vmxnet3_parse_and_copy_hdr fails, causing an
error return code, which leads to vmxnet3_tq_xmit dropping the frame.

Fix it by placing a cap on the copy length.  For frames longer than 54 bytes, we
do the pull as we normally would.  If the frame is shorter than that, copy the
whole frame, but no more.  This ensures that we still get the optimization for
qualifying frames, but don't do any damange for frames that are too short.

Also, since I'm unable to do this, it wuold be great if vmware could follow up
this patch with some additional code commentary as to why 54 bytes is an optimal
pull length for a virtual NIC driver.  The comment that introduced this was
vague on that.  Thanks!

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
Reported-by: Max Matveev <mmatveev@redhat.com>
CC: Max Matveev <mmatveev@redhat.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: Shreyas Bhatewara <sbhatewara@vmware.com>
CC: "VMware, Inc." <pv-drivers@vmware.com>
Signed-off-by: Shreyas N Bhatewara <sbhatewara@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vmxnet3/vmxnet3_drv.c