All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yuval Shaia <yuval.shaia@oracle.com>
To: Adit Ranadive <aditr@vmware.com>
Cc: dledford@redhat.com, linux-rdma@vger.kernel.org,
	pv-drivers@vmware.com, netdev@vger.kernel.org,
	linux-pci@vger.kernel.org, jhansen@vmware.com,
	asarwade@vmware.com, georgezhang@vmware.com, bryantan@vmware.com
Subject: Re: [PATCH v4 11/16] IB/pvrdma: Add support for memory regions
Date: Wed, 14 Sep 2016 15:46:45 +0300	[thread overview]
Message-ID: <20160914124644.GF15800@yuval-lap.uk.oracle.com> (raw)
In-Reply-To: <1473655766-31628-12-git-send-email-aditr@vmware.com>

No more comments.
Reviewed-by: Yuval Shaia <yuval.shaia@oracle.com>

On Sun, Sep 11, 2016 at 09:49:21PM -0700, Adit Ranadive wrote:
> This patch adds support for creating and destroying memory regions. The
> PVRDMA device supports User MRs, DMA MRs (no Remote Read/Write support),
> Fast Register MRs.
> 
> Reviewed-by: Jorgen Hansen <jhansen@vmware.com>
> Reviewed-by: George Zhang <georgezhang@vmware.com>
> Reviewed-by: Aditya Sarwade <asarwade@vmware.com>
> Reviewed-by: Bryan Tan <bryantan@vmware.com>
> Signed-off-by: Adit Ranadive <aditr@vmware.com>
> ---
> Changes v3->v4:
>  - Changed access flag check for DMA MR to using bit operation.
>  - Removed some local variables.
> 
> Changes v2->v3:
>  - Removed boolean in pvrdma_cmd_post.
> ---
>  drivers/infiniband/hw/pvrdma/pvrdma_mr.c | 332 +++++++++++++++++++++++++++++++
>  1 file changed, 332 insertions(+)
>  create mode 100644 drivers/infiniband/hw/pvrdma/pvrdma_mr.c
> 
> diff --git a/drivers/infiniband/hw/pvrdma/pvrdma_mr.c b/drivers/infiniband/hw/pvrdma/pvrdma_mr.c
> new file mode 100644
> index 0000000..6163f17
> --- /dev/null
> +++ b/drivers/infiniband/hw/pvrdma/pvrdma_mr.c
> @@ -0,0 +1,332 @@
> +/*
> + * Copyright (c) 2012-2016 VMware, Inc.  All rights reserved.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of EITHER the GNU General Public License
> + * version 2 as published by the Free Software Foundation or the BSD
> + * 2-Clause License. This program is distributed in the hope that it
> + * will be useful, but WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED
> + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
> + * See the GNU General Public License version 2 for more details at
> + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program available in the file COPYING in the main
> + * directory of this source tree.
> + *
> + * The BSD 2-Clause License
> + *
> + *     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.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
> + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
> + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
> + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
> + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
> + * OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <linux/list.h>
> +#include <linux/slab.h>
> +
> +#include "pvrdma.h"
> +
> +/**
> + * pvrdma_get_dma_mr - get a DMA memory region
> + * @pd: protection domain
> + * @acc: access flags
> + *
> + * @return: ib_mr pointer on success, otherwise returns an errno.
> + */
> +struct ib_mr *pvrdma_get_dma_mr(struct ib_pd *pd, int acc)
> +{
> +	struct pvrdma_dev *dev = to_vdev(pd->device);
> +	struct pvrdma_user_mr *mr;
> +	union pvrdma_cmd_req req;
> +	union pvrdma_cmd_resp rsp;
> +	struct pvrdma_cmd_create_mr *cmd = &req.create_mr;
> +	struct pvrdma_cmd_create_mr_resp *resp = &rsp.create_mr_resp;
> +	int ret;
> +
> +	if (!(acc & IB_ACCESS_LOCAL_WRITE)) {
> +		dev_warn(&dev->pdev->dev,
> +			 "unsupported dma mr access flags %#x\n", acc);
> +		return ERR_PTR(-EOPNOTSUPP);
> +	}
> +
> +	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
> +	if (!mr)
> +		return ERR_PTR(-ENOMEM);
> +
> +	memset(cmd, 0, sizeof(*cmd));
> +	cmd->hdr.cmd = PVRDMA_CMD_CREATE_MR;
> +	cmd->pd_handle = to_vpd(pd)->pd_handle;
> +	cmd->access_flags = acc;
> +	cmd->flags = PVRDMA_MR_FLAG_DMA;
> +
> +	ret = pvrdma_cmd_post(dev, &req, &rsp);
> +	if (ret < 0) {
> +		dev_warn(&dev->pdev->dev, "could not get DMA mem region\n");
> +		kfree(mr);
> +		return ERR_PTR(ret);
> +	}
> +
> +	mr->mmr.mr_handle = resp->mr_handle;
> +	mr->ibmr.lkey = resp->lkey;
> +	mr->ibmr.rkey = resp->rkey;
> +
> +	return &mr->ibmr;
> +}
> +
> +/**
> + * pvrdma_reg_user_mr - register a userspace memory region
> + * @pd: protection domain
> + * @start: starting address
> + * @length: length of region
> + * @virt_addr: I/O virtual address
> + * @access_flags: access flags for memory region
> + * @udata: user data
> + *
> + * @return: ib_mr pointer on success, otherwise returns an errno.
> + */
> +struct ib_mr *pvrdma_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
> +				 u64 virt_addr, int access_flags,
> +				 struct ib_udata *udata)
> +{
> +	struct pvrdma_dev *dev = to_vdev(pd->device);
> +	struct pvrdma_user_mr *mr = NULL;
> +	struct ib_umem *umem;
> +	union pvrdma_cmd_req req;
> +	union pvrdma_cmd_resp rsp;
> +	struct pvrdma_cmd_create_mr *cmd = &req.create_mr;
> +	struct pvrdma_cmd_create_mr_resp *resp = &rsp.create_mr_resp;
> +	int nchunks;
> +	int ret;
> +	int entry;
> +	struct scatterlist *sg;
> +
> +	if (length == 0 || length > dev->dsr->caps.max_mr_size) {
> +		dev_warn(&dev->pdev->dev, "invalid mem region length\n");
> +		return ERR_PTR(-EINVAL);
> +	}
> +
> +	umem = ib_umem_get(pd->uobject->context, start,
> +			   length, access_flags, 0);
> +	if (IS_ERR(umem)) {
> +		dev_warn(&dev->pdev->dev,
> +			 "could not get umem for mem region\n");
> +		return ERR_CAST(umem);
> +	}
> +
> +	nchunks = 0;
> +	for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry)
> +		nchunks += sg_dma_len(sg) >> PAGE_SHIFT;
> +
> +	if (nchunks < 0 || nchunks > PVRDMA_PAGE_DIR_MAX_PAGES) {
> +		dev_warn(&dev->pdev->dev, "overflow %d pages in mem region\n",
> +			 nchunks);
> +		ret = -EINVAL;
> +		goto err_umem;
> +	}
> +
> +	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
> +	if (!mr) {
> +		ret = -ENOMEM;
> +		goto err_umem;
> +	}
> +
> +	mr->mmr.iova = virt_addr;
> +	mr->mmr.size = length;
> +	mr->umem = umem;
> +
> +	ret = pvrdma_page_dir_init(dev, &mr->pdir, nchunks, false);
> +	if (ret) {
> +		dev_warn(&dev->pdev->dev,
> +			 "could not allocate page directory\n");
> +		goto err_umem;
> +	}
> +
> +	ret = pvrdma_page_dir_insert_umem(&mr->pdir, mr->umem, 0);
> +	if (ret)
> +		goto err_pdir;
> +
> +	/* Send to device */
> +	memset(cmd, 0, sizeof(*cmd));
> +	cmd->hdr.cmd = PVRDMA_CMD_CREATE_MR;
> +	cmd->start = start;
> +	cmd->length = length;
> +	cmd->pd_handle = to_vpd(pd)->pd_handle;
> +	cmd->access_flags = access_flags;
> +	cmd->nchunks = nchunks;
> +	cmd->pdir_dma = mr->pdir.dir_dma;
> +
> +	ret = pvrdma_cmd_post(dev, &req, &rsp);
> +
> +	if (ret < 0 || rsp.hdr.ack != PVRDMA_CMD_CREATE_MR_RESP) {
> +		dev_warn(&dev->pdev->dev, "could not register mem region\n");
> +		goto err_pdir;
> +	}
> +
> +	mr->mmr.mr_handle = resp->mr_handle;
> +	mr->ibmr.lkey = resp->lkey;
> +	mr->ibmr.rkey = resp->rkey;
> +
> +	return &mr->ibmr;
> +
> +err_pdir:
> +	pvrdma_page_dir_cleanup(dev, &mr->pdir);
> +err_umem:
> +	ib_umem_release(umem);
> +	kfree(mr);
> +
> +	return ERR_PTR(ret);
> +}
> +
> +/**
> + * pvrdma_alloc_mr - allocate a memory region
> + * @pd: protection domain
> + * @mr_type: type of memory region
> + * @max_num_sg: maximum number of pages
> + *
> + * @return: ib_mr pointer on success, otherwise returns an errno.
> + */
> +struct ib_mr *pvrdma_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type,
> +			      u32 max_num_sg)
> +{
> +	struct pvrdma_dev *dev = to_vdev(pd->device);
> +	struct pvrdma_user_mr *mr;
> +	union pvrdma_cmd_req req;
> +	union pvrdma_cmd_resp rsp;
> +	struct pvrdma_cmd_create_mr *cmd = &req.create_mr;
> +	struct pvrdma_cmd_create_mr_resp *resp = &rsp.create_mr_resp;
> +	int size = max_num_sg * sizeof(u64);
> +	int ret;
> +
> +	if (mr_type != IB_MR_TYPE_MEM_REG ||
> +	    max_num_sg > PVRDMA_MAX_FAST_REG_PAGES)
> +		return ERR_PTR(-EINVAL);
> +
> +	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
> +	if (!mr)
> +		return ERR_PTR(-ENOMEM);
> +
> +	mr->pages = kzalloc(size, GFP_KERNEL);
> +	if (!mr->pages) {
> +		ret = -ENOMEM;
> +		goto freemr;
> +	}
> +
> +	ret = pvrdma_page_dir_init(dev, &mr->pdir, max_num_sg, false);
> +	if (ret) {
> +		dev_warn(&dev->pdev->dev,
> +			 "failed to allocate page dir for mr\n");
> +		ret = -ENOMEM;
> +		goto freepages;
> +	}
> +
> +	memset(cmd, 0, sizeof(*cmd));
> +	cmd->hdr.cmd = PVRDMA_CMD_CREATE_MR;
> +	cmd->pd_handle = to_vpd(pd)->pd_handle;
> +	cmd->access_flags = 0;
> +	cmd->flags = PVRDMA_MR_FLAG_FRMR;
> +	cmd->nchunks = max_num_sg;
> +
> +	ret = pvrdma_cmd_post(dev, &req, &rsp);
> +	if (ret < 0) {
> +		dev_warn(&dev->pdev->dev, "could not create FR mem region\n");
> +		ret = -EINVAL;
> +		goto freepdir;
> +	}
> +
> +	mr->max_pages = max_num_sg;
> +	mr->mmr.mr_handle = resp->mr_handle;
> +	mr->ibmr.lkey = resp->lkey;
> +	mr->ibmr.rkey = resp->rkey;
> +	mr->page_shift = PAGE_SHIFT;
> +	mr->umem = NULL;
> +
> +	return &mr->ibmr;
> +
> +freepdir:
> +	pvrdma_page_dir_cleanup(dev, &mr->pdir);
> +freepages:
> +	kfree(mr->pages);
> +freemr:
> +	kfree(mr);
> +	return ERR_PTR(ret);
> +}
> +
> +/**
> + * pvrdma_dereg_mr - deregister a memory region
> + * @ibmr: memory region
> + *
> + * @return: 0 on success.
> + */
> +int pvrdma_dereg_mr(struct ib_mr *ibmr)
> +{
> +	struct pvrdma_user_mr *mr = to_vmr(ibmr);
> +	struct pvrdma_dev *dev = to_vdev(ibmr->device);
> +	union pvrdma_cmd_req req;
> +	struct pvrdma_cmd_destroy_mr *cmd = &req.destroy_mr;
> +	int ret;
> +
> +	memset(cmd, 0, sizeof(*cmd));
> +	cmd->hdr.cmd = PVRDMA_CMD_DESTROY_MR;
> +	cmd->mr_handle = mr->mmr.mr_handle;
> +	ret = pvrdma_cmd_post(dev, &req, NULL);
> +	if (ret < 0)
> +		dev_warn(&dev->pdev->dev, "could not deregister mem region\n");
> +
> +	pvrdma_page_dir_cleanup(dev, &mr->pdir);
> +	if (mr->umem)
> +		ib_umem_release(mr->umem);
> +
> +	kfree(mr->pages);
> +	kfree(mr);
> +
> +	return 0;
> +}
> +
> +static int pvrdma_set_page(struct ib_mr *ibmr, u64 addr)
> +{
> +	struct pvrdma_user_mr *mr = to_vmr(ibmr);
> +
> +	if (mr->npages == mr->max_pages)
> +		return -ENOMEM;
> +
> +	mr->pages[mr->npages++] = addr;
> +	return 0;
> +}
> +
> +int pvrdma_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
> +		     unsigned int *sg_offset)
> +{
> +	struct pvrdma_user_mr *mr = to_vmr(ibmr);
> +	struct pvrdma_dev *dev = to_vdev(ibmr->device);
> +	int ret;
> +
> +	mr->npages = 0;
> +
> +	ret = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, pvrdma_set_page);
> +	if (ret < 0)
> +		dev_warn(&dev->pdev->dev, "could not map sg to pages\n");
> +
> +	return ret;
> +}
> -- 
> 2.7.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

  reply	other threads:[~2016-09-14 12:46 UTC|newest]

