Skip to content

Commit 12f6119

Browse files
sagigrimberggregkh
authored andcommitted
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 b368762 commit 12f6119

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

net/core/datagram.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -434,15 +434,22 @@ static int __skb_datagram_iter(const struct sk_buff *skb, int offset,
434434

435435
end = start + skb_frag_size(frag);
436436
if ((copy = end - offset) > 0) {
437-
struct page *page = skb_frag_page(frag);
438-
u8 *vaddr = kmap(page);
437+
u32 p_off, p_len, copied;
438+
struct page *p;
439+
u8 *vaddr;
439440

440441
if (copy > len)
441442
copy = len;
442-
n = INDIRECT_CALL_1(cb, simple_copy_to_iter,
443-
vaddr + skb_frag_off(frag) + offset - start,
444-
copy, data, to);
445-
kunmap(page);
443+
444+
skb_frag_foreach_page(frag,
445+
skb_frag_off(frag) + offset - start,
446+
copy, p, p_off, p_len, copied) {
447+
vaddr = kmap_local_page(p);
448+
n = INDIRECT_CALL_1(cb, simple_copy_to_iter,
449+
vaddr + p_off, p_len, data, to);
450+
kunmap_local(vaddr);
451+
}
452+
446453
offset += n;
447454
if (n != copy)
448455
goto short_copy;

0 commit comments

Comments
 (0)