Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp727821pxb; Tue, 2 Feb 2021 16:53:21 -0800 (PST) X-Google-Smtp-Source: ABdhPJzNsYQjn2rrGMomWM7WkNZIdwSh+9vb7XFW6EXhzDatBWDreXrFl/9w2Z5kssMp04+Dtpf5 X-Received: by 2002:a05:6402:270d:: with SMTP id y13mr647817edd.149.1612313601757; Tue, 02 Feb 2021 16:53:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612313601; cv=none; d=google.com; s=arc-20160816; b=ZBHSqKGllbjGUrDs9RS4zx6k58A0fdJR4iZuMBeQ2GMRtK33NiL3LV1oY3vGqHZ3u9 3Ayik+oLT/689N+64SdoBz56mwDNg7v1HwkXCc3Hsckx03mI2UH+orw+NM+3JBDiKAdZ 49eBhz77R7tRZeQU0mNZnxA8vxeZQjZH1B54Iil4vZi5rpjJXtJ9h+dsyyFbDRdfX+FQ Dbee954S1kWcprDsGlWR3+VCo2rqhlLj8omp+To+ZCeRryZ3e5wMLrL8xWI7Jzoflt56 1WNrakjzjVMxGVvajNf8LqBewlvwc9LKuwHyz7Hmb9lxJI3YyvJSdQV3jwNJ+5t+Dd4p yUZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=Ati122XhLaYSeaerV7pQeSuosw1/6ceZp4MbDrkDH9I=; b=ZujoP6Aa+K4RfruWdsEBSB7Pf1m7ES+p9YCUutqx0sCACr+edd4bBtUDLuu36rlNKi VsnI2Gph4nEL5awd58NnxggCb0y7AaFRyiDUOOyasHn01n0AHRJ8Dk9fA88BulaDbdjH U9MkTMpZfoVEbHKA++D/2aKkwK9tZR2OwQS7+BWQGXvUt0J6JJWF84PMQoMFt47F18R+ DYdbBUPgd29xB49z5t68SC383RETfKAarnaxeGw1eb9ouJVZMNsAC8cdEg1KbnvkJRiq ND/VZIrT13K66tOZMhNcHoopvbjFZWCpiv6sWZv/LGpJijBprvTlZcs3Su9KTrsnT7cg 08dQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id mm7si314198ejb.575.2021.02.02.16.52.34; Tue, 02 Feb 2021 16:53:21 -0800 (PST) Received-SPF: pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233394AbhBBVva (ORCPT + 99 others); Tue, 2 Feb 2021 16:51:30 -0500 Received: from p3plsmtpa08-02.prod.phx3.secureserver.net ([173.201.193.103]:46524 "EHLO p3plsmtpa08-02.prod.phx3.secureserver.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233348AbhBBVv3 (ORCPT ); Tue, 2 Feb 2021 16:51:29 -0500 Received: from [192.168.0.116] ([71.184.94.153]) by :SMTPAUTH: with ESMTPSA id 73ZIl6h4ZkAYp73ZJlmZzX; Tue, 02 Feb 2021 14:50:41 -0700 X-CMAE-Analysis: v=2.4 cv=RcpVt3hv c=1 sm=1 tr=0 ts=6019c931 a=vbvdVb1zh1xTTaY8rfQfKQ==:117 a=vbvdVb1zh1xTTaY8rfQfKQ==:17 a=IkcTkHD0fZMA:10 a=SEc3moZ4AAAA:8 a=yPCof4ZbAAAA:8 a=h3muV4oDa6vXNKoF7IcA:9 a=QEXdDO2ut3YA:10 a=5oRCH6oROnRZc2VpWJZ3:22 X-SECURESERVER-ACCT: tom@talpey.com Subject: Re: [PATCH v1] xprtrdma: Simplify rpcrdma_convert_kvec() and frwr_map() To: Chuck Lever Cc: Anna Schumaker , Linux NFS Mailing List , "linux-rdma@vger.kernel.org" References: <161227696787.3689758.305854118266206775.stgit@manet.1015granger.net> From: Tom Talpey Message-ID: <23f6893c-de31-0382-78a4-c09b1ceb2787@talpey.com> Date: Tue, 2 Feb 2021 16:50:42 -0500 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Thunderbird/68.12.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-CMAE-Envelope: MS4xfJORGXYV/A+JI8EQljKg1Y0KXoX8pnqV9wXmXYK7tOw3HZC1WpPw2m53n6oGJq5IHj16h4O5g5nzceOWj/yEdLHE+t+C7I3yewiIA1JRI10hdFyd1Toy XMyVq5hpn6Fu8KS+56caPOgyYsidGXAPYUQuoFVVVR9/SEGh0ZTDxYbPymPP7Gvh/fGBAl+bJnTYc923QAiaDLAVcJaCGMHh9odtR+VhclbAoSTjZMZxX/rQ BxUUBEA3XORCOSIwJsm/oZSmw35+/0po7712vTVicI4o9hFBJo9gagCVDsjui/kmNZknfSVXX9tBl1DjEBuuDA== Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org On 2/2/2021 2:20 PM, Chuck Lever wrote: > > >> On Feb 2, 2021, at 2:18 PM, Tom Talpey wrote: >> >> What's not to like about a log that uses the words "with aplomb"? :) >> >> Minor related comment/question below. >> >> On 2/2/2021 9:42 AM, Chuck Lever wrote: >>> Clean up. >>> Support for FMR was removed by commit ba69cd122ece ("xprtrdma: >>> Remove support for FMR memory registration") [Dec 2018]. That means >>> the buffer-splitting behavior of rpcrdma_convert_kvec(), added by >>> commit 821c791a0bde ("xprtrdma: Segment head and tail XDR buffers >>> on page boundaries") [Mar 2016], is no longer necessary. FRWR >>> memory registration handles this case with aplomb. >>> A related simplification removes an extra conditional branch from >>> the SGL set-up loop in frwr_map(): Instead of using either >>> sg_set_page() or sg_set_buf(), initialize the mr_page field properly >>> when rpcrdma_convert_kvec() converts the kvec to an SGL entry. >>> frwr_map() can then invoke sg_set_page() unconditionally. >>> Signed-off-by: Chuck Lever >>> --- >>> net/sunrpc/xprtrdma/frwr_ops.c | 10 ++-------- >>> net/sunrpc/xprtrdma/rpc_rdma.c | 21 +++++---------------- >>> net/sunrpc/xprtrdma/xprt_rdma.h | 2 +- >>> 3 files changed, 8 insertions(+), 25 deletions(-) >>> diff --git a/net/sunrpc/xprtrdma/frwr_ops.c b/net/sunrpc/xprtrdma/frwr_ops.c >>> index baca49fe83af..5eb044a5f0be 100644 >>> --- a/net/sunrpc/xprtrdma/frwr_ops.c >>> +++ b/net/sunrpc/xprtrdma/frwr_ops.c >>> @@ -306,14 +306,8 @@ struct rpcrdma_mr_seg *frwr_map(struct rpcrdma_xprt *r_xprt, >>> if (nsegs > ep->re_max_fr_depth) >>> nsegs = ep->re_max_fr_depth; >>> for (i = 0; i < nsegs;) { >>> - if (seg->mr_page) >>> - sg_set_page(&mr->mr_sg[i], >>> - seg->mr_page, >>> - seg->mr_len, >>> - offset_in_page(seg->mr_offset)); >>> - else >>> - sg_set_buf(&mr->mr_sg[i], seg->mr_offset, >>> - seg->mr_len); >>> + sg_set_page(&mr->mr_sg[i], seg->mr_page, >>> + seg->mr_len, offset_in_page(seg->mr_offset)); >>> ++seg; >>> ++i; >>> diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c >>> index 8f5d0cb68360..529adb6ad4db 100644 >>> --- a/net/sunrpc/xprtrdma/rpc_rdma.c >>> +++ b/net/sunrpc/xprtrdma/rpc_rdma.c >>> @@ -204,9 +204,7 @@ rpcrdma_alloc_sparse_pages(struct xdr_buf *buf) >>> return 0; >>> } >>> -/* Split @vec on page boundaries into SGEs. FMR registers pages, not >>> - * a byte range. Other modes coalesce these SGEs into a single MR >>> - * when they can. >>> +/* Convert @vec to a single SGL element. >>> * >>> * Returns pointer to next available SGE, and bumps the total number >>> * of SGEs consumed. >>> @@ -215,21 +213,12 @@ static struct rpcrdma_mr_seg * >>> rpcrdma_convert_kvec(struct kvec *vec, struct rpcrdma_mr_seg *seg, >>> unsigned int *n) >>> { >>> - u32 remaining, page_offset; >>> - char *base; >>> - >>> - base = vec->iov_base; >>> - page_offset = offset_in_page(base); >>> - remaining = vec->iov_len; >>> - while (remaining) { >>> - seg->mr_page = NULL; >>> - seg->mr_offset = base; >>> - seg->mr_len = min_t(u32, PAGE_SIZE - page_offset, remaining); >>> - remaining -= seg->mr_len; >>> - base += seg->mr_len; >>> + if (vec->iov_len) { >>> + seg->mr_page = virt_to_page(vec->iov_base); >>> + seg->mr_offset = vec->iov_base; >>> + seg->mr_len = vec->iov_len; >>> ++seg; >>> ++(*n); >>> - page_offset = 0; >>> } >>> return seg; >>> } >>> diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h >>> index 94b28657aeeb..4a9fe6592795 100644 >>> --- a/net/sunrpc/xprtrdma/xprt_rdma.h >>> +++ b/net/sunrpc/xprtrdma/xprt_rdma.h >>> @@ -285,7 +285,7 @@ enum { >>> struct rpcrdma_mr_seg { /* chunk descriptors */ >>> u32 mr_len; /* length of chunk or segment */ >>> - struct page *mr_page; /* owning page, if any */ >>> + struct page *mr_page; /* underlying struct page */ >>> char *mr_offset; /* kva if no page, else offset */ >> >> Is this comment ("kva if no page") actually correct? The hunk just >> above is an example of a case where mr_page is set, yet mr_offset >> is an iov_base. Is iov_base not a kva? > > Ah, well the "if no page" part is now obsolete. > > I suppose it should be set to "offset_in_page(vec->iov_base)" ? Seems like it, yes. Assuming that only the first element in the sgl has a possibly non-zero offset ("FBO"). All others must be zero for the FRMR. Is it guaranteed that each kvec is at most one physical page? If not, then the length may span into a random physical page, that was not necessarily contiguous in the original KVA-addressed buffer. Tom.