Fix some minor TSO issues:
- Improve description of TSO limits. - Remove a not needed KASSERT() - Remove some not needed variable casts. Sponsored by: Mellanox Technologies Discussed with: lstewart @ MFC after: 1 week
This commit is contained in:
parent
00f22c06e8
commit
3c7c188c16
@ -717,13 +717,6 @@ if_attach_internal(struct ifnet *ifp, int vmove)
|
||||
ifp->if_hw_tsomaxsegsize);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* If the "if_hw_tsomax" limit is set, check if it is
|
||||
* too small:
|
||||
*/
|
||||
KASSERT(ifp->if_hw_tsomax == 0 ||
|
||||
ifp->if_hw_tsomax >= (IP_MAXPACKET / 8),
|
||||
("%s: if_hw_tsomax is outside of range", __func__));
|
||||
#endif
|
||||
}
|
||||
#ifdef VIMAGE
|
||||
|
@ -232,16 +232,24 @@ struct ifnet {
|
||||
counter_u64_t if_counters[IFCOUNTERS];
|
||||
|
||||
/* Stuff that's only temporary and doesn't belong here. */
|
||||
u_int if_hw_tsomax; /* TSO total burst length
|
||||
* limit in bytes. A value of
|
||||
* zero means no limit. Have
|
||||
* to find a better place for
|
||||
* it eventually. */
|
||||
|
||||
/*
|
||||
* TSO fields for segment limits. If a field below is zero,
|
||||
* there is no TSO segment limit.
|
||||
* Network adapter TSO limits:
|
||||
* ===========================
|
||||
*
|
||||
* If the "if_hw_tsomax" field is zero the maximum segment
|
||||
* length limit does not apply. If the "if_hw_tsomaxsegcount"
|
||||
* or the "if_hw_tsomaxsegsize" field is zero the TSO segment
|
||||
* count limit does not apply. If all three fields are zero,
|
||||
* there is no TSO limit.
|
||||
*
|
||||
* NOTE: The TSO limits only apply to the data payload part of
|
||||
* a TCP/IP packet. That means there is no need to subtract
|
||||
* space for ethernet-, vlan-, IP- or TCP- headers from the
|
||||
* TSO limits unless the hardware driver in question requires
|
||||
* so.
|
||||
*/
|
||||
u_int if_hw_tsomax; /* TSO maximum size in bytes */
|
||||
u_int if_hw_tsomaxsegcount; /* TSO maximum segment count */
|
||||
u_int if_hw_tsomaxsegsize; /* TSO maximum segment size in bytes */
|
||||
|
||||
|
@ -802,9 +802,9 @@ tcp_output(struct tcpcb *tp)
|
||||
max_len = (if_hw_tsomax - hdrlen);
|
||||
if (max_len <= 0) {
|
||||
len = 0;
|
||||
} else if (len > (u_int)max_len) {
|
||||
} else if (len > max_len) {
|
||||
sendalot = 1;
|
||||
len = (u_int)max_len;
|
||||
len = max_len;
|
||||
}
|
||||
}
|
||||
|
||||
@ -817,7 +817,7 @@ tcp_output(struct tcpcb *tp)
|
||||
max_len = 0;
|
||||
mb = sbsndmbuf(&so->so_snd, off, &moff);
|
||||
|
||||
while (mb != NULL && (u_int)max_len < len) {
|
||||
while (mb != NULL && max_len < len) {
|
||||
u_int mlen;
|
||||
u_int frags;
|
||||
|
||||
@ -851,9 +851,9 @@ tcp_output(struct tcpcb *tp)
|
||||
}
|
||||
if (max_len <= 0) {
|
||||
len = 0;
|
||||
} else if (len > (u_int)max_len) {
|
||||
} else if (len > max_len) {
|
||||
sendalot = 1;
|
||||
len = (u_int)max_len;
|
||||
len = max_len;
|
||||
}
|
||||
}
|
||||
|
||||
@ -864,7 +864,7 @@ tcp_output(struct tcpcb *tp)
|
||||
*/
|
||||
max_len = (tp->t_maxopd - optlen);
|
||||
if ((off + len) < so->so_snd.sb_cc) {
|
||||
moff = len % (u_int)max_len;
|
||||
moff = len % max_len;
|
||||
if (moff != 0) {
|
||||
len -= moff;
|
||||
sendalot = 1;
|
||||
@ -875,8 +875,8 @@ tcp_output(struct tcpcb *tp)
|
||||
* In case there are too many small fragments
|
||||
* don't use TSO:
|
||||
*/
|
||||
if (len <= (u_int)max_len) {
|
||||
len = (u_int)max_len;
|
||||
if (len <= max_len) {
|
||||
len = max_len;
|
||||
sendalot = 1;
|
||||
tso = 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user