All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ming Lei <tom.leiming@gmail.com>
To: "Theodore Ts'o" <tytso@mit.edu>, Ming Lei <tom.leiming@gmail.com>,
	Jens Axboe <axboe@fb.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	linux-block <linux-block@vger.kernel.org>,
	Linux FS Devel <linux-fsdevel@vger.kernel.org>,
	Christoph Hellwig <hch@infradead.org>,
	"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>,
	Mike Christie <mchristi@redhat.com>,
	Hannes Reinecke <hare@suse.com>,
	Keith Busch <keith.busch@intel.com>,
	Mike Snitzer <snitzer@redhat.com>,
	Johannes Thumshirn <jthumshirn@suse.de>,
	Bart Van Assche <bart.vanassche@sandisk.com>,
	Kent Overstreet <kent.overstreet@gmail.com>
Subject: Re: [PATCH 45/60] block: bio: introduce bio_for_each_segment_all_rd() and its write pair
Date: Wed, 2 Nov 2016 09:58:39 +0800	[thread overview]
Message-ID: <CACVXFVO2o50y_G1gUjakWNiea0o0SWJ6iMZf9cfKNk8C74JL0A@mail.gmail.com> (raw)
In-Reply-To: <20161101141704.agxfiturhjhm2znn@thunk.org>

On Tue, Nov 1, 2016 at 10:17 PM, Theodore Ts'o <tytso@mit.edu> wrote:
> On Tue, Nov 01, 2016 at 07:51:27AM +0800, Ming Lei wrote:
>> Sorry for forgetting to mention one important point:
>>
>> - after multipage bvec is introduced, the iterated bvec pointer
>> still points to singlge page bvec, which is generated in-flight
>> and is readonly actually. That is the motivation about the introduction
>> of bio_for_each_segment_all_rd().
>>
>> So maybe bio_for_each_page_all_ro() is better?
>>
>> For _wt(), we still can keep it as bio_for_each_segment(), which also
>> reflects that now the iterated bvec points to one whole segment if
>> we name _rd as bio_for_each_page_all_ro().
>
> I'm agnostic as to what the right names are --- my big concern is
> there is an explosion of bio_for_each_page_* functions, and that there

There isn't big users of bio_for_each_segment_all(), see:

        [ming@linux-2.6]$git grep -n bio_for_each_segment_all ./fs/ | wc -l
        23

I guess there isn't execuses to switch to that after this patchset.

>From view of API, bio_for_each_segment_all() is ugly and
exposes the bvec table to users, and the main reason we keep it
is that it can avoid one bvec copy in one loop. And it can be replaced
easily by bio_for_each_segment().

> isn't good documentation about (a) when to use each of these
> functions, and (b) why.  I was goinig through the patch series, and it
> was hard for me to figure out why, and I was looking through all of
> the patches.  Once all of the patches are merged in, I am concerned
> this is going to be massive trapdoor that will snare a large number of
> unwitting developers.

I understand your concern, and let me explain the whole story a bit:

1) in current linus tree, we have the following two bio iterator helpers,
for which we still don't provide any document:

       bio_for_each_segment(bvl, bio, iter)
       bio_for_each_segment_all(bvl, bio, i)

- the former is used to traverse each 'segment' in the bio range
descibed by the 'iter'(just like [start, size]); the latter is used
to traverse each 'segment' in the whole bio, so there isn't 'iter'
passed in.

- in the former helper, typeof('bvl') is 'struct bvec', and the 'segment'
is copied to 'bvl'; in the latter helper, typeof('bvl') is 'struct bvec *', and
it just points to one bvec directly in the table(bio->bi_io_vec) one by one.

- we can use the former helper to implement the latter easily and provide
a more friendly interface, and the main reason we keep it is that _all can
avoid bvec copy in each loop, so it might be a bit efficient.

- even segment is used in the helper's name, but each 'bvl' in the
helper just describes one single page, so actually they should have been
named as the following:

         bio_for_each_page(bvl, bio, iter)
         bio_for_each_page(bvl, bio, iter)