Thread overview: 105+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-12  4:49 [PATCH v4 00/16] Add Paravirtual RDMA Driver Adit Ranadive
2016-09-12  4:49 ` Adit Ranadive
2016-09-12  4:49 ` Adit Ranadive
2016-09-12  4:49 ` [PATCH v4 01/16] vmxnet3: Move PCI Id to pci_ids.h Adit Ranadive
2016-09-12  4:49   ` Adit Ranadive
     [not found]   ` <1473655766-31628-2-git-send-email-aditr-pghWNbHTmq7QT0dZR+AlfA@public.gmane.org>
2016-09-12 17:21     ` Bjorn Helgaas
2016-09-12 17:21       ` Bjorn Helgaas
2016-09-14 11:08   ` Yuval Shaia
     [not found]     ` <20160914110854.GA15800-Hxa29pjIrETlQW142y8m19+IiqhCXseY@public.gmane.org>
2016-09-14 16:00       ` Adit Ranadive
2016-09-14 16:00         ` Adit Ranadive
2016-09-14 16:24         ` Yuval Shaia
2016-09-14 19:36           ` Adit Ranadive
2016-09-14 19:36             ` Adit Ranadive
2016-09-15  7:55             ` Yuval Shaia
     [not found]             ` <DM2PR0501MB84422A1029EE72FC727F960C5F10-SXUgMXdxDSdudfUQJyYm35LWcSx1hRipwIZJ9u9yWa8oOQlpcoRfSA@public.gmane.org>
