From: Jon M. <jm...@re...> - 2021-06-18 12:49:00
|
On 6/18/21 2:57 AM, men...@gm... wrote: > From: Menglong Dong <don...@zt...> > > 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: > > (PAGE_SIZE - SKB_DATA_ALIGN(BUF_OVERHEAD) - \ > SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) > > What's more, alloc_skb_fclone() will call SKB_DATA_ALIGN for data size, > and it's not necessary 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") > > Signed-off-by: Menglong Dong <don...@zt...> > --- > V4: > - fallback to V2 > > V3: > - split tipc_msg_build to tipc_msg_build and tipc_msg_frag > - introduce tipc_buf_acquire_flex, which is able to alloc skb for > local message > - add the variate 'local' in tipc_msg_build to check if this is a > local message. > > 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 | 19 ++++++++++--------- > net/tipc/msg.h | 3 ++- > 3 files changed, 13 insertions(+), 11 deletions(-) > > diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c > index d4beca895992..593846d25214 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, > + one_page_mtu, > BCLINK_WIN_DEFAULT, > BCLINK_WIN_DEFAULT, > 0, > diff --git a/net/tipc/msg.c b/net/tipc/msg.c > index ce6ab54822d8..912d17b3fc01 100644 > --- a/net/tipc/msg.c > +++ b/net/tipc/msg.c > @@ -44,12 +44,17 @@ > #define MAX_FORWARD_SIZE 1024 > #ifdef CONFIG_TIPC_CRYPTO > #define BUF_HEADROOM ALIGN(((LL_MAX_HEADER + 48) + EHDR_MAX_SIZE), 16) > -#define BUF_TAILROOM (TIPC_AES_GCM_TAG_SIZE) > +#define BUF_OVERHEAD (BUF_HEADROOM + TIPC_AES_GCM_TAG_SIZE) > #else > #define BUF_HEADROOM (LL_MAX_HEADER + 48) > -#define BUF_TAILROOM 16 > +#define BUF_OVERHEAD BUF_HEADROOM > #endif > > +#define ONE_PAGE_SKB_SZ (PAGE_SIZE - SKB_DATA_ALIGN(BUF_OVERHEAD) - \ > + SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) > + I suggest one small simplification: Let's just skip this macro completely, and assign the calculation directly to one_page_mtu below. Otherwise: Acked-by: Jon Maloy <jm...@re...> > +const int one_page_mtu = ONE_PAGE_SKB_SZ; > + > static unsigned int align(unsigned int i) > { > return (i + 3) & ~3u; > @@ -69,13 +74,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_OVERHEAD + size, gfp); > if (skb) { > skb_reserve(skb, BUF_HEADROOM); > skb_put(skb, size); > @@ -395,7 +395,8 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m, int offset, > if (unlikely(!skb)) { > if (pktmax != MAX_MSG_SIZE) > return -ENOMEM; > - rc = tipc_msg_build(mhdr, m, offset, dsz, FB_MTU, list); > + rc = tipc_msg_build(mhdr, m, offset, dsz, > + ONE_PAGE_SKB_SZ, list); > if (rc != dsz) > return rc; > if (tipc_msg_assemble(list)) > diff --git a/net/tipc/msg.h b/net/tipc/msg.h > index 5d64596ba987..64ae4c4c44f8 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 one_page_mtu; > + > struct tipc_skb_cb { > union { > struct { |