Skip to content

Commit f24803f

Browse files
sagigrimbergSasha Levin
authored and
Sasha Levin
committed
net: allow skb_datagram_iter to be called from any context
[ Upstream commit d2d30a3 ] We only use the mapping in a single context, so kmap_local is sufficient and cheaper. Make sure to use skb_frag_foreach_page as skb frags may contain compound pages and we need to map page by page. Reported-by: kernel test robot <[email protected]> Closes: https://lore.kernel.org/oe-lkp/[email protected] Fixes: 950fcae ("datagram: consolidate datagram copy to iter helpers") Signed-off-by: Sagi Grimberg <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent ea4f9fd commit f24803f

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

net/core/datagram.c

+13-6
Original file line numberDiff line numberDiff line change
@@ -440,15 +440,22 @@ static int __skb_datagram_iter(const struct sk_buff *skb, int offset,
440440

441441
end = start + skb_frag_size(frag);
442442
if ((copy = end - offset) > 0) {
443-
struct page *page = skb_frag_page(frag);
444-
u8 *vaddr = kmap(page);
443+
u32 p_off, p_len, copied;
444+
struct page *p;
445+
u8 *vaddr;
445446

446447
if (copy > len)
447448
copy = len;
448-
n = INDIRECT_CALL_1(cb, simple_copy_to_iter,
449-
vaddr + skb_frag_off(frag) + offset - start,
450-
copy, data, to);
451-
kunmap(page);
449+
450+
skb_frag_foreach_page(frag,
451+
skb_frag_off(frag) + offset - start,
452+
copy, p, p_off, p_len, copied) {
453+
vaddr = kmap_local_page(p);
454+
n = INDIRECT_CALL_1(cb, simple_copy_to_iter,
455+
vaddr + p_off, p_len, data, to);
456+
kunmap_local(vaddr);
457+
}
458+
452459
offset += n;
453460
if (n != copy)
454461
goto short_copy;

0 commit comments

Comments
 (0)