2016-09-20 13:37               ` Bjorn Helgaas
2016-09-20 13:37                 ` Bjorn Helgaas
2016-09-12  4:49 ` [PATCH v4 03/16] IB/pvrdma: Add virtual device RDMA structures Adit Ranadive
2016-09-12  4:49   ` Adit Ranadive
2016-09-12 17:50   ` Jason Gunthorpe
2016-09-12  4:49 ` [PATCH v4 04/16] IB/pvrdma: Add the paravirtual RDMA device specification Adit Ranadive
2016-09-12  4:49   ` Adit Ranadive
2016-09-12  4:49 ` [PATCH v4 05/16] IB/pvrdma: Add functions for Verbs support Adit Ranadive
2016-09-12  4:49   ` Adit Ranadive
2016-09-14 12:28   ` Yuval Shaia
     [not found]   ` <1473655766-31628-6-git-send-email-aditr-pghWNbHTmq7QT0dZR+AlfA@public.gmane.org>
2016-09-14 12:49     ` Christoph Hellwig
2016-09-14 12:49       ` Christoph Hellwig
2016-09-15  0:10       ` Adit Ranadive
2016-09-15  0:10         ` Adit Ranadive
     [not found]         ` <BLUPR0501MB836AB8BF5108322033C5DD6C5F00-84Rf5TRaNBMVDhIuTCx1aJLWcSx1hRipwIZJ9u9yWa8oOQlpcoRfSA@public.gmane.org>
