From: Greg Kroah-Hartman Date: Mon, 8 Nov 2021 07:01:23 +0000 (+0100) Subject: 4.14-stable patches X-Git-Tag: v4.4.292~44 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5292487593bfbd6a7fd1513054ef41652b5dfa52;p=thirdparty%2Fkernel%2Fstable-queue.git 4.14-stable patches added patches: block-introduce-multi-page-bvec-helpers.patch --- diff --git a/queue-4.14/block-introduce-multi-page-bvec-helpers.patch b/queue-4.14/block-introduce-multi-page-bvec-helpers.patch new file mode 100644 index 00000000000..6377e92c24b --- /dev/null +++ b/queue-4.14/block-introduce-multi-page-bvec-helpers.patch @@ -0,0 +1,113 @@ +From 3d75ca0adef4280650c6690a0c4702a74a6f3c95 Mon Sep 17 00:00:00 2001 +From: Ming Lei +Date: Fri, 15 Feb 2019 19:13:10 +0800 +Subject: block: introduce multi-page bvec helpers + +From: Ming Lei + +commit 3d75ca0adef4280650c6690a0c4702a74a6f3c95 upstream. + +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 +Reviewed-by: Omar Sandoval +Signed-off-by: Ming Lei +Signed-off-by: Jens Axboe +Cc: Zubin Mithra +Signed-off-by: Greg Kroah-Hartman +--- + include/linux/bvec.h | 30 +++++++++++++++++++++++++++--- + 1 file changed, 27 insertions(+), 3 deletions(-) + +--- a/include/linux/bvec.h ++++ b/include/linux/bvec.h +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + + /* + * was unsigned short, but we might as well be ready for > 64kB I/O pages +@@ -52,16 +53,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)), \ diff --git a/queue-4.14/series b/queue-4.14/series index 06594d7464e..24cd4dad086 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -5,3 +5,4 @@ arch-pgtable-define-max_possible_physmem_bits-where-needed.patch arm-9120-1-revert-amba-make-use-of-1-irqs-warn.patch ib-qib-use-struct_size-helper.patch ib-qib-protect-from-buffer-overflow-in-struct-qib_user_sdma_pkt-fields.patch +block-introduce-multi-page-bvec-helpers.patch