From: Ming Lei <ming.lei@redhat.com> To: Jens Axboe <axboe@kernel.dk> Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Theodore Ts'o <tytso@mit.edu>, Omar Sandoval <osandov@fb.com>, Sagi Grimberg <sagi@grimberg.me>, Dave Chinner <dchinner@redhat.com>, Kent Overstreet <kent.overstreet@gmail.com>, Mike Snitzer <snitzer@redhat.com>, dm-devel@redhat.com, Alexander Viro <viro@zeniv.linux.org.uk>, linux-fsdevel@vger.kernel.org, linux-raid@vger.kernel.org, David Sterba <dsterba@suse.com>, linux-btrfs@vger.kernel.org, "Darrick J . Wong" <darrick.wong@oracle.com>, linux-xfs@vger.kernel.org, Gao Xiang <gaoxiang25@huawei.com>, Christoph Hellwig <hch@lst.de>, linux-ext4@vger.kernel.org, Coly Li <colyli@suse.de>, linux-bcache@vger.kernel.org, Boaz Harrosh <ooo@electrozaur.com>, Bob Peterson <rpeterso@redhat.com>, cluster-devel@redhat.com, Ming Lei <ming.lei@redhat.com> Subject: [PATCH V14 04/18] block: introduce multi-page bvec helpers Date: Mon, 21 Jan 2019 16:17:51 +0800 Message-ID: <20190121081805.32727-5-ming.lei@redhat.com> (raw) In-Reply-To: <20190121081805.32727-1-ming.lei@redhat.com> This patch introduces helpers of 'mp_bvec_iter_*' for multi-page bvec support. The introduced helpers treate one bvec as real multi-page segment, which may include more than one pages. The existed helpers of bvec_iter_* are interfaces for supporting current bvec iterator which is thought as single-page by drivers, fs, dm and etc. These introduced helpers will build single-page bvec in flight, so this way won't break current bio/bvec users, which needn't any change. Follows some multi-page bvec background: - bvecs stored in bio->bi_io_vec is always multi-page style - bvec(struct bio_vec) represents one physically contiguous I/O buffer, now the buffer may include more than one page after multi-page bvec is supported, and all these pages represented by one bvec is physically contiguous. Before multi-page bvec support, at most one page is included in one bvec, we call it single-page bvec. - .bv_page of the bvec points to the 1st page in the multi-page bvec - .bv_offset of the bvec is the offset of the buffer in the bvec The effect on the current drivers/filesystem/dm/bcache/...: - almost everyone supposes that one bvec only includes one single page, so we keep the sp interface not changed, for example, bio_for_each_segment() still returns single-page bvec - bio_for_each_segment_all() will return single-page bvec too - during iterating, iterator variable(struct bvec_iter) is always updated in multi-page bvec style, and bvec_iter_advance() is kept not changed - returned(copied) single-page bvec is built in flight by bvec helpers from the stored multi-page bvec Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Omar Sandoval <osandov@fb.com> Signed-off-by: Ming Lei <ming.lei@redhat.com> --- include/linux/bvec.h | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/include/linux/bvec.h b/include/linux/bvec.h index ba0ae40e77c9..0ae729b1c9fe 100644 --- a/include/linux/bvec.h +++ b/include/linux/bvec.h @@ -23,6 +23,7 @@ #include <linux/kernel.h> #include <linux/bug.h> #include <linux/errno.h> +#include <linux/mm.h> /* * was unsigned short, but we might as well be ready for > 64kB I/O pages @@ -50,16 +51,39 @@ struct bvec_iter { */ #define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx]) -#define bvec_iter_page(bvec, iter) \ +/* multi-page (mp_bvec) helpers */ +#define mp_bvec_iter_page(bvec, iter) \ (__bvec_iter_bvec((bvec), (iter))->bv_page) -#define bvec_iter_len(bvec, iter) \ +#define mp_bvec_iter_len(bvec, iter) \ min((iter).bi_size, \ __bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done) -#define bvec_iter_offset(bvec, iter) \ +#define mp_bvec_iter_offset(bvec, iter) \ (__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done) +#define mp_bvec_iter_page_idx(bvec, iter) \ + (mp_bvec_iter_offset((bvec), (iter)) / PAGE_SIZE) + +#define mp_bvec_iter_bvec(bvec, iter) \ +((struct bio_vec) { \ + .bv_page = mp_bvec_iter_page((bvec), (iter)), \ + .bv_len = mp_bvec_iter_len((bvec), (iter)), \ + .bv_offset = mp_bvec_iter_offset((bvec), (iter)), \ +}) + +/* For building single-page bvec in flight */ + #define bvec_iter_offset(bvec, iter) \ + (mp_bvec_iter_offset((bvec), (iter)) % PAGE_SIZE) + +#define bvec_iter_len(bvec, iter) \ + min_t(unsigned, mp_bvec_iter_len((bvec), (iter)), \ + PAGE_SIZE - bvec_iter_offset((bvec), (iter))) + +#define bvec_iter_page(bvec, iter) \ + nth_page(mp_bvec_iter_page((bvec), (iter)), \ + mp_bvec_iter_page_idx((bvec), (iter))) + #define bvec_iter_bvec(bvec, iter) \ ((struct bio_vec) { \ .bv_page = bvec_iter_page((bvec), (iter)), \ -- 2.9.5
next prev parent reply index Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-01-21 8:17 [PATCH V14 00/18] block: support multi-page bvec Ming Lei 2019-01-21 8:17 ` [PATCH V14 01/18] btrfs: look at bi_size for repair decisions Ming Lei 2019-01-21 8:17 ` [PATCH V14 02/18] block: don't use bio->bi_vcnt to figure out segment number Ming Lei 2019-01-21 8:17 ` [PATCH V14 03/18] block: remove bvec_iter_rewind() Ming Lei 2019-01-21 8:17 ` Ming Lei [this message] 2019-01-21 8:17 ` [PATCH V14 05/18] block: introduce bio_for_each_mp_bvec() and rq_for_each_mp_bvec() Ming Lei 2019-01-21 8:17 ` [PATCH V14 06/18] block: use bio_for_each_mp_bvec() to compute multi-page bvec count Ming Lei 2019-01-21 8:17 ` [PATCH V14 07/18] block: use bio_for_each_mp_bvec() to map sg Ming Lei 2019-01-21 8:17 ` [PATCH V14 08/18] block: introduce mp_bvec_last_segment() Ming Lei 2019-01-21 8:17 ` [PATCH V14 09/18] fs/buffer.c: use bvec iterator to truncate the bio Ming Lei 2019-01-21 8:17 ` [PATCH V14 10/18] btrfs: use mp_bvec_last_segment to get bio's last page Ming Lei 2019-01-21 8:17 ` [PATCH V14 11/18] block: loop: pass multi-page bvec to iov_iter Ming Lei 2019-01-21 8:17 ` [PATCH V14 12/18] bcache: avoid to use bio_for_each_segment_all() in bch_bio_alloc_pages() Ming Lei 2019-01-21 8:18 ` [PATCH V14 13/18] block: allow bio_for_each_segment_all() to iterate over multi-page bvec Ming Lei 2019-01-21 8:18 ` [PATCH V14 14/18] block: enable multipage bvecs Ming Lei 2019-01-21 8:18 ` [PATCH V14 15/18] block: always define BIO_MAX_PAGES as 256 Ming Lei 2019-01-21 8:18 ` [PATCH V14 16/18] block: document usage of bio iterator helpers Ming Lei 2019-01-21 8:18 ` [PATCH V14 17/18] block: kill QUEUE_FLAG_NO_SG_MERGE Ming Lei 2019-01-21 8:18 ` [PATCH V14 18/18] block: kill BLK_MQ_F_SG_MERGE Ming Lei 2019-01-21 8:22 ` [PATCH V14 00/18] block: support multi-page bvec Christoph Hellwig 2019-01-21 8:37 ` Ming Lei 2019-01-21 8:38 ` Christoph Hellwig 2019-01-21 8:40 ` Ming Lei 2019-01-21 9:43 ` Sagi Grimberg 2019-01-22 2:01 ` 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=20190121081805.32727-5-ming.lei@redhat.com \ --to=ming.lei@redhat.com \ --cc=axboe@kernel.dk \ --cc=cluster-devel@redhat.com \ --cc=colyli@suse.de \ --cc=darrick.wong@oracle.com \ --cc=dchinner@redhat.com \ --cc=dm-devel@redhat.com \ --cc=dsterba@suse.com \ --cc=gaoxiang25@huawei.com \ --cc=hch@lst.de \ --cc=kent.overstreet@gmail.com \ --cc=linux-bcache@vger.kernel.org \ --cc=linux-block@vger.kernel.org \ --cc=linux-btrfs@vger.kernel.org \ --cc=linux-ext4@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=linux-raid@vger.kernel.org \ --cc=linux-xfs@vger.kernel.org \ --cc=ooo@electrozaur.com \ --cc=osandov@fb.com \ --cc=rpeterso@redhat.com \ --cc=sagi@grimberg.me \ --cc=snitzer@redhat.com \ --cc=tytso@mit.edu \ --cc=viro@zeniv.linux.org.uk \ /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
Linux-BTRFS Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-btrfs/0 linux-btrfs/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-btrfs linux-btrfs/ https://lore.kernel.org/linux-btrfs \ linux-btrfs@vger.kernel.org public-inbox-index linux-btrfs Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-btrfs AGPL code for this site: git clone https://public-inbox.org/public-inbox.git