lkml.org 
[lkml]   [2019]   [Feb]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V15 04/18] block: introduce multi-page bvec helpers
    Date
    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
    \
     
     \ /
      Last update: 2019-02-15 12:16    [W:8.869 / U:0.416 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site