2016-09-15  6:15           ` Christoph Hellwig
2016-09-15  6:15             ` Christoph Hellwig
2016-09-15  7:15             ` Leon Romanovsky
2016-09-12  4:49 ` [PATCH v4 06/16] IB/pvrdma: Add paravirtual rdma device Adit Ranadive
2016-09-12  4:49   ` Adit Ranadive
     [not found]   ` <1473655766-31628-7-git-send-email-aditr-pghWNbHTmq7QT0dZR+AlfA@public.gmane.org>
2016-09-14 11:17     ` Yuval Shaia
2016-09-14 11:17       ` Yuval Shaia
2016-09-12  4:49 ` [PATCH v4 09/16] IB/pvrdma: Add support for Completion Queues Adit Ranadive
2016-09-12  4:49   ` Adit Ranadive
2016-09-14 12:43   ` Yuval Shaia
2016-09-15  0:07     ` Adit Ranadive
2016-09-15  0:07       ` Adit Ranadive
2016-09-15  7:36       ` Yuval Shaia
2016-09-18 17:07         ` Leon Romanovsky
2016-09-18 20:36           ` Adit Ranadive
2016-09-18 20:36             ` Adit Ranadive
     [not found]             ` <BLUPR0501MB83604E10410486A3F068950C5F50-84Rf5TRaNBMVDhIuTCx1aJLWcSx1hRipwIZJ9u9yWa8oOQlpcoRfSA@public.gmane.org>
