tun: use netdev_alloc_frag() in tun_napi_alloc_frags()
Subsystems (3)
PATCH 1/1 tun: use netdev_alloc_frag() in tun_napi_alloc_frags()
In order to cook skbs in the same way than Ethernet drivers, it is probably better to not use GFP_KERNEL, but rather use the GFP_ATOMIC and PFMEMALLOC mechanisms provided by netdev_alloc_frag().
This would allow to use tun driver even in memory stress situations, especially if swap is used over this tun channel.
--- drivers/net/tun.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
drivers/net/tun.c +7 -8
@@ -1478,23 +1478,22 @@ static struct sk_buff *tun_napi_alloc_frags(struct tun_file *tfile, skb->truesize += skb->data_len;for (i =1 ; i < it->nr_segs; i++) { -struct page_frag *pfrag = ¤t->task_frag;size_t fragsz = it->iov[i].iov_len; +struct page *page; +void *frag;if (fragsz ==0 || fragsz >PAGE_SIZE ) { err = -EINVAL ; goto free; } - -if (!skb_page_frag_refill (fragsz, pfrag,GFP_KERNEL )) { + frag =netdev_alloc_frag (fragsz); +if (!frag) { err = -ENOMEM ; goto free; } - -skb_fill_page_desc (skb, i -1 , pfrag->page, - pfrag->offset, fragsz); -page_ref_inc (pfrag->page); - pfrag->offset += fragsz; + page =virt_to_head_page (frag); +skb_fill_page_desc (skb, i -1 , page, + frag -page_address (page), fragsz); }return skb;
Signature · 1 line
2.19.1.1215.g8438c0b245-goog
From: Eric Dumazet <[email protected]>
Date: Sun, 18 Nov 2018 07:37:33 -0800
Quoted 10 lines
In order to cook skbs in the same way than Ethernet drivers, it is probably better to not use
GFP_KERNEL, but rather use theGFP_ATOMICand PFMEMALLOC mechanisms provided bynetdev_alloc_frag().This would allow to use tun driver even in memory stress situations, especially if swap is used over this tun channel.
Fixes 90e33d459407 ("tun: enable napi_gro_frags() for TUN/TAP driver")Signed-off-by Eric Dumazet <[email protected]>
Applied.