Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp2997048imm; Thu, 24 May 2018 20:48:32 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpxQHQzGxac+2PykBFBbyt6Ujc5De4ziKOFuKd5XKE5weK/P/+Cy+LFPp/qyZKRSfUZ2IDR X-Received: by 2002:a63:380e:: with SMTP id f14-v6mr635110pga.242.1527220112078; Thu, 24 May 2018 20:48:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527220112; cv=none; d=google.com; s=arc-20160816; b=w9CwCAelhv8vrQ2CPZrm/XsTLYdbXEpNivPHgFZm5x7tbgPmaebi4Ahzzeuv4O4nz6 TcS1nPFcdsip39k59EC/VvBEQ+FT8CGTfcR9DfxAKSy6R10CNgiEYm/L0LIHDOqqEjlz rMPe7S05DPygoI+YbVli49Qw1ggUVPM7tszUut8DAZBEx6EdHWzofItu3wRWjoUBd5zW GsenVKHHtxiiy9yc3DjL7+jnfzXKge1BTXFjrvDvQ/qArfX94iz9mJwaRf93efDtNjJm cTPboAz69Ostd3QdvWIhw/L7uPdjgqtVfboz0m5bRdedZIenJ4tGCf5JmzGQk7ezaA6f YW2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=RYyutMeB6jf12NTdGi3zXSK0qQFA7jGlwXCvwAtr1e8=; b=oIG1fLSiiI2BJk8LY6CdCzQZQaIiCu37qweZbDt/Zqs34IeOVSiBYL6HAVgDbUGWyD vtCeUKRqBW9wbDbUR7U16XjoQo1PFzN+IT07pdfmPa4oWGa9kIORQI9hk5DpPkltWNtn bPdecAVAwzbwpbFYcq+cHz92SPU8cT5cuRa1E5tKX+shRiGMykAesYPxar5FVgEWIvjX 4E7JKf6pnUbL6wQMz+QCCmPeK5q0IYFUJ+XOSOjQ6c/cagfsxWbgTaLwaJfZyVI4c/Ac wEYr2DTuz+3HL0asIhguCUOqfsH1ReABzHgchuJ9pD9wargTzAd2uem4gBMM2FTeIlZ4 kQDQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n59-v6si22422190plb.198.2018.05.24.20.48.17; Thu, 24 May 2018 20:48:32 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755336AbeEYDrm (ORCPT + 99 others); Thu, 24 May 2018 23:47:42 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:37868 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755319AbeEYDrk (ORCPT ); Thu, 24 May 2018 23:47:40 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 469884022414; Fri, 25 May 2018 03:47:39 +0000 (UTC) Received: from localhost (ovpn-12-30.pek2.redhat.com [10.72.12.30]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5D541200BCBB; Fri, 25 May 2018 03:47:30 +0000 (UTC) From: Ming Lei To: Jens Axboe , Christoph Hellwig , Alexander Viro , Kent Overstreet Cc: David Sterba , Huang Ying , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, Theodore Ts'o , "Darrick J . Wong" , Coly Li , Filipe Manana , Ming Lei Subject: [RESEND PATCH V5 04/33] block: introduce multipage page bvec helpers Date: Fri, 25 May 2018 11:45:52 +0800 Message-Id: <20180525034621.31147-5-ming.lei@redhat.com> In-Reply-To: <20180525034621.31147-1-ming.lei@redhat.com> References: <20180525034621.31147-1-ming.lei@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Fri, 25 May 2018 03:47:39 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Fri, 25 May 2018 03:47:39 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'ming.lei@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch introduces helpers of 'bvec_iter_segment_*' for multipage bvec(segment) support. The introduced interfaces treate one bvec as real multipage segment, for example, .bv_len is the total length of the multipage segment. The existed helpers of bvec_iter_* are interfaces for supporting current bvec iterator which is thought as singlepage only by drivers, fs, dm and etc. These helpers will build singlepage bvec in flight, so users of current bio/bvec iterator still can work well and needn't change even though we store real multipage segment into bvec table. Signed-off-by: Ming Lei --- include/linux/bvec.h | 63 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/include/linux/bvec.h b/include/linux/bvec.h index fe7a22dd133b..2433c73fa5ea 100644 --- a/include/linux/bvec.h +++ b/include/linux/bvec.h @@ -23,6 +23,44 @@ #include #include #include +#include + +/* + * What is multipage bvecs(segment)? + * + * - bvec stored in bio->bi_io_vec is always multipage(mp) style + * + * - bvec(struct bio_vec) represents one physically contiguous I/O + * buffer, now the buffer may include more than one pages since + * multipage(mp) bvec is supported, and all these pages represented + * by one bvec is physically contiguous. Before mp support, at most + * one page can be included in one bvec, we call it singlepage(sp) + * bvec. + * + * - .bv_page of th bvec represents the 1st page in the mp segment + * + * - .bv_offset of the bvec represents 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_page() still returns bvec with single page + * + * - bio_for_each_page_all() will be changed to return singlepage + * bvec too + * + * - during iterating, iterator variable(struct bvec_iter) is always + * updated in multipage bvec style and that means bvec_iter_advance() + * is kept not changed + * + * - returned(copied) singlepage bvec is generated in flight by bvec + * helpers from the stored multipage bvec(segment) + * + * - In case that some components(such as iov_iter) need to support + * multipage segment, we introduce new helpers(bvec_iter_segment_*) for + * them. + */ /* * was unsigned short, but we might as well be ready for > 64kB I/O pages @@ -52,16 +90,35 @@ struct bvec_iter { */ #define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx]) -#define bvec_iter_page(bvec, iter) \ +#define bvec_iter_segment_page(bvec, iter) \ (__bvec_iter_bvec((bvec), (iter))->bv_page) -#define bvec_iter_len(bvec, iter) \ +#define bvec_iter_segment_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 bvec_iter_segment_offset(bvec, iter) \ (__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done) +#define bvec_iter_page_idx_in_seg(bvec, iter) \ + (bvec_iter_segment_offset((bvec), (iter)) / PAGE_SIZE) + +/* + * of singlepage(sp) segment. + * + * This helpers will be implemented for building sp bvec in flight. + */ +#define bvec_iter_offset(bvec, iter) \ + (bvec_iter_segment_offset((bvec), (iter)) % PAGE_SIZE) + +#define bvec_iter_len(bvec, iter) \ + min_t(unsigned, bvec_iter_segment_len((bvec), (iter)), \ + (PAGE_SIZE - (bvec_iter_offset((bvec), (iter))))) + +#define bvec_iter_page(bvec, iter) \ + nth_page(bvec_iter_segment_page((bvec), (iter)), \ + bvec_iter_page_idx_in_seg((bvec), (iter))) + #define bvec_iter_bvec(bvec, iter) \ ((struct bio_vec) { \ .bv_page = bvec_iter_page((bvec), (iter)), \ -- 2.9.5