2016-09-19  3:24               ` Leon Romanovsky
2016-09-19  3:24                 ` Leon Romanovsky
     [not found] ` <1473655766-31628-1-git-send-email-aditr-pghWNbHTmq7QT0dZR+AlfA@public.gmane.org>
2016-09-12  4:49   ` [PATCH v4 02/16] IB/pvrdma: Add user-level shared functions Adit Ranadive
2016-09-12  4:49     ` Adit Ranadive
2016-09-12  4:49     ` Adit Ranadive
2016-09-12 17:49     ` Jason Gunthorpe
2016-09-12  4:49   ` [PATCH v4 07/16] IB/pvrdma: Add helper functions Adit Ranadive
2016-09-12  4:49     ` Adit Ranadive
2016-09-12  4:49     ` Adit Ranadive
     [not found]     ` <1473655766-31628-8-git-send-email-aditr-pghWNbHTmq7QT0dZR+AlfA@public.gmane.org>
2016-09-14 11:21       ` Yuval Shaia
2016-09-14 11:21         ` Yuval Shaia
2016-09-12  4:49   ` [PATCH v4 08/16] IB/pvrdma: Add device command support Adit Ranadive
2016-09-12  4:49     ` Adit Ranadive
2016-09-12  4:49     ` Adit Ranadive
2016-09-12  4:49   ` [PATCH v4 10/16] IB/pvrdma: Add UAR support Adit Ranadive
2016-09-12  4:49     ` Adit Ranadive
2016-09-12  4:49     ` Adit Ranadive
2016-09-12  4:49   ` [PATCH v4 14/16] IB/pvrdma: Add Kconfig and Makefile Adit Ranadive
2016-09-12  4:49     ` Adit Ranadive
2016-09-12  4:49     ` Adit Ranadive
2016-09-12  4:49 ` [PATCH v4 11/16] IB/pvrdma: Add support for memory regions Adit Ranadive
2016-09-12  4:49   ` Adit Ranadive
2016-09-14 12:46   ` Yuval Shaia [this message]
2016-09-12  4:49 ` [PATCH v4 12/16] IB/pvrdma: Add Queue Pair support Adit Ranadive
2016-09-12  4:49   ` Adit Ranadive
     [not found]   ` <1473655766-31628-13-git-send-email-aditr-pghWNbHTmq7QT0dZR+AlfA@public.gmane.org>
