Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp346051pxb; Tue, 2 Feb 2021 06:47:37 -0800 (PST) X-Google-Smtp-Source: ABdhPJy6/9Bh/nRbAklX5qLb0rVgQS7p8XvzyNIfxDUKYbKHVg1PrOvwtqmJ3cMpvV5KDpxYPAPK X-Received: by 2002:a05:6402:270d:: with SMTP id y13mr23790926edd.149.1612277256888; Tue, 02 Feb 2021 06:47:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612277256; cv=none; d=google.com; s=arc-20160816; b=v/hRkUdnm9ArM5SolpUz8YVhTZRQ2qE2GiilcmJd59DR6jsLLtObHy52Moj0coseYS nF3rV+evLwR1nhkus7L5BBCUsMxv9NClE5ZYZRBCu9OMwwxZxo9R4OTdTjkm0lJsI5vV ir9GP1muQArRBObAxMp8k2fy86YY0vqd/Ylao9t7D7fpTahLKp8yctjx65MAmlV99Z27 x5QhS8Ocpq5WnwLCGuIxbvUPiI7BBcao8CjNsDzawzscOTaijxqX0L+8ptcVitWB9B3i 6kr9zkhz6O2p1R4X6wfyVGtTNYArhiW7RJ9iZWRwd0/zKEOPO1KfdJsE+jINm6M4lZA3 na9A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:message-id:date:cc:to:from:subject; bh=liM+rBR2L15T/bJ9NsECWsawhH7iR8lUcQHlvCPtlmE=; b=gpO17fo56v5iK4uW8WURS+m1VRSPXIAVCegSPUgVDF2HbjhsaB83O+2FA9mlXb7JV5 EEEUbtl4ZikSFXwdJ/3397+VbGruHQwxe89sHNQJXzwkDsCB9HDyu3vB/Bw85LafCdt7 Jmo+uEH4fTJjAXsyt5gcxjP2KMpSS17Xb7mdpsOD3PwJDuikWfUjUN+UlA7pF87u2T7A oyHGcyACk1N1RPCjNl4upSeNZ6Cjqc1kGzQWzbN+ISDiD1IvmW7RAyRCprXu+KPN4aYM ka7eAwx8nGH576vkiZUJVyqkgTjGQM5zTyrqylKVMNilbCl2AL1OeB1j1TwyrtNlZWkp mRzQ== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=oracle.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ji7si13079071ejc.617.2021.02.02.06.46.51; Tue, 02 Feb 2021 06:47:36 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234707AbhBBOpa (ORCPT + 99 others); Tue, 2 Feb 2021 09:45:30 -0500 Received: from mail.kernel.org ([198.145.29.99]:57674 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234431AbhBBOn3 (ORCPT ); Tue, 2 Feb 2021 09:43:29 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id C38A864F49; Tue, 2 Feb 2021 14:42:48 +0000 (UTC) Subject: [PATCH v1] xprtrdma: Simplify rpcrdma_convert_kvec() and frwr_map() From: Chuck Lever To: anna.schumaker@netapp.com Cc: linux-nfs@vger.kernel.org, linux-rdma@vger.kernel.org Date: Tue, 02 Feb 2021 09:42:47 -0500 Message-ID: <161227696787.3689758.305854118266206775.stgit@manet.1015granger.net> User-Agent: StGit/0.23-29-ga622f1 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org 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 */ };