Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp8372182imu; Thu, 15 Nov 2018 10:27:02 -0800 (PST) X-Google-Smtp-Source: AJdET5eflQCoVEhUTeqFW7w9TzxcuDlCw7Qee7p++h223Io/JKjQwbtgCNTkTCe7WQ0hBzY1wFoZ X-Received: by 2002:a63:4566:: with SMTP id u38mr6817811pgk.4.1542306422383; Thu, 15 Nov 2018 10:27:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542306422; cv=none; d=google.com; s=arc-20160816; b=ETWCHx6ziOiDoStr45BlagtxjHMsMz16yjI3KgDm11JXUbxO8HxQO1ZL+1/WAN1Qfq GGNkqRVbQOFHWITRGIQQ9MD/rZvqnclv5pDf7DX8OQR1SCECd1TpBaJLB7cxDeKdsXFw pbq+Z9g27JUt0gzuqNiNhgCqNvmeOjeLIuiMlZZzB/1zv/fHDymVGhFjHeGDmTtZlUwA vu8l1CicfkWnBKZsPGvf5GGRAUjAMuchUadmauK7pSnRpzahhhI1nmHQ2Dkl5hQXjnaZ ypt8V8pVNB2K1u0Jt0aFOiFEaCxQ6s21jJsucPmKwvGzPTbC/iStytbG2UQ4y+BeNbss GdNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=LZBZD86Znd9LyHdczTLvGztQ2bKPH9Yi3lDzItF2KWw=; b=ivFFbGdqgzLjxzwmHxZ+DC57bxLyoIqrL5oOd1Nim9v+Eiyxffs4md6s4Jfm4JKsyY TN9CbBz01CBz0KSEn5fM52WGGYOy4OmqH/K6UGyPjhdxIbK/9ekk0n36MsUmcTHFoO3R VZ9g6rb73ce/s1l1wzkkkzd9/xUncZnNI8woRfxdXnnunq/Gj7ENKyDMuUW05wt4B81b 6Wg4+4Mjibz2IFvDD90WOLJ9UnTpviaKqP20EBIrzUAsQAPGXciv75Te84MOsMFhd2C1 YwcJwPR0Di6HUnj1iuitb57RsCq2kW/xX9VO4bawlUWL/Nm41ZsXDFDtd5iSAuhGX3v+ Qk/Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@osandov-com.20150623.gappssmtp.com header.s=20150623 header.b="hqxoBng/"; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n8-v6si15344768plp.183.2018.11.15.10.26.47; Thu, 15 Nov 2018 10:27:02 -0800 (PST) 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; dkim=pass header.i=@osandov-com.20150623.gappssmtp.com header.s=20150623 header.b="hqxoBng/"; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388869AbeKPEe5 (ORCPT + 99 others); Thu, 15 Nov 2018 23:34:57 -0500 Received: from mail-pg1-f196.google.com ([209.85.215.196]:33938 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388454AbeKPEe4 (ORCPT ); Thu, 15 Nov 2018 23:34:56 -0500 Received: by mail-pg1-f196.google.com with SMTP id 17so9116440pgg.1 for ; Thu, 15 Nov 2018 10:26:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=osandov-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=LZBZD86Znd9LyHdczTLvGztQ2bKPH9Yi3lDzItF2KWw=; b=hqxoBng/CavFPILF3XTaCP0hdlrGVTFYcEVuZcRu1M2nQ/9ofUYBnVA6xdnpWWuy3d tLemHB+WZvRYGPE8HH+OLncnhKhFjbQc0l1MYLbbqxnLZoziaQZ6eQ7TOcl7OyVsBZWb CuLQ6BoHuCVbf7yWa7Qmcb1Jt0K44fRqsJYsnhUmjPZav58fEHLN5MMo60kHxUHefXnl K+t0Zu6g8DOdCvuNJHLcYJLRL/ktyo5YxUZMh2viTeAYDO4NRLCHsdZlcCWVUSnwJCLi pddtldwMDnlESbYlmjcwB0C2C+5aGF8SEQD30lRkhsiTdONGwuUR1Y3TWKmoT2O/sZYu cIhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=LZBZD86Znd9LyHdczTLvGztQ2bKPH9Yi3lDzItF2KWw=; b=BEVCws/21zeB86L5mb7W/4zL/Lra0+SmNdPqWT6A5CW3HQ3cabFZciDnqwYd9M1DLu p/GaRckPjDYGydtbV/i5MqdQt49324cm5jWxXCzCY7iZa4jQPwLJ2WRKgwAplTBM61e3 1WmX1bQ8y+7RqwV7CQGbLcfs9qF0WC0mmYwBa6j2777LmSr/gPgKrK7R9iW6mf3q+CVb 4i4u8lqv10eYliG4ORG5S5faqmDZBmyL9v6/AACrjMYl1ttUrz7pu3o31tTx3utfmVZJ 26mbNzS5wl9wusufpVs2lsBW6T9uQH8fTqU/XCLQVQLYUmnaXwI+S3Nx5Q5k0HMw+ABi 9B2Q== X-Gm-Message-State: AGRZ1gKLHEfWmcp6uatm+ZH8efxlRs1vZ2gSQIxnVSeKdb720O/d9111 xMHwPn1sECBwam4pV38e8HaChA== X-Received: by 2002:a62:5343:: with SMTP id h64-v6mr7523295pfb.226.1542306362402; Thu, 15 Nov 2018 10:26:02 -0800 (PST) Received: from vader ([64.114.255.97]) by smtp.gmail.com with ESMTPSA id x12sm26569212pgr.55.2018.11.15.10.26.00 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 15 Nov 2018 10:26:01 -0800 (PST) Date: Thu, 15 Nov 2018 10:25:59 -0800 From: Omar Sandoval To: Ming Lei Cc: Jens Axboe , linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Dave Chinner , Kent Overstreet , Mike Snitzer , dm-devel@redhat.com, Alexander Viro , linux-fsdevel@vger.kernel.org, Shaohua Li , linux-raid@vger.kernel.org, linux-erofs@lists.ozlabs.org, David Sterba , linux-btrfs@vger.kernel.org, "Darrick J . Wong" , linux-xfs@vger.kernel.org, Gao Xiang , Christoph Hellwig , Theodore Ts'o , linux-ext4@vger.kernel.org, Coly Li , linux-bcache@vger.kernel.org, Boaz Harrosh , Bob Peterson , cluster-devel@redhat.com Subject: Re: [PATCH V10 01/19] block: introduce multi-page page bvec helpers Message-ID: <20181115182559.GA9348@vader> References: <20181115085306.9910-1-ming.lei@redhat.com> <20181115085306.9910-2-ming.lei@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20181115085306.9910-2-ming.lei@redhat.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Nov 15, 2018 at 04:52:48PM +0800, Ming Lei wrote: > This patch introduces helpers of 'mp_bvec_iter_*' for multipage > 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. > > Cc: Dave Chinner > Cc: Kent Overstreet > Cc: Mike Snitzer > Cc: dm-devel@redhat.com > Cc: Alexander Viro > Cc: linux-fsdevel@vger.kernel.org > Cc: Shaohua Li > Cc: linux-raid@vger.kernel.org > Cc: linux-erofs@lists.ozlabs.org > Cc: David Sterba > Cc: linux-btrfs@vger.kernel.org > Cc: Darrick J. Wong > Cc: linux-xfs@vger.kernel.org > Cc: Gao Xiang > Cc: Christoph Hellwig > Cc: Theodore Ts'o > Cc: linux-ext4@vger.kernel.org > Cc: Coly Li > Cc: linux-bcache@vger.kernel.org > Cc: Boaz Harrosh > Cc: Bob Peterson > Cc: cluster-devel@redhat.com Reviewed-by: Omar Sandoval But a couple of comments below. > 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 02c73c6aa805..8ef904a50577 100644 > --- a/include/linux/bvec.h > +++ b/include/linux/bvec.h > @@ -23,6 +23,44 @@ > #include > #include > #include > +#include > + > +/* > + * What is multi-page bvecs? > + * > + * - bvecs stored in bio->bi_io_vec is always multi-page(mp) style > + * > + * - bvec(struct bio_vec) represents one physically contiguous I/O > + * buffer, now the buffer may include more than one pages after > + * multi-page(mp) bvec is supported, and all these pages represented > + * by one bvec is physically contiguous. Before mp support, at most > + * one page is included in one bvec, we call it single-page(sp) > + * bvec. > + * > + * - .bv_page of the bvec represents the 1st page in the mp bvec > + * > + * - .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*() will be changed to return single-page > + * 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) single-page bvec is built in flight by bvec > + * helpers from the stored multipage bvec > + * > + * - In case that some components(such as iov_iter) need to support > + * multi-page bvec, we introduce new helpers(mp_bvec_iter_*) for > + * them. > + */ This comment sounds more like a commit message (i.e., how were things before, and how are we changing them). In a couple of years when I read this code, I probably won't care how it was changed, just how it works. So I think a comment explaining the concepts of multi-page and single-page bvecs is very useful, but please move all of the "foo was changed" and "before mp support" type stuff to the commit message. > /* > * was unsigned short, but we might as well be ready for > 64kB I/O pages > @@ -50,16 +88,35 @@ struct bvec_iter { > */ > #define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx]) > > -#define bvec_iter_page(bvec, iter) \ > +#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) > + > +/* > + * of single-page(sp) segment. > + * > + * This helpers are for building sp 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))))) The parentheses around (bvec_iter_offset((bvec), (iter))) and (PAGE_SIZE - (bvec_iter_offset((bvec), (iter)))) are unnecessary clutter. This looks easier to read to me: #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 >