From patchwork Sat Jun 9 12:29:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ming Lei X-Patchwork-Id: 10455527 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 7ADDA60467 for ; Sat, 9 Jun 2018 12:31:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6C8E9223A4 for ; Sat, 9 Jun 2018 12:31:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 60CE0223A6; Sat, 9 Jun 2018 12:31:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D02CE223A4 for ; Sat, 9 Jun 2018 12:31:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E06C26B000E; Sat, 9 Jun 2018 08:31:27 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id D8C846B0010; Sat, 9 Jun 2018 08:31:27 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C56166B0266; Sat, 9 Jun 2018 08:31:27 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-qk0-f200.google.com (mail-qk0-f200.google.com [209.85.220.200]) by kanga.kvack.org (Postfix) with ESMTP id 95FCC6B000E for ; Sat, 9 Jun 2018 08:31:27 -0400 (EDT) Received: by mail-qk0-f200.google.com with SMTP id w203-v6so15150683qkb.16 for ; Sat, 09 Jun 2018 05:31:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=GdaxfSbcBSnTKFIYMdkMZCsyRJ6vTk5VphSKngUz/KY=; b=X1tQXdBebgdJ2/Cgu9ZYsprzy/q3IV/ebBiuhMFIwGLDGfYmEjtKbcZMv8jGXiADkp tXOmyG9J3isw9dwcZpT8d/opNnqglIdbur0Do6UUU5E+Rldfk5qpeVVfrC5zDLkSFis8 lzKoJj/vb7xGOoKimiZJtC3TM/9+qi5DfGY+OePx4Z+aEsKpIgJHm9cIM3KL95/DWn3S dzMPfRFa3LEi0hoTvk4WEgIUa89PG1E7RG8WpEeO5yCZRGL9fOPq+K56YQEfra9ylesn 37BI2Ht+kJ/w9npOaZJAnSRWNQmPLySohL4n8KY51m1DcoSyvsnrFcAfzEtIIebcl7ru B9Dg== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ming.lei@redhat.com designates 66.187.233.73 as permitted sender) smtp.mailfrom=ming.lei@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com X-Gm-Message-State: APt69E3axuvXcI2VodZYZR4ySmu2KZQAUF9TCPIZ2Ti0eseDPiT6yEmH 8zr5jxZJkiUEUNFskrwQzlhr0lKwyQv87LO4Rqo0Ue4OSCoD/Nck2NQ/yd9ZceNPhhNRGJ58F3p NehQENYoHOU4GfC8U5kK6DS8XqGDSCwUjlQAhFK/PCsyCoEGfGI/18Ar65p93ZNTQyA== X-Received: by 2002:a0c:e2cd:: with SMTP id t13-v6mr8932544qvl.47.1528547487336; Sat, 09 Jun 2018 05:31:27 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLFsrsbCTGcfB7C7DfpBzDdeRBse0N+SqriIr0mHFwhlUFvF32Vj/SmqYCoeL35roIem7W0 X-Received: by 2002:a0c:e2cd:: with SMTP id t13-v6mr8932511qvl.47.1528547486513; Sat, 09 Jun 2018 05:31:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528547486; cv=none; d=google.com; s=arc-20160816; b=EiL89vW13UJc9sYFuV8YbG8BlZu5RRJDJsDw5B7E5pe1wCKalKHnnLyBlaBYQl3AcN wT0Z+2m2h+vsEkiudAKwgDtPW7FO8JjszjukUJ3S4eO7zf1vmH1H75b0tJL5fxX9WRDf 2ZYxE8oQn4tZzp7suL2RoanpASzzQo9s5t85XFR1zQ6yRIecLrghnm79bTvR3onZxZRo pGrl7j21lgzotLdhDAD0mTF5bGbQ1nRmy9qP6iZiI82FUStp1AVKPu00VfdhxfFNMMRL CAzWHh0FGWeve2EwXfOOggL7O2ZxxyYta39UwJnpjnqZvGMZOq+570vuvN+6Jk6fQNQD N8PQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=GdaxfSbcBSnTKFIYMdkMZCsyRJ6vTk5VphSKngUz/KY=; b=lM1TTiNevrta82xpx/L6V+cLzCK55M4lVUbdFAnd81mXfeIPIIG5FceiYCy994Z1qP Y9jxQ7UOr4fUdEr1USo5zUweq6mB4A3kjSSYrT9zOoZiO5l2W+4qevHoYETZf/x/BJX5 vRR5nNgYy6jP2utt7Mabw07WQFSCZHnh4zvcZzvWdyRfbAT6jPm3j5TRc+nePQr/yXgP 5G2/fMAcL/X2HuS2w3C6AtEI0Z5kkEc0/FauBu8Sa0FFL4f4eDnSN09aY2X7wt5xbYSf fsVNheYJAhff4Ot4jlyWt/ir0DKX1OUd5V3FnIVjBK1S0DqPVMPRHjKPxoDIOlKkOsZM JcqA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ming.lei@redhat.com designates 66.187.233.73 as permitted sender) smtp.mailfrom=ming.lei@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from mx1.redhat.com (mx3-rdu2.redhat.com. [66.187.233.73]) by mx.google.com with ESMTPS id d3-v6si6905771qkf.178.2018.06.09.05.31.26 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 09 Jun 2018 05:31:26 -0700 (PDT) Received-SPF: pass (google.com: domain of ming.lei@redhat.com designates 66.187.233.73 as permitted sender) client-ip=66.187.233.73; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ming.lei@redhat.com designates 66.187.233.73 as permitted sender) smtp.mailfrom=ming.lei@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1D8CC401EF22; Sat, 9 Jun 2018 12:31:26 +0000 (UTC) Received: from localhost (ovpn-12-40.pek2.redhat.com [10.72.12.40]) by smtp.corp.redhat.com (Postfix) with ESMTP id F38D42166BB2; Sat, 9 Jun 2018 12:31:17 +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 , Randy Dunlap , Ming Lei Subject: [PATCH V6 04/30] block: introduce multipage page bvec helpers Date: Sat, 9 Jun 2018 20:29:48 +0800 Message-Id: <20180609123014.8861-5-ming.lei@redhat.com> In-Reply-To: <20180609123014.8861-1-ming.lei@redhat.com> References: <20180609123014.8861-1-ming.lei@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Sat, 09 Jun 2018 12:31:26 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Sat, 09 Jun 2018 12:31:26 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'ming.lei@redhat.com' RCPT:'' X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP This patch introduces helpers of 'bvec_iter_chunk_*' for multipage bvec(chunk) support. The introduced interfaces treate one bvec as real multipage chunk, for example, .bv_len is the total length of the multipage chunk. 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 chunk 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..52c90ea1a96a 100644 --- a/include/linux/bvec.h +++ b/include/linux/bvec.h @@ -23,6 +23,44 @@ #include #include #include +#include + +/* + * What is multipage bvecs(chunk)? + * + * - 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 chunk + * + * - .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_segment() still returns bvec with single page + * + * - bio_for_each_segment_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(chunk) + * + * - In case that some components(such as iov_iter) need to support + * multipage chunk, we introduce new helpers(bvec_iter_chunk_*) 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_chunk_page(bvec, iter) \ (__bvec_iter_bvec((bvec), (iter))->bv_page) -#define bvec_iter_len(bvec, iter) \ +#define bvec_iter_chunk_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_chunk_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_chunk_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_chunk_offset((bvec), (iter)) % PAGE_SIZE) + +#define bvec_iter_len(bvec, iter) \ + min_t(unsigned, bvec_iter_chunk_len((bvec), (iter)), \ + (PAGE_SIZE - (bvec_iter_offset((bvec), (iter))))) + +#define bvec_iter_page(bvec, iter) \ + nth_page(bvec_iter_chunk_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)), \