2) this patchset introduces multipage bvec, which will store one
real segment in each 'bvec' of the table(bio->bi_io_vec), and one
segment may include more than one page

- bio_for_each_segment() is kept as current interface to retrieve
one page in each 'bvl', that is just for making current users happy,
and it will be replaced with bio_for_each_page() finally, which
should be a follow-up work of this patchset

- the story of introduction of bio_for_each_segment_all_rd(bvl, bio, i):
we can't simply make 'bvl' point to each bvec in the table direclty
any more, because now each bvec in the table store one real segment
instead of one page. So in this patchst the _rd() is implemented by
bio_for_each_segment(), and we can't change/write to the bvec in the
table any more using the pointer of 'bvl' via this helper.

>
> As far as my preference, from an abstract perspective, if one version
> (the read-write variant, I presume) is always safe, while one (the
> read-only variant) is faster, if you can work under restricted
> circumstances, naming the safe version so it is the "default", and
> more dangerous one with the name that makes it a bit more obvious what
> you have to do in order to use it safely, and then very clearly
> document both in sources, and in the Documentation directory, what the
> issues are and what you have to do in order to use the faster version.

I will add detailed documents about these helpers in next version:

    - bio_for_each_segment()
    - bio_for_each_segment_all()
    - bio_for_each_page_all_ro()(renamed from bio_for_each_segment_all_rd())

Thanks,
Ming

>
> Cheers,
>
>                                         - Ted
>

  reply	other threads:[~2016-11-02  1:58 UTC|newest]

