mbox series

[0/2] btrfs: support more pages sizes for the subpage support

Message ID 20220105022812.45698-1-wqu@suse.com (mailing list archive)
Headers show
Series btrfs: support more pages sizes for the subpage support | expand

Message

Qu Wenruo Jan. 5, 2022, 2:28 a.m. UTC
Previously we only support 64K page size with 4K sector size for subpage
support.

There are two reasons for such requirement:

- Make sure no matter what the nodesize is, metadata can be fit into one
  page
  This is to avoid multi-page metadata handling.

- We use u16 as bitmap
  That means we will waste extra memory for smaller page sizes.

The 2nd problem is already solved by compacting all bitmap into one
large bitmap, in commit 72a69cd03082 ("btrfs: subpage: pack all subpage
bitmaps into a larger bitmap").

And this patchset will address the first problem by going to non-subpage
routine if nodesize >= PAGE_SIZE.

This will still leave a small limitation, that for nodesize >= PAGE_SIZE
and sectorsize < PAGE_SIZE case, we can not allow a tree block to cross
page boundary.

Thankfully we have btrfs-check to detect such problem, and mkfs and
kernel chunk allocator have already ensured all our metadata will not
cross such page boundaries.

I have only tested the following combinations:

- aarch64 64K page size, 4K sectorsize, 64K nodesize
  To cover the new metadata path

- aarch64 64K page size, 4K sectorsize, 16K nodesize
- x86_64 4K page size, 4K sectorsize, 16K nodesize
  The make sure no new bugs in the old path

Unfortunately I don't have aarch64 platform which supports 16K page
size, thanks to Su Yue, he is doing the test on VM on Apple M1 chips,
and he didn't find new regressions.

Changelog:
RFC->v1:
- Remove one ASSERT() which is causing false alert
  As we have no way to distinguish unmapped extent buffer with anonymous
  page used by DIO/compression.

- Expand the subpage support to any PAGE_SIZE > 4K
  There is still a limitation on not allowing metadata block crossing page
  boundaries, but that should already be rare nowadays.

  Another limit is we still don't support 256K page size due to it's
  beyond max compressed extent size.

Qu Wenruo (2):
  btrfs: make nodesize >= PAGE_SIZE case to reuse the non-subpage
    routine
  btrfs: expand subpage support to any PAGE_SIZE > 4K

 fs/btrfs/disk-io.c   | 20 +++++++----
 fs/btrfs/extent_io.c | 80 ++++++++++++++++++++++++++------------------
 fs/btrfs/inode.c     |  2 +-
 fs/btrfs/subpage.c   | 30 ++++++++---------
 fs/btrfs/subpage.h   | 25 ++++++++++++++
 5 files changed, 102 insertions(+), 55 deletions(-)