2023-08-09 19:48:57

by Tahsin Erdogan

[permalink] [raw]
Subject: [PATCH v4] tun: avoid high-order page allocation for packet header

When gso.hdr_len is zero and a packet is transmitted via write() or
writev(), all payload is treated as header which requires a contiguous
memory allocation. This allocation request is harder to satisfy, and may
even fail if there is enough fragmentation.

Note that sendmsg() code path limits the linear copy length, so this change
makes write()/writev() and sendmsg() paths more consistent.

Signed-off-by: Tahsin Erdogan <[email protected]>
---
v4: updated commit message address comments from Willem
v3: rebase to latest net-next
v2: replace linear == 0 with !linear
v1: https://lore.kernel.org/all/[email protected]/
drivers/net/tun.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 973b2fc74de3..62106464f1b9 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1523,7 +1523,7 @@ static struct sk_buff *tun_alloc_skb(struct tun_file *tfile,
int err;

/* Under a page? Don't bother with paged skb. */
- if (prepad + len < PAGE_SIZE || !linear)
+ if (prepad + len < PAGE_SIZE)
linear = len;

if (len - linear > MAX_SKB_FRAGS * (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER))
@@ -1840,6 +1840,9 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
*/
zerocopy = false;
} else {
+ if (!linear)
+ linear = min_t(size_t, good_linear, copylen);
+
skb = tun_alloc_skb(tfile, align, copylen, linear,
noblock);
}
--
2.41.0



2023-08-10 04:56:54

by Jason Wang

[permalink] [raw]
Subject: Re: [PATCH v4] tun: avoid high-order page allocation for packet header

On Thu, Aug 10, 2023 at 12:48 AM Tahsin Erdogan <[email protected]> wrote:
>
> When gso.hdr_len is zero and a packet is transmitted via write() or
> writev(), all payload is treated as header which requires a contiguous
> memory allocation. This allocation request is harder to satisfy, and may
> even fail if there is enough fragmentation.
>
> Note that sendmsg() code path limits the linear copy length, so this change
> makes write()/writev() and sendmsg() paths more consistent.
>
> Signed-off-by: Tahsin Erdogan <[email protected]>
> ---
> v4: updated commit message address comments from Willem
> v3: rebase to latest net-next
> v2: replace linear == 0 with !linear
> v1: https://lore.kernel.org/all/[email protected]/

Acked-by: Jason Wang <[email protected]>

Thanks


2023-08-10 07:43:17

by Eric Dumazet

[permalink] [raw]
Subject: Re: [PATCH v4] tun: avoid high-order page allocation for packet header

On Wed, Aug 9, 2023 at 6:48 PM Tahsin Erdogan <[email protected]> wrote:
>
> When gso.hdr_len is zero and a packet is transmitted via write() or
> writev(), all payload is treated as header which requires a contiguous
> memory allocation. This allocation request is harder to satisfy, and may
> even fail if there is enough fragmentation.
>
> Note that sendmsg() code path limits the linear copy length, so this change
> makes write()/writev() and sendmsg() paths more consistent.
>
> Signed-off-by: Tahsin Erdogan <[email protected]>

Reviewed-by: Eric Dumazet <[email protected]>

Thanks.

2023-08-10 15:42:14

by Willem de Bruijn

[permalink] [raw]
Subject: Re: [PATCH v4] tun: avoid high-order page allocation for packet header

Tahsin Erdogan wrote:
> When gso.hdr_len is zero and a packet is transmitted via write() or
> writev(), all payload is treated as header which requires a contiguous
> memory allocation. This allocation request is harder to satisfy, and may
> even fail if there is enough fragmentation.
>
> Note that sendmsg() code path limits the linear copy length, so this change
> makes write()/writev() and sendmsg() paths more consistent.
>
> Signed-off-by: Tahsin Erdogan <[email protected]>

Reviewed-by: Willem de Bruijn <[email protected]>


2023-08-11 03:10:58

by patchwork-bot+netdevbpf

[permalink] [raw]
Subject: Re: [PATCH v4] tun: avoid high-order page allocation for packet header

Hello:

This patch was applied to netdev/net-next.git (main)
by Jakub Kicinski <[email protected]>:

On Wed, 9 Aug 2023 09:47:52 -0700 you wrote:
> When gso.hdr_len is zero and a packet is transmitted via write() or
> writev(), all payload is treated as header which requires a contiguous
> memory allocation. This allocation request is harder to satisfy, and may
> even fail if there is enough fragmentation.
>
> Note that sendmsg() code path limits the linear copy length, so this change
> makes write()/writev() and sendmsg() paths more consistent.
>
> [...]

Here is the summary with links:
- [v4] tun: avoid high-order page allocation for packet header
https://git.kernel.org/netdev/net-next/c/6231e47b6fad

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html