[PATCH v2 net-next 1/2] net: tipc: fix FB_MTU eat two pages
From: <hidden>
Date: 2021-06-09 10:34:43
Also in:
lkml
Subsystem:
networking [general], the rest, tipc network layer · Maintainers:
"David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds, Jon Maloy, Tung Quang Nguyen
From: Menglong Dong <redacted>
FB_MTU is used in 'tipc_msg_build()' to alloc smaller skb when memory
allocation fails, which can avoid unnecessary sending failures.
The value of FB_MTU now is 3744, and the data size will be:
(3744 + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) + \
SKB_DATA_ALIGN(BUF_HEADROOM + BUF_TAILROOM + 3))
which is larger than one page(4096), and two pages will be allocated.
To avoid it, replace '3744' with a calculation:
FB_MTU = (PAGE_SIZE - SKB_DATA_ALIGN(sizeof(struct skb_shared_info))
- SKB_DATA_ALIGN(BUF_HEADROOM + BUF_TAILROOM))
What's more, alloc_skb_fclone() will call SKB_DATA_ALIGN for data size,
and it's not unnecessary to make alignment for buf_size in
tipc_buf_acquire(). So, just remove it.
Fixes: 4c94cc2d3d57 ("tipc: fall back to smaller MTU if allocation of local send skb fails")
Reported-by: Zeal Robot <redacted>
Signed-off-by: Menglong Dong <redacted>
---
V2:
- define FB_MTU in msg.c instead of introduce a new file
- remove align for buf_size in tipc_buf_acquire()
---
net/tipc/bcast.c | 2 +-
net/tipc/msg.c | 15 ++++++++-------
net/tipc/msg.h | 3 ++-
3 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index d4beca895992..9daace9542f4 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c@@ -699,7 +699,7 @@ int tipc_bcast_init(struct net *net) spin_lock_init(&tipc_net(net)->bclock); if (!tipc_link_bc_create(net, 0, 0, NULL, - FB_MTU, + fb_mtu, BCLINK_WIN_DEFAULT, BCLINK_WIN_DEFAULT, 0,
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index ce6ab54822d8..a5c030ca7065 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c@@ -47,8 +47,14 @@ #define BUF_TAILROOM (TIPC_AES_GCM_TAG_SIZE) #else #define BUF_HEADROOM (LL_MAX_HEADER + 48) -#define BUF_TAILROOM 16 +#define BUF_TAILROOM 0 #endif +#define FB_MTU (PAGE_SIZE - \ + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) - \ + SKB_DATA_ALIGN(BUF_HEADROOM + BUF_TAILROOM) \ + ) + +const int fb_mtu = FB_MTU; static unsigned int align(unsigned int i) {
@@ -69,13 +75,8 @@ static unsigned int align(unsigned int i) struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp) { struct sk_buff *skb; -#ifdef CONFIG_TIPC_CRYPTO - unsigned int buf_size = (BUF_HEADROOM + size + BUF_TAILROOM + 3) & ~3u; -#else - unsigned int buf_size = (BUF_HEADROOM + size + 3) & ~3u; -#endif - skb = alloc_skb_fclone(buf_size, gfp); + skb = alloc_skb_fclone(BUF_HEADROOM + size + BUF_TAILROOM, gfp); if (skb) { skb_reserve(skb, BUF_HEADROOM); skb_put(skb, size);
diff --git a/net/tipc/msg.h b/net/tipc/msg.h
index 5d64596ba987..2c214691037c 100644
--- a/net/tipc/msg.h
+++ b/net/tipc/msg.h@@ -99,9 +99,10 @@ struct plist; #define MAX_H_SIZE 60 /* Largest possible TIPC header size */ #define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE) -#define FB_MTU 3744 #define TIPC_MEDIA_INFO_OFFSET 5 +extern const int fb_mtu; + struct tipc_skb_cb { union { struct {
--
2.32.0