All of lore.kernel.org
 help / color / mirror / Atom feed
From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH 00/27] btrfs: limited subpage compressed write support
Date: Fri, 16 Jul 2021 17:11:58 +0800	[thread overview]
Message-ID: <e9d5c7b5-c078-850f-3441-1c0097eb73d3@suse.com> (raw)
In-Reply-To: <20210713061516.163318-1-wqu@suse.com>



On 2021/7/13 下午2:14, Qu Wenruo wrote:
> The patchset can be fetched from github:
> https://github.com/adam900710/linux/tree/compression
> 
> The branch is based on the previously submitted subpage enablement
> patchset.
> The target merge window is v5.16 or v5.17.
> 
> === What's working ===
> 
> Delalloc range which is fully page aligned can be compressed with
> 64K page size and 4K sector size (AKA, subpage).
> 
> With current patchset, it can pass most "compress" test group, except
> btrfs/106, whose golden output is bound to 4K page size, thus test case
> needs to be updated.

It turns out that, btrfs/160 has a very high chance to crash due to 
ordered extent tree inconsistency.
This is only exposed when running with "-o compress" mount option.

Will fix all the bugs exposed during full fstests run with "-o compress" 
mount option.

Thanks,
Qu

> 
> And as a basic requirement, 4K page size systems still pass the regular
> fstests runs.
> 
> === What's not working ===
> Delalloc range not fully page aligned will not go through compression.
> 
> That's to say, the following inode will go through different write path:
> 
> 	0	32K	64K	96K	128K
> 	|///////////////|	|///////|
> 			|		\- Will not be compressed
> 			|
> 			\- Will be compressed
> 
> This will reduce the chance of compression obviously.
> 
> But all involved patches will be the basis for later sector perfect
> compression support.
> 
> The limitation is mostly introduced by two factors:
> 
> - How we handle the locked page of a async cow delalloc range
>    Currently we unlock the first page unconditionally.
>    Even with the patchset, we still follows the behavior.
> 
>    This means we can't have two async cow range shares the same
>    page.
>    This can be enhanced to use subpage::writers, but the next
>    problem will prevent us doing so.
> 
> - No way to ensure an async cow range not to unlock the page while
>    we still have delalloc range in the page
> 
>    This is caused by how we run delalloc range in a page.
>    For regular sectorsize, it's not a problem as we have at most one
>    sector for a page.
> 
>    But for subpage case, we can have multiple sectors in one page.
>    If we submit an async cow, it may try to unlock the page while
>    we are still running the next delalloc range of the page.
> 
>    The correct way here is to find and lock all delalloc range inside a
>    page, update the subpage::writers properly, then run each delalloc
>    range, so that the page won't be unlocked half way.
> 
> === Patch structure ===
> 
> Patch 01~04:	Small and safe cleanups
> Patch 05:	Make compressed readahead to be subpage compatble
> Patch 06~14:	Optimize compressed read/write path to determine stripe
> 		boundary in a per-bio base
> Patch 15~16:	Extra code refactor/cleanup for compressed path
> 
> Patch 17~26:	Make compressed write path to be subpage compatible
> Patch 27:	Enable limited subpage compressed write support
> 
> Patch 01~16 may be a good candidate for early merge, as real heavy
> lifting part starts at patch 17.
> 
> While patch 01~04 are really small and safe cleanups, which can be
> merged even earlier than subpage enablement patchset.
> 
> 
> Qu Wenruo (27):
>    btrfs: remove unused parameter @nr_pages in add_ra_bio_pages()
>    btrfs: remove unnecessary parameter @delalloc_start for
>      writepage_delalloc()
>    btrfs: use async_chunk::async_cow to replace the confusing pending
>      pointer
>    btrfs: don't pass compressed pages to
>      btrfs_writepage_endio_finish_ordered()
>    btrfs: make add_ra_bio_pages() to be subpage compatible
>    btrfs: introduce compressed_bio::pending_sectors to trace compressed
>      bio more elegantly
>    btrfs: add subpage checked_bitmap to make PageChecked flag to be
>      subpage compatible
>    btrfs: handle errors properly inside btrfs_submit_compressed_read()
>    btrfs: handle errors properly inside btrfs_submit_compressed_write()
>    btrfs: introduce submit_compressed_bio() for compression
>    btrfs: introduce alloc_compressed_bio() for compression
>    btrfs: make btrfs_submit_compressed_read() to determine stripe
>      boundary at bio allocation time
>    btrfs: make btrfs_submit_compressed_write() to determine stripe
>      boundary at bio allocation time
>    btrfs: remove unused function btrfs_bio_fits_in_stripe()
>    btrfs: refactor submit_compressed_extents()
>    btrfs: cleanup for extent_write_locked_range()
>    btrfs: make compress_file_range() to be subpage compatible
>    btrfs: make btrfs_submit_compressed_write() to be subpage compatible
>    btrfs: make end_compressed_bio_writeback() to be subpage compatble
>    btrfs: make extent_write_locked_range() to be subpage compatible
>    btrfs: extract uncompressed async extent submission code into a new
>      helper
>    btrfs: rework lzo_compress_pages() to make it subpage compatible
>    btrfs: teach __extent_writepage() to handle locked page differently
>    btrfs: allow page to be unlocked by btrfs_page_end_writer_lock() even
>      if it's locked by plain page_lock()
>    btrfs: allow subpage to compress a range which only covers one page
>    btrfs: don't run delalloc range which is beyond the locked_page to
>      prevent deadlock for subpage compression
>    btrfs: only allow subpage compression if the range is fully page
>      aligned
> 
>   fs/btrfs/compression.c           | 678 ++++++++++++++++++-------------
>   fs/btrfs/compression.h           |   4 +-
>   fs/btrfs/ctree.h                 |   2 -
>   fs/btrfs/extent_io.c             | 123 ++++--
>   fs/btrfs/extent_io.h             |   3 +-
>   fs/btrfs/file.c                  |  20 +-
>   fs/btrfs/free-space-cache.c      |   6 +-
>   fs/btrfs/inode.c                 | 455 +++++++++++----------
>   fs/btrfs/lzo.c                   | 280 ++++++-------
>   fs/btrfs/reflink.c               |   2 +-
>   fs/btrfs/subpage.c               |  85 ++++
>   fs/btrfs/subpage.h               |  10 +
>   fs/btrfs/tests/extent-io-tests.c |  12 +-
>   13 files changed, 996 insertions(+), 684 deletions(-)
> 


  parent reply	other threads:[~2021-07-16  9:12 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-13  6:14 [PATCH 00/27] btrfs: limited subpage compressed write support Qu Wenruo
2021-07-13  6:14 ` [PATCH 01/27] btrfs: remove unused parameter @nr_pages in add_ra_bio_pages() Qu Wenruo
2021-07-13  6:14 ` [PATCH 02/27] btrfs: remove unnecessary parameter @delalloc_start for writepage_delalloc() Qu Wenruo
2021-07-13  6:14 ` [PATCH 03/27] btrfs: use async_chunk::async_cow to replace the confusing pending pointer Qu Wenruo
2021-07-13  7:36   ` Nikolay Borisov
2021-07-13  6:14 ` [PATCH 04/27] btrfs: don't pass compressed pages to btrfs_writepage_endio_finish_ordered() Qu Wenruo
2021-07-13  6:14 ` [PATCH 05/27] btrfs: make add_ra_bio_pages() to be subpage compatible Qu Wenruo
2021-07-13  6:14 ` [PATCH 06/27] btrfs: introduce compressed_bio::pending_sectors to trace compressed bio more elegantly Qu Wenruo
2021-07-13  6:14 ` [PATCH 07/27] btrfs: add subpage checked_bitmap to make PageChecked flag to be subpage compatible Qu Wenruo
2021-07-16  7:54   ` Qu Wenruo
2021-07-13  6:14 ` [PATCH 08/27] btrfs: handle errors properly inside btrfs_submit_compressed_read() Qu Wenruo
2021-07-13  6:14 ` [PATCH 09/27] btrfs: handle errors properly inside btrfs_submit_compressed_write() Qu Wenruo
2021-07-13  6:14 ` [PATCH 10/27] btrfs: introduce submit_compressed_bio() for compression Qu Wenruo
2021-07-13  6:15 ` [PATCH 11/27] btrfs: introduce alloc_compressed_bio() " Qu Wenruo
2021-07-13  6:15 ` [PATCH 12/27] btrfs: make btrfs_submit_compressed_read() to determine stripe boundary at bio allocation time Qu Wenruo
2021-07-13  6:15 ` [PATCH 13/27] btrfs: make btrfs_submit_compressed_write() " Qu Wenruo
2021-07-13  6:15 ` [PATCH 14/27] btrfs: remove unused function btrfs_bio_fits_in_stripe() Qu Wenruo
2021-07-13  6:15 ` [PATCH 15/27] btrfs: refactor submit_compressed_extents() Qu Wenruo
2021-07-13  6:15 ` [PATCH 16/27] btrfs: cleanup for extent_write_locked_range() Qu Wenruo
2021-07-13  6:15 ` [PATCH 17/27] btrfs: make compress_file_range() to be subpage compatible Qu Wenruo
2021-07-13  6:15 ` [PATCH 18/27] btrfs: make btrfs_submit_compressed_write() " Qu Wenruo
2021-07-13  6:15 ` [PATCH 19/27] btrfs: make end_compressed_bio_writeback() to be subpage compatble Qu Wenruo
2021-07-13  6:15 ` [PATCH 20/27] btrfs: make extent_write_locked_range() to be subpage compatible Qu Wenruo
2021-07-13  6:15 ` [PATCH 21/27] btrfs: extract uncompressed async extent submission code into a new helper Qu Wenruo
2021-07-13  6:15 ` [PATCH 22/27] btrfs: rework lzo_compress_pages() to make it subpage compatible Qu Wenruo
2021-07-13  6:15 ` [PATCH 23/27] btrfs: teach __extent_writepage() to handle locked page differently Qu Wenruo
2021-07-13  6:15 ` [PATCH 24/27] btrfs: allow page to be unlocked by btrfs_page_end_writer_lock() even if it's locked by plain page_lock() Qu Wenruo
2021-07-13  6:15 ` [PATCH 25/27] btrfs: allow subpage to compress a range which only covers one page Qu Wenruo
2021-07-13  6:15 ` [PATCH 26/27] btrfs: don't run delalloc range which is beyond the locked_page to prevent deadlock for subpage compression Qu Wenruo
2021-07-13  6:15 ` [PATCH 27/27] btrfs: only allow subpage compression if the range is fully page aligned Qu Wenruo
2021-07-16  9:11 ` Qu Wenruo [this message]
2021-07-20  5:00   ` [PATCH 00/27] btrfs: limited subpage compressed write support Qu Wenruo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e9d5c7b5-c078-850f-3441-1c0097eb73d3@suse.com \
    --to=wqu@suse.com \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.