Skip to contentSkip to conversation

tun: use netdev_alloc_frag() in tun_napi_alloc_frags()

PATCH Applied Eric Dumazet 2 participants 2 messages Nov 19, 2018

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

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.

Fixes 90e33d459407 ("tun: enable napi_gro_frags() for TUN/TAP driver")
Cc Petar Penkov <[email protected]>
Cc Mahesh Bandewar <[email protected]>
Cc Willem de Bruijn <[email protected]>
---
 drivers/net/tun.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)
drivers/net/tun.c +7 -8
index 36163a147d3950a5d7451abed96809c2af7c322f..1e9da697081d10e086a26deb1ab38e62f77436b5 100644
@@ -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 = &current->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
maintainer Applied
#1 lore raw

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 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.

Fixes 90e33d459407 ("tun: enable napi_gro_frags() for TUN/TAP driver")

Applied.