On 2021/1/28 上午12:17, Josef Bacik wrote:
On 1/26/21 3:33 AM, Qu Wenruo wrote:
Patches can be fetched from github:
https://github.com/adam900710/linux/tree/subpage
Currently the branch also contains partial RW data support (still some
ordered extent and data csum mismatch problems)

Great thanks to David/Nikolay/Josef for their effort reviewing and
merging the preparation patches into misc-next.

=== What works ===
Just from the patchset:
- Data read
   Both regular and compressed data, with csum check.

- Metadata read

This means, with these patchset, 64K page systems can at least mount
btrfs with 4K sector size read-only.
This should provide the ability to migrate data at least.

While on the github branch, there are already experimental RW supports,
there are still ordered extent related bugs for me to fix.
Thus only the RO part is sent for review and testing.

=== Patchset structure ===
Patch 01~02:    Preparation patches which don't have functional change
Patch 03~12:    Subpage metadata allocation and freeing
Patch 13~15:    Subpage metadata read path
Patch 16~17:    Subpage data read path
Patch 18:    Enable subpage RO support

=== Changelog ===
v1:
- Separate the main implementation from previous huge patchset
   Huge patchset doesn't make much sense.

- Use bitmap implementation
   Now page::private will be a pointer to btrfs_subpage structure, which
   contains bitmaps for various page status.

v2:
- Use page::private as btrfs_subpage for extra info
   This replace old extent io tree based solution, which reduces latency
   and don't require memory allocation for its operations.

- Cherry-pick new preparation patches from RW development
   Those new preparation patches improves the readability by their own.

v3:
- Make dummy extent buffer to follow the same subpage accessors
   Fsstress exposed several ASSERT() for dummy extent buffers.
   It turns out we need to make dummy extent buffer to own the same
   btrfs_subpage structure to make eb accessors to work properly

- Two new small __process_pages_contig() related preparation patches
   One to make __process_pages_contig() to enhance the error handling
   path for locked_page, one to merge one macro.

- Extent buffers refs count update
   Except try_release_extent_buffer(), all other eb uses will try to
   increase the ref count of the eb.
   For try_release_extent_buffer(), the eb refs check will happen inside
   the rcu critical section to avoid eb being freed.

- Comment updates
   Addressing the comments from the mail list.

v4:
- Get rid of btrfs_subpage::tree_block_bitmap
   This is to reduce lock complexity (no need to bother extra subpage
   lock for metadata, all locks are existing locks)
   Now eb looking up mostly depends on radix tree, with small help from
   btrfs_subpage::under_alloc.
   Now I haven't experieneced metadata related problems any more during
   my local fsstress tests.

- Fix a race where metadata page dirty bit can race
   Fixed in the metadata RW patchset though.

- Rebased to latest misc-next branch
   With 4 patches removed, as they are already in misc-next.

v5:
- Use the updated version from David as base
   Most comment/commit message update should be kept as is.

- A new separate patch to move UNMAPPED bit set timing

- New comment on why we need to prealloc subpage inside a loop
   Mostly for further 16K page size support, where we can have
   eb across multiple pages.

- Remove one patch which is too RW specific
   Since it introduces functional change which only makes sense for RW
   support, it's not a good idea to include it in RO support.

- Error handling fixes
   Great thanks to Josef.

- Refactor btrfs_subpage allocation/freeing
   Now we have btrfs_alloc_subpage() and btrfs_free_subpage() helpers to
   do all the allocation/freeing.
   It's pretty easy to convert to kmem_cache using above helpers.
   (already internally tested using kmem_cache without problem, in fact
    it's all the problems found in kmem_cache test leads to the new
    interface)

- Use btrfs_subpage::eb_refs to replace old under_alloc
   This makes checking whether the page has any eb left much easier.

Qu Wenruo (18):
   btrfs: merge PAGE_CLEAR_DIRTY and PAGE_SET_WRITEBACK to
     PAGE_START_WRITEBACK
   btrfs: set UNMAPPED bit early in btrfs_clone_extent_buffer() for
     subpage support
   btrfs: introduce the skeleton of btrfs_subpage structure
   btrfs: make attach_extent_buffer_page() handle subpage case
   btrfs: make grab_extent_buffer_from_page() handle subpage case
   btrfs: support subpage for extent buffer page release

I don't have this patch in my inbox so I can't reply to it directly, but
you include refcount.h, but then use normal atomics.  Please used the
actual refcount_t, as it gets us all the debugging stuff that makes
finding problems much easier.  Thanks,

My bad, my initial plan is to use refcount, but the use case has valid 0
refcount usage, thus refcount is not good here.

I'll remove the remaining including line.

Thanks,
Qu

Josef

Reply via email to