btrfs: calculate inline extent buffer page size based on page size
authorQu Wenruo <wqu@suse.com>
Wed, 2 Dec 2020 06:48:01 +0000 (14:48 +0800)
committerDavid Sterba <dsterba@suse.com>
Wed, 9 Dec 2020 18:16:10 +0000 (19:16 +0100)
Btrfs only support 64K as maximum node size, thus for 4K page system, we
would have at most 16 pages for one extent buffer.

For a system using 64K page size, we would really have just one page.

While we always use 16 pages for extent_buffer::pages, this means for
systems using 64K pages, we are wasting memory for 15 page pointers
which will never be used.

Calculate the array size based on page size and the node size maximum.

- for systems using 4K page size, it will stay 16 pages
- for systems using 64K page size, it will be 1 page

Move the definition of BTRFS_MAX_METADATA_BLOCKSIZE to btrfs_tree.h, to
avoid circular inclusion of ctree.h.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ctree.h
fs/btrfs/extent_io.c
fs/btrfs/extent_io.h
include/uapi/linux/btrfs_tree.h

index 112c9a2ae47b534ffd09870d25c05ffd3ee114d6..c5ef2907895455d0725d2131fa578474032a1c6e 100644 (file)
@@ -67,12 +67,6 @@ struct btrfs_ref;
 
 #define BTRFS_OLDEST_GENERATION        0ULL
 
-/*
- * the max metadata block size.  This limit is somewhat artificial,
- * but the memmove costs go through the roof for larger blocks.
- */
-#define BTRFS_MAX_METADATA_BLOCKSIZE 65536
-
 /*
  * we can actually store much bigger names, but lets not confuse the rest
  * of linux
index e70d6944d0755baaafdaa4417c43f036a39c7f79..86b2a483c1ab8b62edf6589d15902afba3e8b97c 100644 (file)
@@ -5053,12 +5053,7 @@ __alloc_extent_buffer(struct btrfs_fs_info *fs_info, u64 start,
        atomic_set(&eb->refs, 1);
        atomic_set(&eb->io_pages, 0);
 
-       /*
-        * Sanity checks, currently the maximum is 64k covered by 16x 4k pages
-        */
-       BUILD_BUG_ON(BTRFS_MAX_METADATA_BLOCKSIZE
-               > MAX_INLINE_EXTENT_BUFFER_SIZE);
-       BUG_ON(len > MAX_INLINE_EXTENT_BUFFER_SIZE);
+       ASSERT(len <= BTRFS_MAX_METADATA_BLOCKSIZE);
 
        return eb;
 }
index 16f2ce5cd8ed8bbb9fed2655ef95a025c04e580b..77f2211550e3b7136768c739795a8cf021e700dc 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/rbtree.h>
 #include <linux/refcount.h>
 #include <linux/fiemap.h>
+#include <linux/btrfs_tree.h>
 #include "ulist.h"
 
 /*
@@ -74,8 +75,7 @@ typedef blk_status_t (submit_bio_hook_t)(struct inode *inode, struct bio *bio,
 typedef blk_status_t (extent_submit_bio_start_t)(struct inode *inode,
                struct bio *bio, u64 dio_file_offset);
 
-#define INLINE_EXTENT_BUFFER_PAGES 16
-#define MAX_INLINE_EXTENT_BUFFER_SIZE (INLINE_EXTENT_BUFFER_PAGES * PAGE_SIZE)
+#define INLINE_EXTENT_BUFFER_PAGES     (BTRFS_MAX_METADATA_BLOCKSIZE / PAGE_SIZE)
 struct extent_buffer {
        u64 start;
        unsigned long len;
index 6b885982ece68775a97941b5b495d5b551609d2e..58d7cff9afb17f8d79ed2b7f927a0fac4d996ddc 100644 (file)
  */
 #define BTRFS_STRING_ITEM_KEY  253
 
-
+/* Maximum metadata block size (nodesize) */
+#define BTRFS_MAX_METADATA_BLOCKSIZE                   65536
 
 /* 32 bytes in various csum fields */
 #define BTRFS_CSUM_SIZE 32