2016-09-14 16:32     ` Yuval Shaia
2016-09-14 16:32       ` Yuval Shaia
2016-09-12  4:49 ` [PATCH v4 13/16] IB/pvrdma: Add the main driver module for PVRDMA Adit Ranadive
2016-09-12  4:49   ` Adit Ranadive
     [not found]   ` <1473655766-31628-14-git-send-email-aditr-pghWNbHTmq7QT0dZR+AlfA@public.gmane.org>
2016-09-14 16:38     ` Yuval Shaia
2016-09-14 16:38       ` Yuval Shaia
2016-09-12  4:49 ` [PATCH v4 15/16] IB: Add PVRDMA driver Adit Ranadive
2016-09-12  4:49   ` Adit Ranadive
     [not found]   ` <1473655766-31628-16-git-send-email-aditr-pghWNbHTmq7QT0dZR+AlfA@public.gmane.org>
2016-09-12  7:32     ` kbuild test robot
2016-09-12  7:32       ` kbuild test robot
2016-09-12  7:32       ` kbuild test robot
2016-09-12  9:00     ` kbuild test robot
2016-09-12  9:00       ` kbuild test robot
2016-09-12  9:00       ` kbuild test robot
2016-09-12  4:49 ` [PATCH v4 16/16] MAINTAINERS: Update for " Adit Ranadive
2016-09-12  4:49   ` Adit Ranadive
2016-09-12 17:52   ` Jason Gunthorpe
2016-09-12 22:13     ` Adit Ranadive
2016-09-12 22:13       ` Adit Ranadive
2016-09-15  7:27     ` Leon Romanovsky
2016-09-12 18:02 ` [PATCH v4 00/16] Add Paravirtual RDMA Driver Jason Gunthorpe
2016-09-12 22:43   ` Adit Ranadive
2016-09-12 22:43     ` Adit Ranadive
     [not found]     ` <BLUPR0501MB836ED564F2AE7AB9221AC25C5FF0-84Rf5TRaNBMVDhIuTCx1aJLWcSx1hRipwIZJ9u9yWa8oOQlpcoRfSA@public.gmane.org>
2016-09-12 23:16       ` Jason Gunthorpe
2016-09-12 23:16         ` Jason Gunthorpe
2016-09-14 17:36     ` Jason Gunthorpe
2016-09-14 19:44       ` Adit Ranadive
2016-09-14 19:44         ` Adit Ranadive
2016-09-14 20:50         ` Jason Gunthorpe
2016-09-14 22:03         ` Woodruff, Robert J
2016-09-14 22:20           ` Woodruff, Robert J
     [not found]             ` <9C6B67F36DCAFC479B1CF6A967258A8C7DE14D3E-8oqHQFITsIFqS6EAlXoojrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2016-09-14 22:59               ` Jason Gunthorpe
2016-09-14 22:59                 ` Jason Gunthorpe
2016-09-16 16:32                 ` Jason Gunthorpe
2016-09-16 16:43                   ` Woodruff, Robert J
2016-09-15  7:02       ` Leon Romanovsky

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=20160914124644.GF15800@yuval-lap.uk.oracle.com \
    --to=yuval.shaia@oracle.com \
    --cc=aditr@vmware.com \
    --cc=asarwade@vmware.com \
    --cc=bryantan@vmware.com \
    --cc=dledford@redhat.com \
    --cc=georgezhang@vmware.com \
    --cc=jhansen@vmware.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pv-drivers@vmware.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.