Messages in this thread Patch in this message | | | From | menglong8.dong@gmail ... | Subject | [PATCH v2 net-next 1/2] net: tipc: fix FB_MTU eat two pages | Date | Wed, 9 Jun 2021 18:32:50 +0800 |
| |
From: Menglong Dong <dong.menglong@zte.com.cn>
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 <zealci@zte.com.cn> Signed-off-by: Menglong Dong <dong.menglong@zte.com.cn> --- 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
| |