From patchwork Fri May 25 03:45:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ming Lei X-Patchwork-Id: 10426023 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 7C0DE602D6 for ; Fri, 25 May 2018 03:47:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6ACEF2959E for ; Fri, 25 May 2018 03:47:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5ED60295A4; Fri, 25 May 2018 03:47:42 +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 CFB682959E for ; Fri, 25 May 2018 03:47:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CC2A36B0292; Thu, 24 May 2018 23:47:40 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id C73C26B0294; Thu, 24 May 2018 23:47:40 -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 B618E6B0295; Thu, 24 May 2018 23:47:40 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-qt0-f200.google.com (mail-qt0-f200.google.com [209.85.216.200]) by kanga.kvack.org (Postfix) with ESMTP id 8B58C6B0292 for ; Thu, 24 May 2018 23:47:40 -0400 (EDT) Received: by mail-qt0-f200.google.com with SMTP id j33-v6so2816367qtc.18 for ; Thu, 24 May 2018 20:47:40 -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=RYyutMeB6jf12NTdGi3zXSK0qQFA7jGlwXCvwAtr1e8=; b=hCGIWe2S7IWdIbzyjta1ZOH6L/BQtYkg7LssqAcoChXKoX6w9gImdZLq23lF46+ZH6 9BFgawJ0GLoF34Xqm5yrI3bvlul7ahE6GVcW8C/arhMuDsJ2oDeJ3heMmJLs19nli/o6 76wVEJtgP83UtnmZzs6zfN+Z5lXW2va7UbO+A21E4mXa8T2jWCZB/cZkFRXP/slVzN2f fMJAbJmnHXML0NnZjBudqMHJt6tXJIZKu1XbgBpzE6dSsJwp9qdn4cJPk2L9/MbrVufQ mr3ippP4iw+L5eacsbuUTEphcT1jNRKW2H/gbxKZhfdmjM1nGk+SMmGVu7wXHoCGK23y 7AMw== 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: ALKqPwcZOTaPi1bDuNIPtr7p9Ng4fSy79kAh8heeiZuj4kuzc6qclaD0 z0WLJmmZIpjZtwfNts8Ic/IQW5q9RI/ACsRSeKMrtBg213XzN3I4XvnFhHi62ht34gKnTX5LgCr 8hCbBqhwokU05t0qgSio8HkvAXn6i/P9NcU7GuBHVAzsjnH8OygLJNvDWXUdQFHZUvw== X-Received: by 2002:ac8:2724:: with SMTP id g33-v6mr581369qtg.37.1527220060353; Thu, 24 May 2018 20:47:40 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJOcEo1gSOFEcRO3m/KLDcAsm6LtjFZ2gapZzXXBkCq8L4LCMTI1+D60sR0U1TO5btwnGee X-Received: by 2002:ac8:2724:: with SMTP id g33-v6mr581348qtg.37.1527220059707; Thu, 24 May 2018 20:47:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527220059; cv=none; d=google.com; s=arc-20160816; b=tXMPDO5rSauNVtR9PD86S8vntdQCWSznUd8E6PxoZd8w8EYnnGxl81P0GFl8SwHeMc kihMBaWnPEhwY7G8MPLSgsC7ArifgYhEdBKvp8Jnd2UVr09ozbGw0/EXlVM6qqiFHouU 4soPj4EgsfVMOTLq4gLd7K1xlF/oiUyEQwqE6ehdqYHLKqY/fzcNlpwoqtYSpPr0Dy37 pzJKoUcnkDichECI1b+vRh27K6pT5v1Ink4ZWdpZjM1mmS8bhi8ImHTkkycl6QPnPM8s v76fozc+w+zLQLsHy7sKePWdvj8OeNDxNbZsKqQOU/mw179LKFwQGD/xzacBFCZ6Vd5K O44Q== 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=RYyutMeB6jf12NTdGi3zXSK0qQFA7jGlwXCvwAtr1e8=; b=W5u+MePkbI89q7sA3klpW0s5BWvk0SQvYPoO1GgThaZuAq5qLjS+iwzbGod07Ka9f2 lQMnMGheclFZTfYaMfQZZBK/ET2GZ33PROmSPFrciJwV6PFWOzvts2/BotM0Ib+zURMW sWkxppDRgIRUAXUstYbA5hmcA4OGgpdcXrpj0jUiFiIY0edSJwjvFSL94tXKE3X4nHhm TETOJgl8Y7kopSZoTpS1mgX2xx2U4qYZWHfnHBuia1ec0Ve/fmfMk8gfld4eDWk8qTCn wqKM9gmLwbzopqPMnyitsgdUILr4Dbc+G/76YzYm8wtaRsqa3aRjZAPbZiUUtF5eMX7O JJNg== 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 x42-v6si1772569qvf.286.2018.05.24.20.47.39 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 24 May 2018 20:47:39 -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-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:'' 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_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)), \