On 6/18/21 2:57 AM, menglong8.d...@gmail.com wrote:
From: Menglong Dong <dong.mengl...@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:

   (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 <dong.mengl...@zte.com.cn>
---
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 <jma...@redhat.com>

+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 {



_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to