linux-rdma.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sagi Grimberg <sagig-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
To: Chuck Lever <chuck.lever-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH v1 05/16] xprtrdma: Add a "register_external" op for each memreg mode
Date: Mon, 16 Mar 2015 20:15:23 +0200	[thread overview]
Message-ID: <55071DBB.4050500@dev.mellanox.co.il> (raw)
In-Reply-To: <982A021D-1B85-4AAF-89A3-302A21CF2B36-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>

On 3/16/2015 6:48 PM, Chuck Lever wrote:
>
> On Mar 16, 2015, at 3:28 AM, Sagi Grimberg <sagig-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org> wrote:
>
>> On 3/13/2015 11:27 PM, Chuck Lever wrote:
>>> There is very little common processing among the different external
>>> memory registration functions. Have rpcrdma_create_chunks() call
>>> the registration method directly. This removes a stack frame and a
>>> switch statement from the external registration path.
>>>
>>> Signed-off-by: Chuck Lever <chuck.lever-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
>>> ---
>>>   net/sunrpc/xprtrdma/fmr_ops.c      |   51 +++++++++++
>>>   net/sunrpc/xprtrdma/frwr_ops.c     |   88 ++++++++++++++++++
>>>   net/sunrpc/xprtrdma/physical_ops.c |   17 ++++
>>>   net/sunrpc/xprtrdma/rpc_rdma.c     |    5 +
>>>   net/sunrpc/xprtrdma/verbs.c        |  172 +-----------------------------------
>>>   net/sunrpc/xprtrdma/xprt_rdma.h    |    6 +
>>>   6 files changed, 166 insertions(+), 173 deletions(-)
>>>
>>> diff --git a/net/sunrpc/xprtrdma/fmr_ops.c b/net/sunrpc/xprtrdma/fmr_ops.c
>>> index eec2660..45fb646 100644
>>> --- a/net/sunrpc/xprtrdma/fmr_ops.c
>>> +++ b/net/sunrpc/xprtrdma/fmr_ops.c
>>> @@ -29,7 +29,58 @@ fmr_op_maxpages(struct rpcrdma_xprt *r_xprt)
>>>   		     rpcrdma_max_segments(r_xprt) * RPCRDMA_MAX_FMR_SGES);
>>>   }
>>>
>>> +/* Use the ib_map_phys_fmr() verb to register a memory region
>>> + * for remote access via RDMA READ or RDMA WRITE.
>>> + */
>>> +static int
>>> +fmr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg,
>>> +	   int nsegs, bool writing)
>>> +{
>>> +	struct rpcrdma_ia *ia = &r_xprt->rx_ia;
>>> +	struct rpcrdma_mr_seg *seg1 = seg;
>>> +	struct rpcrdma_mw *mw = seg1->rl_mw;
>>> +	u64 physaddrs[RPCRDMA_MAX_DATA_SEGS];
>>> +	int len, pageoff, i, rc;
>>> +
>>> +	pageoff = offset_in_page(seg1->mr_offset);
>>> +	seg1->mr_offset -= pageoff;	/* start of page */
>>> +	seg1->mr_len += pageoff;
>>> +	len = -pageoff;
>>> +	if (nsegs > RPCRDMA_MAX_FMR_SGES)
>>> +		nsegs = RPCRDMA_MAX_FMR_SGES;
>>> +	for (i = 0; i < nsegs;) {
>>> +		rpcrdma_map_one(ia, seg, writing);
>>> +		physaddrs[i] = seg->mr_dma;
>>> +		len += seg->mr_len;
>>> +		++seg;
>>> +		++i;
>>> +		/* Check for holes */
>>> +		if ((i < nsegs && offset_in_page(seg->mr_offset)) ||
>>> +		    offset_in_page((seg-1)->mr_offset + (seg-1)->mr_len))
>>> +			break;
>>> +	}
>>> +
>>> +	rc = ib_map_phys_fmr(mw->r.fmr, physaddrs, i, seg1->mr_dma);
>>> +	if (rc)
>>> +		goto out_maperr;
>>> +
>>> +	seg1->mr_rkey = mw->r.fmr->rkey;
>>> +	seg1->mr_base = seg1->mr_dma + pageoff;
>>> +	seg1->mr_nsegs = i;
>>> +	seg1->mr_len = len;
>>> +	return i;
>>> +
>>> +out_maperr:
>>> +	dprintk("RPC:       %s: ib_map_phys_fmr %u@0x%llx+%i (%d) status %i\n",
>>> +		__func__, len, (unsigned long long)seg1->mr_dma,
>>> +		pageoff, i, rc);
>>> +	while (i--)
>>> +		rpcrdma_unmap_one(ia, --seg);
>>> +	return rc;
>>> +}
>>> +
>>>   const struct rpcrdma_memreg_ops rpcrdma_fmr_memreg_ops = {
>>> +	.ro_map				= fmr_op_map,
>>>   	.ro_maxpages			= fmr_op_maxpages,
>>>   	.ro_displayname			= "fmr",
>>>   };
>>> diff --git a/net/sunrpc/xprtrdma/frwr_ops.c b/net/sunrpc/xprtrdma/frwr_ops.c
>>> index 73a5ac8..2b5ccb0 100644
>>> --- a/net/sunrpc/xprtrdma/frwr_ops.c
>>> +++ b/net/sunrpc/xprtrdma/frwr_ops.c
>>> @@ -29,7 +29,95 @@ frwr_op_maxpages(struct rpcrdma_xprt *r_xprt)
>>>   		     rpcrdma_max_segments(r_xprt) * ia->ri_max_frmr_depth);
>>>   }
>>>
>>> +/* Post a FAST_REG Work Request to register a memory region
>>> + * for remote access via RDMA READ or RDMA WRITE.
>>> + */
>>> +static int
>>> +frwr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg,
>>> +	    int nsegs, bool writing)
>>> +{
>>> +	struct rpcrdma_ia *ia = &r_xprt->rx_ia;
>>> +	struct rpcrdma_mr_seg *seg1 = seg;
>>> +	struct rpcrdma_mw *mw = seg1->rl_mw;
>>> +	struct rpcrdma_frmr *frmr = &mw->r.frmr;
>>> +	struct ib_mr *mr = frmr->fr_mr;
>>> +	struct ib_send_wr fastreg_wr, *bad_wr;
>>> +	u8 key;
>>> +	int len, pageoff;
>>> +	int i, rc;
>>> +	int seg_len;
>>> +	u64 pa;
>>> +	int page_no;
>>> +
>>> +	pageoff = offset_in_page(seg1->mr_offset);
>>> +	seg1->mr_offset -= pageoff;	/* start of page */
>>> +	seg1->mr_len += pageoff;
>>> +	len = -pageoff;
>>> +	if (nsegs > ia->ri_max_frmr_depth)
>>> +		nsegs = ia->ri_max_frmr_depth;
>>> +	for (page_no = i = 0; i < nsegs;) {
>>> +		rpcrdma_map_one(ia, seg, writing);
>>> +		pa = seg->mr_dma;
>>> +		for (seg_len = seg->mr_len; seg_len > 0; seg_len -= PAGE_SIZE) {
>>> +			frmr->fr_pgl->page_list[page_no++] = pa;
>>> +			pa += PAGE_SIZE;
>>> +		}
>>> +		len += seg->mr_len;
>>> +		++seg;
>>> +		++i;
>>> +		/* Check for holes */
>>> +		if ((i < nsegs && offset_in_page(seg->mr_offset)) ||
>>> +		    offset_in_page((seg-1)->mr_offset + (seg-1)->mr_len))
>>> +			break;
>>> +	}
>>> +	dprintk("RPC:       %s: Using frmr %p to map %d segments\n",
>>> +		__func__, mw, i);
>>> +
>>> +	frmr->fr_state = FRMR_IS_VALID;
>>> +
>>> +	memset(&fastreg_wr, 0, sizeof(fastreg_wr));
>>> +	fastreg_wr.wr_id = (unsigned long)(void *)mw;
>>> +	fastreg_wr.opcode = IB_WR_FAST_REG_MR;
>>> +	fastreg_wr.wr.fast_reg.iova_start = seg1->mr_dma;
>>> +	fastreg_wr.wr.fast_reg.page_list = frmr->fr_pgl;
>>> +	fastreg_wr.wr.fast_reg.page_shift = PAGE_SHIFT;
>>> +	fastreg_wr.wr.fast_reg.page_list_len = page_no;
>>> +	fastreg_wr.wr.fast_reg.length = page_no << PAGE_SHIFT;
>>
>> Umm, is this necessarily true? will the region length be full pages?
>> Why don't you assign fast_reg.length = len?
>> I might be missing something here…
>
> Don’t know. This goes back to when FRWR was introduced in this code,
> with commit 3197d309 in 2008.

I see.

So from inspecting at the code it seems that if you had a buffer of
length PAGE_SIZE + 512, the client would register two pages. So in case
the server attempts a write that exceeds this length the client might
get a data corruption instead of a much nicer remote access error
completion...

But then again, I may be missing something here...

Sagi.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2015-03-16 18:15 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-13 21:26 [PATCH v1 00/16] NFS/RDMA patches proposed for 4.1 Chuck Lever
     [not found] ` <20150313212517.22783.18364.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-13 21:26   ` [PATCH v1 01/16] xprtrdma: Display IPv6 addresses and port numbers correctly Chuck Lever
     [not found]     ` <20150313212641.22783.93522.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-15  2:50       ` Sagi Grimberg
     [not found]         ` <5504F37A.20803-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2015-03-16 16:34           ` Chuck Lever
2015-03-24  8:27       ` Devesh Sharma
     [not found]         ` <EE7902D3F51F404C82415C4803930ACD5DC3A952-DWYeeINJQrxExQ8dmkPuX0M9+F4ksjoh@public.gmane.org>
2015-03-24 14:43           ` Chuck Lever
2015-03-13 21:26   ` [PATCH v1 02/16] xprtrdma: Perform a full marshal on retransmit Chuck Lever
     [not found]     ` <20150313212650.22783.28071.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-15  3:01       ` Sagi Grimberg
2015-03-13 21:26   ` [PATCH v1 03/16] xprtrdma: Add vector of ops for each memory registration strategy Chuck Lever
     [not found]     ` <20150313212659.22783.28341.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-15  3:04       ` Sagi Grimberg
2015-03-13 21:27   ` [PATCH v1 04/16] xprtrdma: Add a "max_payload" op for each memreg mode Chuck Lever
     [not found]     ` <20150313212708.22783.70403.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-16 10:18       ` Sagi Grimberg
2015-03-13 21:27   ` [PATCH v1 05/16] xprtrdma: Add a "register_external" " Chuck Lever
     [not found]     ` <20150313212718.22783.10096.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-16 10:28       ` Sagi Grimberg
     [not found]         ` <5506B036.1040905-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2015-03-16 16:48           ` Chuck Lever
     [not found]             ` <982A021D-1B85-4AAF-89A3-302A21CF2B36-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
2015-03-16 18:15               ` Sagi Grimberg [this message]
     [not found]                 ` <55071DBB.4050500-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2015-03-16 20:13                   ` Steve Wise
     [not found]                     ` <55073966.30006-7bPotxP6k4+P2YhJcF5u+vpXobYPEAuW@public.gmane.org>
2015-03-16 22:11                       ` Chuck Lever
     [not found]                         ` <7595A8CB-B38B-4F01-A132-CE3BE143A897-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
2015-03-21 11:53                           ` Sagi Grimberg
2015-03-13 21:27   ` [PATCH v1 06/16] xprtrdma: Add a "deregister_external" " Chuck Lever
     [not found]     ` <20150313212728.22783.11821.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-16 10:34       ` Sagi Grimberg
     [not found]         ` <5506B19F.80105-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2015-03-16 16:57           ` Chuck Lever
2015-03-24 11:12       ` Devesh Sharma
     [not found]         ` <EE7902D3F51F404C82415C4803930ACD5DC3A9C4-DWYeeINJQrxExQ8dmkPuX0M9+F4ksjoh@public.gmane.org>
2015-03-24 14:54           ` Chuck Lever
2015-03-13 21:27   ` [PATCH v1 07/16] xprtrdma: Add "init MRs" memreg op Chuck Lever
     [not found]     ` <20150313212738.22783.34521.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-16 10:36       ` Sagi Grimberg
2015-03-13 21:27   ` [PATCH v1 08/16] xprtrdma: Add "reset " Chuck Lever
     [not found]     ` <20150313212747.22783.98300.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-16 10:38       ` Sagi Grimberg
2015-03-24 11:27       ` Devesh Sharma
     [not found]         ` <EE7902D3F51F404C82415C4803930ACD5DC3A9E3-DWYeeINJQrxExQ8dmkPuX0M9+F4ksjoh@public.gmane.org>
2015-03-24 15:10           ` Chuck Lever
2015-03-13 21:27   ` [PATCH v1 09/16] xprtrdma: Add "destroy " Chuck Lever
     [not found]     ` <20150313212758.22783.67493.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-16 10:46       ` Sagi Grimberg
     [not found]         ` <5506B48F.6050902-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2015-03-16 16:59           ` Chuck Lever
2015-03-13 21:28   ` [PATCH v1 10/16] xprtrdma: Add "open" " Chuck Lever
     [not found]     ` <20150313212807.22783.61881.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-24 11:34       ` Devesh Sharma
     [not found]         ` <EE7902D3F51F404C82415C4803930ACD5DC3A9FF-DWYeeINJQrxExQ8dmkPuX0M9+F4ksjoh@public.gmane.org>
2015-03-24 15:29           ` Chuck Lever
2015-03-13 21:28   ` [PATCH v1 11/16] xprtrdma: Handle non-SEND completions via a callout Chuck Lever
     [not found]     ` <20150313212816.22783.49677.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-16 10:53       ` Sagi Grimberg
2015-03-13 21:28   ` [PATCH v1 12/16] xprtrdma: Acquire FMRs in rpcrdma_fmr_register_external() Chuck Lever
     [not found]     ` <20150313212825.22783.51384.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-16 12:28       ` Sagi Grimberg
     [not found]         ` <5506CC6C.8090106-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2015-03-16 17:03           ` Chuck Lever
2015-03-13 21:28   ` [PATCH v1 13/16] xprtrdma: Acquire MRs in rpcrdma_register_external() Chuck Lever
     [not found]     ` <20150313212835.22783.12326.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-16 12:44       ` Sagi Grimberg
     [not found]         ` <5506D02B.5050602-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2015-03-16 18:14           ` Chuck Lever
2015-03-13 21:28   ` [PATCH v1 14/16] xprtrdma: Remove rpcrdma_ia::ri_memreg_strategy Chuck Lever
     [not found]     ` <20150313212844.22783.1438.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-16 12:45       ` Sagi Grimberg
2015-03-13 21:28   ` [PATCH v1 15/16] xprtrdma: Make rpcrdma_{un}map_one() into inline functions Chuck Lever
     [not found]     ` <20150313212853.22783.62285.stgit-FYjufvaPoItvLzlybtyyYzGyq/o6K9yX@public.gmane.org>
2015-03-16 12:45       ` Sagi Grimberg
2015-03-13 21:29   ` [PATCH v1 16/16] xprtrdma: Split rb_lock Chuck Lever

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55071DBB.4050500@dev.mellanox.co.il \
    --to=sagig-ldsdmyg8hgv8yrgs2mwiifqbs+8scbdb@public.gmane.org \
    --cc=chuck.lever-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org \
    --cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).