For NFS mounts using rsize,wsize=65536 over TSO enabled
network interfaces limited to 32 transmit segments, there are two known issues. The more serious one is that for an I/O of slightly less than 64K, the net device driver prepends an ethernet header, resulting in a TSO segment slightly larger than 64K. Since m_defrag() copies this into 33 mbuf clusters, the transmit fails with EFBIG. A tester indicated observing a similar failure using iSCSI. The second less critical problem is that the network device driver must copy the mbuf chain via m_defrag() (m_collapse() is not sufficient), resulting in measurable overhead. This patch reduces the default size of if_hw_tsomax slightly, so that the first issue is avoided. Fixing the second issue will require a way for the network device driver to inform tcp_output() that it is limited to 32 transmit segments. Reported and tested by: csforgeron@gmail.com, markus.gebert@hostpoint.ch MFC after: 2 weeks
This commit is contained in:
parent
edc63b46e0
commit
209579aeac
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=264630
@ -74,6 +74,7 @@
|
||||
#include <net/vnet.h>
|
||||
|
||||
#if defined(INET) || defined(INET6)
|
||||
#include <net/ethernet.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/in_var.h>
|
||||
#include <netinet/ip.h>
|
||||
@ -655,7 +656,8 @@ if_attach_internal(struct ifnet *ifp, int vmove)
|
||||
#if defined(INET) || defined(INET6)
|
||||
/* Initialize to max value. */
|
||||
if (ifp->if_hw_tsomax == 0)
|
||||
ifp->if_hw_tsomax = IP_MAXPACKET;
|
||||
ifp->if_hw_tsomax = min(IP_MAXPACKET, 32 * MCLBYTES -
|
||||
(ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN));
|
||||
KASSERT(ifp->if_hw_tsomax <= IP_MAXPACKET &&
|
||||
ifp->if_hw_tsomax >= IP_MAXPACKET / 8,
|
||||
("%s: tsomax outside of range", __func__));
|
||||
|
Loading…
Reference in New Issue
Block a user