public inbox for linux-rdma@vger.kernel.org
 help / color / mirror / Atom feed
From: Steve Wise <swise-7bPotxP6k4+P2YhJcF5u+vpXobYPEAuW@public.gmane.org>
To: Sean Hefty <sean.hefty-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH 31/37] librdmacm: provide abstracted verb calls
Date: Wed, 07 Apr 2010 14:39:03 -0500	[thread overview]
Message-ID: <4BBCDF57.20303@opengridcomputing.com> (raw)
In-Reply-To: <27A4CFF94530491F88C8E528428FF93E-Zpru7NauK7drdx17CPfAsdBPR1lH4CV8@public.gmane.org>

Sean Hefty wrote:
> Provide abstractions to the verb calls to simplify the user
> interface for more casual verbs consumers.  Users still have
> access to the full range of verbs functionality by calling
> verbs directly.
>
> Signed-off-by: Sean Hefty <sean.hefty-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> ---
>
>  Makefile.am               |    5 -
>  include/rdma/rdma_verbs.h |  287 +++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 290 insertions(+), 2 deletions(-)
>
> diff --git a/Makefile.am b/Makefile.am
> index 8d86045..8aef24a 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -31,7 +31,8 @@ librdmacmincludedir = $(includedir)/rdma $(includedir)/infiniband
>  
>  librdmacminclude_HEADERS = include/rdma/rdma_cma_abi.h \
>  			   include/rdma/rdma_cma.h \
> -			   include/infiniband/ib.h
> +			   include/infiniband/ib.h \
> +			   include/rdma/rdma_verbs.h
>  
>  man_MANS = \
>  	man/rdma_accept.3 \
> @@ -69,7 +70,7 @@ man_MANS = \
>  	man/rdma_cm.7
>  
>  EXTRA_DIST = include/rdma/rdma_cma_abi.h include/rdma/rdma_cma.h \
> -	     include/infiniband/ib.h \
> +	     include/infiniband/ib.h include/rdma/rdma_verbs.h \
>  	     src/cma.h src/librdmacm.map librdmacm.spec.in $(man_MANS)
>  
>  dist-hook: librdmacm.spec
> diff --git a/include/rdma/rdma_verbs.h b/include/rdma/rdma_verbs.h
> new file mode 100644
> index 0000000..05964c1
> --- /dev/null
> +++ b/include/rdma/rdma_verbs.h
> @@ -0,0 +1,287 @@
> +/*
> + * Copyright (c) 2010 Intel Corporation.  All rights reserved.
> + *
> + * This software is available to you under a choice of one of two
> + * licenses.  You may choose to be licensed under the terms of the GNU
> + * General Public License (GPL) Version 2, available from the file
> + * COPYING in the main directory of this source tree, or the
> + * OpenIB.org BSD license below:
> + *
> + *     Redistribution and use in source and binary forms, with or
> + *     without modification, are permitted provided that the following
> + *     conditions are met:
> + *
> + *      - Redistributions of source code must retain the above
> + *        copyright notice, this list of conditions and the following
> + *        disclaimer.
> + *
> + *      - Redistributions in binary form must reproduce the above
> + *        copyright notice, this list of conditions and the following
> + *        disclaimer in the documentation and/or other materials
> + *        provided with the distribution.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
> + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
> + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
> + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> + * SOFTWARE.
> + */
> +
> +#if !defined(RDMA_VERBS_H)
> +#define RDMA_VERBS_H
> +
> +#include <assert.h>
> +#include <infiniband/verbs.h>
> +#include <rdma/rdma_cma.h>
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +/*
> + * Memory registration helpers.
> + */
> +static inline struct ibv_mr *
> +rdma_reg_msgs(struct rdma_cm_id *id, void *addr, size_t length)
> +{
> +	return ibv_reg_mr(id->qp->pd, addr, length, IBV_ACCESS_LOCAL_WRITE);
> +}
> +
> +static inline struct ibv_mr *
> +rdma_reg_read(struct rdma_cm_id *id, void *addr, size_t length)
> +{
> +	return ibv_reg_mr(id->qp->pd, addr, length, IBV_ACCESS_LOCAL_WRITE|
> +						    IBV_ACCESS_REMOTE_READ);
> +}
> +
> +static inline struct ibv_mr *
> +rdma_reg_write(struct rdma_cm_id *id, void *addr, size_t length)
> +{
> +	return ibv_reg_mr(id->qp->pd, addr, length, IBV_ACCESS_LOCAL_WRITE |
> +						    IBV_ACCESS_REMOTE_WRITE);
> +}
> +
> +static inline int
> +rdma_dereg_mr(struct ibv_mr *mr)
> +{
> +	return ibv_dereg_mr(mr);
> +}
> +
> +
> +/*
> + * Vectored send, receive, and RDMA operations.
> + * Support multiple scatter-gather entries.
> + */
> +static inline int
> +rdma_post_recvv(struct rdma_cm_id *id, void *context, struct ibv_sge *sgl,
> +		int nsge)
> +{
> +	struct ibv_recv_wr wr, *bad;
> +
> +	wr.wr_id = (uintptr_t) context;
> +	wr.next = NULL;
> +	wr.sg_list = sgl;
> +	wr.num_sge = nsge;
> +
> +	return ibv_post_recv(id->qp, &wr, &bad);
> +}
> +
> +static inline int
> +rdma_post_sendv(struct rdma_cm_id *id, void *context, struct ibv_sge *sgl,
> +		int nsge, int flags)
> +{
> +	struct ibv_send_wr wr, *bad;
> +
> +	wr.wr_id = (uintptr_t) context;
> +	wr.next = NULL;
> +	wr.sg_list = sgl;
> +	wr.num_sge = nsge;
> +	wr.opcode = IBV_WR_SEND;
> +	wr.send_flags = flags;
> +
> +	return ibv_post_send(id->qp, &wr, &bad);
> +}
> +
> +static inline int
> +rdma_post_readv(struct rdma_cm_id *id, void *context, struct ibv_sge *sgl,
> +		int nsge, int flags, uint64_t remote_addr, uint32_t rkey)
> +{
> +	struct ibv_send_wr wr, *bad;
> +
> +	wr.wr_id = (uintptr_t) context;
> +	wr.next = NULL;
> +	wr.sg_list = sgl;
> +	wr.num_sge = nsge;
> +	wr.opcode = IBV_WR_RDMA_READ;
> +	wr.send_flags = flags;
> +	wr.wr.rdma.remote_addr = remote_addr;
> +	wr.wr.rdma.rkey = rkey;
> +
> +	return ibv_post_send(id->qp, &wr, &bad);
> +}
> +
> +static inline int
> +rdma_post_writev(struct rdma_cm_id *id, void *context, struct ibv_sge *sgl,
> +		 int nsge, int flags, uint64_t remote_addr, uint32_t rkey)
> +{
> +	struct ibv_send_wr wr, *bad;
> +
> +	wr.wr_id = (uintptr_t) context;
> +	wr.next = NULL;
> +	wr.sg_list = sgl;
> +	wr.num_sge = nsge;
> +	wr.opcode = IBV_WR_RDMA_WRITE;
> +	wr.send_flags = flags;
> +	wr.wr.rdma.remote_addr = remote_addr;
> +	wr.wr.rdma.rkey = rkey;
> +
> +	return ibv_post_send(id->qp, &wr, &bad);
> +}
> +
> +/*
> + * Simple send, receive, and RDMA calls.
> + */
> +static inline int
> +rdma_post_recv(struct rdma_cm_id *id, void *context, void *addr,
> +	       size_t length, struct ibv_mr *mr)
> +{
> +	struct ibv_sge sge;
> +
> +	assert((addr >= mr->addr) && ((addr + length) <= (mr->addr + mr->length)));
> +	sge.addr = (uint64_t) addr;
> +	sge.length = (uint32_t) length;
> +	sge.lkey = mr->lkey;
> +
> +	return rdma_post_recvv(id, context, &sge, 1);
> +}
> +
> +static inline int
> +rdma_post_send(struct rdma_cm_id *id, void *context, void *addr,
> +	       size_t length, struct ibv_mr *mr, int flags)
> +{
> +	struct ibv_sge sge;
> +
> +	sge.addr = (uint64_t) addr;
> +	sge.length = (uint32_t) length;
> +	sge.lkey = mr ? mr->lkey : 0;
> +
> +	return rdma_post_sendv(id, context, &sge, 1, flags);
> +}
> +
> +static inline int
> +rdma_post_read(struct rdma_cm_id *id, void *context, void *addr,
> +	       size_t length, struct ibv_mr *mr, int flags,
> +	       uint64_t remote_addr, uint32_t rkey)
> +{
> +	struct ibv_sge sge;
> +
> +	sge.addr = (uint64_t) addr;
> +	sge.length = (uint32_t) length;
> +	sge.lkey = mr->lkey;
> +
> +	return rdma_post_readv(id, context, &sge, 1, flags, remote_addr, rkey);
> +}
> +
> +static inline int
> +rdma_post_write(struct rdma_cm_id *id, void *context, void *addr,
> +		size_t length, struct ibv_mr *mr, int flags,
> +		uint64_t remote_addr, uint32_t rkey)
> +{
> +	struct ibv_sge sge;
> +
> +	sge.addr = (uint64_t) addr;
> +	sge.length = (uint32_t) length;
> +	sge.lkey = mr ? mr->lkey : 0;
> +
> +	return rdma_post_writev(id, context, &sge, 1, flags, remote_addr, rkey);
> +}
> +
> +static inline int
> +rdma_post_ud_send(struct rdma_cm_id *id, void *context, void *addr,
> +		  size_t length, struct ibv_mr *mr, int flags,
> +		  struct ibv_ah *ah, uint32_t remote_qpn)
> +{
> +	struct ibv_send_wr wr, *bad;
> +	struct ibv_sge sge;
> +
> +	sge.addr = (uint64_t) addr;
> +	sge.length = (uint32_t) length;
> +	sge.lkey = mr ? mr->lkey : 0;
> +
> +	wr.wr_id = (uintptr_t) context;
> +	wr.next = NULL;
> +	wr.sg_list = &sge;
> +	wr.num_sge = 1;
> +	wr.opcode = IBV_WR_SEND;
> +	wr.send_flags = flags;
> +	wr.wr.ud.ah = ah;
> +	wr.wr.ud.remote_qpn = remote_qpn;
> +	wr.wr.ud.remote_qkey = RDMA_UDP_QKEY;
> +
> +	return ibv_post_send(id->qp, &wr, &bad);
> +}
> +
> +static inline int
> +rdma_get_send_comp(struct rdma_cm_id *id, struct ibv_wc *wc)
> +{
> +	struct ibv_cq *cq;
> +	void *context;
> +	int ret;
> +
> +	ret = ibv_poll_cq(id->send_cq, 1, wc);
> +	if (ret)
> +		return ret;
> +
> +	ret = ibv_req_notify_cq(id->send_cq, 0);
> +	if (ret)
> +		return ret;
> +
> +	ret = ibv_poll_cq(id->send_cq, 1, wc);
> +	if (ret)
> +		return ret;
> +
> +	ret = ibv_get_cq_event(id->send_cq_channel, &cq, &context);
> +	if (ret)
> +		return ret;
>   

This doesn't look correct.  If the send isn't complete by the time the 
2nd ibv_poll_cq() completes, then this function will return without 
having filled in the wc.  Or am I missing something?  Shouldn't the 
ibv_get_cq_event() be the first thing this function does?  The same 
issue/question exists for rdma_get_recv_comp().



Steve.


--
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:[~2010-04-07 19:39 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-07 17:12 [PATCH 31/37] librdmacm: provide abstracted verb calls Sean Hefty
     [not found] ` <27A4CFF94530491F88C8E528428FF93E-Zpru7NauK7drdx17CPfAsdBPR1lH4CV8@public.gmane.org>
2010-04-07 19:39   ` Steve Wise [this message]
     [not found]     ` <4BBCDF57.20303-7bPotxP6k4+P2YhJcF5u+vpXobYPEAuW@public.gmane.org>
2010-04-07 20:14       ` Sean Hefty
     [not found]         ` <411E3A9BECF04B598FFEFFF08505DE6F-Zpru7NauK7drdx17CPfAsdBPR1lH4CV8@public.gmane.org>
2010-04-07 20:38           ` Steve Wise
     [not found]             ` <4BBCED37.9040708-7bPotxP6k4+P2YhJcF5u+vpXobYPEAuW@public.gmane.org>
2010-04-07 22:01               ` Sean Hefty
     [not found]                 ` <3F9969F0569A431A9B40B8DED7E18FB4-Zpru7NauK7drdx17CPfAsdBPR1lH4CV8@public.gmane.org>
2010-04-07 22:07                   ` Steve Wise
2010-04-08  0:41   ` [PATCH 31/37 v2] " Sean Hefty

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=4BBCDF57.20303@opengridcomputing.com \
    --to=swise-7bpotxp6k4+p2yhjcf5u+vpxobypeauw@public.gmane.org \
    --cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=sean.hefty-ral2JQCrhuEAvxtiuMwx3w@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