diff options
author | Willem de Bruijn <willemb@google.com> | 2021-01-09 17:18:33 -0500 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2021-01-11 18:20:09 -0800 |
commit | 97550f6fa59254435d864b92603de3ca4b5a99f8 (patch) | |
tree | a2236300b4b899a2e4a34e73dffe85910f455faa /net/ipv6/proc.c | |
parent | 29766bcffad03da66892bef82674883e31f78fec (diff) |
net: compound page support in skb_seq_read
skb_seq_read iterates over an skb, returning pointer and length of
the next data range with each call.
It relies on kmap_atomic to access highmem pages when needed.
An skb frag may be backed by a compound page, but kmap_atomic maps
only a single page. There are not enough kmap slots to always map all
pages concurrently.
Instead, if kmap_atomic is needed, iterate over each page.
As this increases the number of calls, avoid this unless needed.
The necessary condition is captured in skb_frag_must_loop.
I tried to make the change as obvious as possible. It should be easy
to verify that nothing changes if skb_frag_must_loop returns false.
Tested:
On an x86 platform with
CONFIG_HIGHMEM=y
CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP=y
CONFIG_NETFILTER_XT_MATCH_STRING=y
Run
ip link set dev lo mtu 1500
iptables -A OUTPUT -m string --string 'badstring' -algo bm -j ACCEPT
dd if=/dev/urandom of=in bs=1M count=20
nc -l -p 8000 > /dev/null &
nc -w 1 -q 0 localhost 8000 < in
Signed-off-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net/ipv6/proc.c')
0 files changed, 0 insertions, 0 deletions