Thread overview: 148+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-29  8:07 [PATCH 00/60] block: support multipage bvec Ming Lei
2016-10-29  8:07 ` [Cluster-devel] " Ming Lei
2016-10-29  8:07 ` Ming Lei
2016-10-29  8:07 ` Ming Lei
2016-10-29  8:07 ` Ming Lei
2016-10-29  8:08 ` [PATCH 01/60] block: bio: introduce bio_init_with_vec_table() Ming Lei
2016-10-29 15:21   ` Christoph Hellwig
2016-10-29  8:08 ` [PATCH 02/60] block drivers: convert to bio_init_with_vec_table() Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 03/60] block: drbd: remove impossible failure handling Ming Lei
2016-10-31 15:25   ` Christoph Hellwig
2016-10-29  8:08 ` [PATCH 04/60] block: floppy: use bio_add_page() Ming Lei
2016-10-31 15:26   ` Christoph Hellwig
2016-10-31 22:54     ` Ming Lei
2016-11-10 19:35   ` Christoph Hellwig
2016-11-11  8:39     ` Ming Lei
2016-10-29  8:08 ` [PATCH 05/60] target: avoid to access .bi_vcnt directly Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-31 15:26   ` Christoph Hellwig
2016-10-29  8:08 ` [PATCH 06/60] bcache: debug: avoid to access .bi_io_vec directly Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 07/60] dm: crypt: use bio_add_page() Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 08/60] dm: use bvec iterator helpers to implement .get_page and .next_page Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 09/60] dm: dm.c: replace 'bio->bi_vcnt == 1' with !bio_multiple_segments Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-31 15:29   ` Christoph Hellwig
2016-10-31 15:29     ` Christoph Hellwig
2016-10-31 22:59     ` Ming Lei
2016-10-31 22:59       ` Ming Lei
2016-11-02  3:09     ` Kent Overstreet
2016-11-02  3:09       ` Kent Overstreet
2016-11-02  7:56       ` Ming Lei
2016-11-02  7:56         ` Ming Lei
2016-11-02 14:24         ` Mike Snitzer
2016-11-02 14:24           ` Mike Snitzer
2016-11-02 14:24           ` Mike Snitzer
2016-11-02 23:47           ` Ming Lei
2016-11-02 23:47             ` Ming Lei
2016-10-29  8:08 ` [PATCH 10/60] fs: logfs: convert to bio_add_page() in sync_request() Ming Lei
2016-10-29  8:08 ` [PATCH 11/60] fs: logfs: use bio_add_page() in __bdev_writeseg() Ming Lei
2016-10-31 15:29   ` Christoph Hellwig
2016-10-29  8:08 ` [PATCH 12/60] fs: logfs: use bio_add_page() in do_erase() Ming Lei
2016-10-31 15:29   ` Christoph Hellwig
2016-10-29  8:08 ` [PATCH 13/60] fs: logfs: remove unnecesary check Ming Lei
2016-10-31 15:29   ` Christoph Hellwig
2016-10-29  8:08 ` [PATCH 14/60] block: drbd: comment on direct access bvec table Ming Lei
2016-10-29  8:08 ` [PATCH 15/60] block: loop: comment on direct access to " Ming Lei
2016-10-31 15:31   ` Christoph Hellwig
2016-10-31 23:08     ` Ming Lei
2016-10-29  8:08 ` [PATCH 16/60] block: pktcdvd: " Ming Lei
2016-10-31 15:33   ` Christoph Hellwig
2016-10-31 23:08     ` Ming Lei
2016-10-29  8:08 ` [PATCH 17/60] kernel/power/swap.c: " Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 18/60] mm: page_io.c: " Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 19/60] fs/buffer: " Ming Lei
2016-10-31 15:35   ` Christoph Hellwig
2016-10-31 23:12     ` Ming Lei
2016-10-29  8:08 ` [PATCH 20/60] f2fs: f2fs_read_end_io: " Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 21/60] bcache: " Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 22/60] block: comment on bio_alloc_pages() Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 23/60] block: introduce flag QUEUE_FLAG_NO_MP Ming Lei
2016-10-29 15:29   ` Christoph Hellwig
2016-10-29 22:20     ` Ming Lei
2016-10-29 22:20       ` Ming Lei
2016-10-29  8:08 ` [PATCH 24/60] md: set NO_MP for request queue of md Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 25/60] block: pktcdvd: set NO_MP for pktcdvd request queue Ming Lei
2016-10-29  8:08 ` [PATCH 26/60] btrfs: set NO_MP for request queues behind BTRFS Ming Lei
2016-10-31 15:36   ` Christoph Hellwig
2016-10-31 17:58     ` Chris Mason
2016-10-31 18:00       ` Christoph Hellwig
2016-10-29  8:08 ` [PATCH 27/60] block: introduce BIO_SP_MAX_SECTORS Ming Lei
2016-10-29  8:08 ` [PATCH 28/60] block: introduce QUEUE_FLAG_SPLIT_MP Ming Lei
2016-10-31 15:39   ` Christoph Hellwig
2016-10-31 23:56     ` Ming Lei
2016-11-02  3:08     ` Kent Overstreet
2016-11-03 10:38       ` Ming Lei
2016-11-03 11:20         ` Kent Overstreet
2016-11-03 11:26           ` Ming Lei
2016-11-03 11:30             ` Kent Overstreet
2016-10-29  8:08 ` [PATCH 29/60] dm: limit the max bio size as BIO_SP_MAX_SECTORS << SECTOR_SHIFT Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 30/60] bcache: set flag of QUEUE_FLAG_SPLIT_MP Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 31/60] block: introduce multipage/single page bvec helpers Ming Lei
2016-10-29  8:08 ` [PATCH 32/60] block: implement sp version of bvec iterator helpers Ming Lei
2016-10-29 11:06   ` kbuild test robot
2016-12-17 11:38     ` Ming Lei
2016-12-17 11:38       ` Ming Lei
2016-10-29  8:08 ` [PATCH 33/60] block: introduce bio_for_each_segment_mp() Ming Lei
2016-10-29  8:08 ` [PATCH 34/60] block: introduce bio_clone_sp() Ming Lei
2016-10-29  8:08 ` [PATCH 35/60] bvec_iter: introduce BVEC_ITER_ALL_INIT Ming Lei
2016-10-29  8:08 ` [PATCH 36/60] block: bounce: avoid direct access to bvec from bio->bi_io_vec Ming Lei
2016-10-29  8:08 ` [PATCH 37/60] block: bounce: don't access bio->bi_io_vec in copy_to_high_bio_irq Ming Lei
2016-10-29  8:08 ` [PATCH 38/60] block: bounce: convert multipage bvecs into singlepage Ming Lei
2016-10-29  8:08 ` [PATCH 39/60] bcache: debug: switch to bio_clone_sp() Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 40/60] blk-merge: compute bio->bi_seg_front_size efficiently Ming Lei
2016-10-29  8:08 ` [PATCH 41/60] block: blk-merge: try to make front segments in full size Ming Lei
2016-10-29  8:08 ` [PATCH 42/60] block: use bio_for_each_segment_mp() to compute segments count Ming Lei
2016-10-29  8:08 ` [PATCH 43/60] block: use bio_for_each_segment_mp() to map sg Ming Lei
2016-10-29  8:08 ` [PATCH 44/60] block: introduce bvec_for_each_sp_bvec() Ming Lei
2016-10-29  8:08 ` [PATCH 45/60] block: bio: introduce bio_for_each_segment_all_rd() and its write pair Ming Lei
2016-10-31 13:59   ` Theodore Ts'o
2016-10-31 15:11     ` Christoph Hellwig
2016-10-31 22:50       ` Ming Lei
2016-11-02  3:01       ` Kent Overstreet
2016-10-31 22:46     ` Ming Lei
2016-10-31 23:51       ` Ming Lei
2016-11-01 14:17         ` Theodore Ts'o
2016-11-02  1:58           ` Ming Lei [this message]
2016-10-29  8:08 ` [PATCH 46/60] block: deal with dirtying pages for multipage bvec Ming Lei
2016-10-31 15:40   ` Christoph Hellwig
2016-11-01  0:19     ` Ming Lei
2016-10-29  8:08 ` [PATCH 47/60] block: convert to bio_for_each_segment_all_rd() Ming Lei
2016-10-29  8:08 ` [PATCH 48/60] fs/mpage: " Ming Lei
2016-10-29  8:08 ` [PATCH 49/60] fs/direct-io: " Ming Lei
2016-10-29  8:08 ` [PATCH 50/60] ext4: " Ming Lei
2016-10-29  8:08 ` [PATCH 51/60] xfs: " Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 52/60] logfs: " Ming Lei
2016-10-29  8:08 ` [PATCH 53/60] gfs2: " Ming Lei
2016-10-29  8:08   ` [Cluster-devel] " Ming Lei
2016-10-29  8:08 ` [PATCH 54/60] f2fs: " Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 55/60] exofs: " Ming Lei
2016-10-29  8:08 ` [PATCH 56/60] fs: crypto: " Ming Lei
2016-10-29  8:08 ` [PATCH 57/60] bcache: " Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 58/60] dm-crypt: " Ming Lei
2016-10-29  8:08   ` Ming Lei
2016-10-29  8:08 ` [PATCH 59/60] fs/buffer.c: use bvec iterator to truncate the bio Ming Lei
2016-10-29  8:08 ` [PATCH 60/60] block: enable multipage bvecs Ming Lei
2016-10-31 15:25 ` [PATCH 00/60] block: support multipage bvec Christoph Hellwig
2016-10-31 15:25   ` [Cluster-devel] " Christoph Hellwig
2016-10-31 15:25   ` Christoph Hellwig
2016-10-31 15:25   ` Christoph Hellwig
2016-10-31 22:52   ` Ming Lei
2016-10-31 22:52     ` [Cluster-devel] " Ming Lei
2016-10-31 22:52     ` Ming Lei

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=CACVXFVO2o50y_G1gUjakWNiea0o0SWJ6iMZf9cfKNk8C74JL0A@mail.gmail.com \
    --to=tom.leiming@gmail.com \
    --cc=axboe@fb.com \
    --cc=bart.vanassche@sandisk.com \
    --cc=hare@suse.com \
    --cc=hch@infradead.org \
    --cc=jthumshirn@suse.de \
    --cc=keith.busch@intel.com \
    --cc=kent.overstreet@gmail.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mchristi@redhat.com \
    --cc=snitzer@redhat.com \
    --cc=tytso@mit.edu \
    /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.