mirror of
https://github.com/torvalds/linux
synced 2026-07-21 17:50:43 +09:00
ipv4: account for fraggap on the paged allocation path
In __ip_append_data(), when the paged-allocation branch is taken,
alloclen and pagedlen are computed as
alloclen = fragheaderlen + transhdrlen;
pagedlen = datalen - transhdrlen;
datalen already includes fraggap, but the fraggap bytes carried over
from the previous skb are copied into the new skb's linear area at
offset transhdrlen by the subsequent skb_copy_and_csum_bits(). The
linear area is therefore undersized by fraggap bytes while pagedlen is
overstated by the same amount.
The non-paged branch sets alloclen to fraglen, which already accounts
for fraggap because datalen does. Bring the paged branch in line by
adding fraggap to alloclen and subtracting it from pagedlen.
After this adjustment, copy no longer collapses to -fraggap on the
paged path, so remove the stale comment describing that old arithmetic.
Fixes: 8eb77cc739 ("ipv4: avoid partial copy for zc")
Signed-off-by: Jungwoo Lee <jwlee2217@gmail.com>
Signed-off-by: Wongi Lee <qw3rtyp0@gmail.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Link: https://patch.msgid.link/ajFR1eLAIs42TN3g@DESKTOP-19IMU7U.localdomain
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
54704b32b2
commit
eca856950f
@@ -1116,8 +1116,8 @@ alloc_new_skb:
|
||||
!(rt->dst.dev->features & NETIF_F_SG)))
|
||||
alloclen = fraglen;
|
||||
else {
|
||||
alloclen = fragheaderlen + transhdrlen;
|
||||
pagedlen = datalen - transhdrlen;
|
||||
alloclen = fragheaderlen + transhdrlen + fraggap;
|
||||
pagedlen = datalen - transhdrlen - fraggap;
|
||||
}
|
||||
|
||||
alloclen += alloc_extra;
|
||||
@@ -1164,9 +1164,6 @@ alloc_new_skb:
|
||||
}
|
||||
|
||||
copy = datalen - transhdrlen - fraggap - pagedlen;
|
||||
/* [!] NOTE: copy will be negative if pagedlen>0
|
||||
* because then the equation reduces to -fraggap.
|
||||
*/
|
||||
if (copy > 0 &&
|
||||
INDIRECT_CALL_1(getfrag, ip_generic_getfrag,
|
||||
from, data + transhdrlen, offset,
|
||||
|
||||
Reference in New Issue
Block a user