From: Nikolay Borisov <nborisov@suse.com>
To: Omar Sandoval <osandov@osandov.com>, linux-btrfs@vger.kernel.org
Cc: kernel-team@fb.com, Jens Axboe <axboe@kernel.dk>,
Christoph Hellwig <hch@lst.de>
Subject: Re: [PATCH v2 12/15] btrfs: get rid of one layer of bios in direct I/O
Date: Tue, 21 Apr 2020 16:00:56 +0300 [thread overview]
Message-ID: <f5e024ae-b148-a54b-c6ba-d875a16757b9@suse.com> (raw)
In-Reply-To: <bd8015bf0064f084c371ceee399383d791c807db.1587072977.git.osandov@fb.com>
On 17.04.20 г. 0:46 ч., Omar Sandoval wrote:
> From: Omar Sandoval <osandov@fb.com>
>
> In the worst case, there are _4_ layers of bios in the Btrfs direct I/O
> path:
>
> 1. The bio created by the generic direct I/O code (dio_bio).
> 2. A clone of dio_bio we create in btrfs_submit_direct() to represent
> the entire direct I/O range (orig_bio).
> 3. A partial clone of orig_bio limited to the size of a RAID stripe that
> we create in btrfs_submit_direct_hook().
> 4. Clones of each of those split bios for each RAID stripe that we
> create in btrfs_map_bio().
>
> As of the previous commit, the second layer (orig_bio) is no longer
> needed for anything: we can split dio_bio instead, and complete dio_bio
> directly when all of the cloned bios complete. This lets us clean up a
> bunch of cruft, including dip->subio_endio and dip->errors (we can use
> dio_bio->bi_status instead). It also enables the next big cleanup of
> direct I/O read repair.
nit: Please explicitly mention that btrfs_dio_private_put is now not
only putting a structure and doing cleanups but also serves as the io
completion routine for dio_bio. Given the name of the function and its
purpose I find this a bit counter-intuitive. But since this is rather
subjective I'd like to ask David if he also sees it as a bit surprising?
>
> Reviewed-by: Josef Bacik <josef@toxicpanda.com>
> Signed-off-by: Omar Sandoval <osandov@fb.com>
> ---
> fs/btrfs/btrfs_inode.h | 16 ----
> fs/btrfs/inode.c | 185 +++++++++++++++--------------------------
> 2 files changed, 65 insertions(+), 136 deletions(-)
>
<snip>
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index fe87c465b13c..79b884d2f3ed 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -7356,6 +7356,29 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
> return ret;
> }
>
> +static void btrfs_dio_private_put(struct btrfs_dio_private *dip)
> +{
The way you've structured the code is proliferating something which has
been identified as bad practice, namely - asymmetry between "refcount
get" and "refcount put" operations. The put is nicely encapsulated
behind an aptly named function, however getting the reference is really
an open-coded refcount_inc. This has lead to at least 1 bug in the past
(recently fixed by Filipe) since transaction's refcount management is
similar. So I'd rather have the refcount_inc(dip->refs) be encapsulated
behind a simple btrfs_dio_private_get() helper.
> + /*
> + * This implies a barrier so that stores to dio_bio->bi_status before
> + * this and loads of dio_bio->bi_status after this are fully ordered.
> + */
> + if (!refcount_dec_and_test(&dip->refs))
> + return;
> +
> + if (bio_op(dip->dio_bio) == REQ_OP_WRITE) {
> + __endio_write_update_ordered(dip->inode, dip->logical_offset,
> + dip->bytes,
> + !dip->dio_bio->bi_status);
> + } else {
> + unlock_extent(&BTRFS_I(dip->inode)->io_tree,
> + dip->logical_offset,
> + dip->logical_offset + dip->bytes - 1);
> + }
> +
> + dio_end_io(dip->dio_bio);
> + kfree(dip);
> +}
> +
> static inline blk_status_t submit_dio_repair_bio(struct inode *inode,
> struct bio *bio,
> int mirror_num)
<snip>
next prev parent reply other threads:[~2020-04-21 13:01 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-16 21:46 [PATCH v2 00/15] btrfs: read repair/direct I/O improvements Omar Sandoval
2020-04-16 21:46 ` [PATCH v2 01/15] block: add bio_for_each_bvec_all() Omar Sandoval
2020-04-17 12:56 ` Johannes Thumshirn
2020-04-16 21:46 ` [PATCH v2 02/15] btrfs: fix error handling when submitting direct I/O bio Omar Sandoval
2020-04-17 13:01 ` Johannes Thumshirn
2020-04-16 21:46 ` [PATCH v2 03/15] btrfs: fix double __endio_write_update_ordered in direct I/O Omar Sandoval
2020-04-17 17:53 ` Johannes Thumshirn
2020-04-20 15:45 ` David Sterba
2020-04-21 10:44 ` Nikolay Borisov
2020-04-21 22:26 ` David Sterba
2020-04-16 21:46 ` [PATCH v2 04/15] btrfs: look at full bi_io_vec for repair decision Omar Sandoval
2020-04-17 17:56 ` Johannes Thumshirn
2020-04-16 21:46 ` [PATCH v2 05/15] btrfs: don't do repair validation for checksum errors Omar Sandoval
2020-04-17 17:59 ` Johannes Thumshirn
2020-04-16 21:46 ` [PATCH v2 06/15] btrfs: clarify btrfs_lookup_bio_sums documentation Omar Sandoval
2020-04-17 18:01 ` Johannes Thumshirn
2020-04-21 11:17 ` Nikolay Borisov
2020-04-16 21:46 ` [PATCH v2 07/15] btrfs: rename __readpage_endio_check to check_data_csum Omar Sandoval
2020-04-16 21:46 ` [PATCH v2 08/15] btrfs: make btrfs_check_repairable() static Omar Sandoval
2020-04-16 21:46 ` [PATCH v2 09/15] btrfs: kill btrfs_dio_private->private Omar Sandoval
2020-04-17 18:02 ` Johannes Thumshirn
2020-04-16 21:46 ` [PATCH v2 10/15] btrfs: convert btrfs_dio_private->pending_bios to refcount_t Omar Sandoval
2020-04-17 18:03 ` Johannes Thumshirn
2020-04-16 21:46 ` [PATCH v2 11/15] btrfs: put direct I/O checksums in btrfs_dio_private instead of bio Omar Sandoval
2020-04-17 18:06 ` Johannes Thumshirn
2020-04-21 22:50 ` David Sterba
2020-04-16 21:46 ` [PATCH v2 12/15] btrfs: get rid of one layer of bios in direct I/O Omar Sandoval
2020-04-21 13:00 ` Nikolay Borisov [this message]
2020-04-21 23:11 ` David Sterba
2020-04-16 21:46 ` [PATCH v2 13/15] btrfs: simplify direct I/O read repair Omar Sandoval
2020-04-21 13:53 ` Nikolay Borisov
2020-04-21 14:40 ` Nikolay Borisov
2020-04-16 21:46 ` [PATCH v2 14/15] btrfs: get rid of endio_repair_workers Omar Sandoval
2020-04-16 21:46 ` [PATCH v2 15/15] btrfs: unify buffered and direct I/O read repair Omar Sandoval
2020-04-21 23:38 ` David Sterba
2020-04-17 11:03 ` [PATCH v2 00/15] btrfs: read repair/direct I/O improvements David Sterba
2020-04-21 23:46 ` David Sterba
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=f5e024ae-b148-a54b-c6ba-d875a16757b9@suse.com \
--to=nborisov@suse.com \
--cc=axboe@kernel.dk \
--cc=hch@lst.de \
--cc=kernel-team@fb.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=osandov@osandov.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).