Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/marcel/tags/rdma-pull-request' …
Browse files Browse the repository at this point in the history
…into staging

* fix PVRDMA compilation errors and warnings
* implement query_qp for the PVRDMA device
* fix make - switch from -I to -iquote

# gpg: Signature made Fri 23 Mar 2018 15:39:23 GMT
# gpg:                using RSA key 36D4C0F0CF2FE46D
# gpg: Good signature from "Marcel Apfelbaum <marcel@redhat.com>"
# gpg: WARNING: This key is not certified with sufficiently trusted signatures!
# gpg:          It is not certain that the signature belongs to the owner.
# Primary key fingerprint: B1C6 3A57 F92E 08F2 640F  31F5 36D4 C0F0 CF2F E46D

* remotes/marcel/tags/rdma-pull-request:
  hw/rdma: Fix 32-bit compilation
  hw/rdma: Use correct print format in CHK_ATTR macro
  hw/rdma: Change host_virt to void *
  hw/rdma: fix clang compilation errors
  make: switch from -I to -iquote
  rdma: fix up include directives
  hw/rdma: Add support for Query QP verb to pvrdma device
  hw/rdma: Add Query QP operation

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Mar 24, 2018
2 parents 66793da + 6f55901 commit ed4916e
Show file tree
Hide file tree
Showing 17 changed files with 166 additions and 106 deletions.
4 changes: 2 additions & 2 deletions Makefile.target
Expand Up @@ -11,9 +11,9 @@ $(call set-vpath, $(SRC_PATH):$(BUILD_DIR))
ifdef CONFIG_LINUX
QEMU_CFLAGS += -I../linux-headers
endif
QEMU_CFLAGS += -I.. -I$(SRC_PATH)/target/$(TARGET_BASE_ARCH) -DNEED_CPU_H
QEMU_CFLAGS += -iquote .. -iquote $(SRC_PATH)/target/$(TARGET_BASE_ARCH) -DNEED_CPU_H

QEMU_CFLAGS+=-I$(SRC_PATH)/include
QEMU_CFLAGS+=-iquote $(SRC_PATH)/include

ifdef CONFIG_USER_ONLY
# user emulator name
Expand Down
16 changes: 8 additions & 8 deletions configure
Expand Up @@ -534,7 +534,7 @@ QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv $QEMU_CFLAGS"
QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
QEMU_INCLUDES="-I. -I\$(SRC_PATH) -I\$(SRC_PATH)/accel/tcg -I\$(SRC_PATH)/include"
QEMU_INCLUDES="-iquote . -iquote \$(SRC_PATH) -iquote \$(SRC_PATH)/accel/tcg -iquote \$(SRC_PATH)/include"
if test "$debug_info" = "yes"; then
CFLAGS="-g $CFLAGS"
LDFLAGS="-g $LDFLAGS"
Expand Down Expand Up @@ -6600,19 +6600,19 @@ if test "$vxhs" = "yes" ; then
fi

if test "$tcg_interpreter" = "yes"; then
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
elif test "$ARCH" = "sparc64" ; then
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
elif test "$ARCH" = "s390x" ; then
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
elif test "$ARCH" = "x86_64" -o "$ARCH" = "x32" ; then
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
elif test "$ARCH" = "ppc64" ; then
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
else
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
fi
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg $QEMU_INCLUDES"
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg $QEMU_INCLUDES"

echo "TOOLS=$tools" >> $config_host_mak
echo "ROMS=$roms" >> $config_host_mak
Expand Down
51 changes: 32 additions & 19 deletions hw/rdma/rdma_backend.c
Expand Up @@ -13,9 +13,9 @@
*
*/

#include <qemu/osdep.h>
#include <qemu/error-report.h>
#include <qapi/error.h>
#include "qemu/osdep.h"
#include "qemu/error-report.h"
#include "qapi/error.h"

#include <infiniband/verbs.h>

Expand Down Expand Up @@ -62,12 +62,13 @@ static void poll_cq(RdmaDeviceResources *rdma_dev_res, struct ibv_cq *ibcq)
pr_dbg("Got %d completion(s) from cq %p\n", ne, ibcq);

for (i = 0; i < ne; i++) {
pr_dbg("wr_id=0x%lx\n", wc[i].wr_id);
pr_dbg("wr_id=0x%" PRIx64 "\n", wc[i].wr_id);
pr_dbg("status=%d\n", wc[i].status);

bctx = rdma_rm_get_cqe_ctx(rdma_dev_res, wc[i].wr_id);
if (unlikely(!bctx)) {
pr_dbg("Error: Failed to find ctx for req %ld\n", wc[i].wr_id);
pr_dbg("Error: Failed to find ctx for req %" PRId64 "\n",
wc[i].wr_id);
continue;
}
pr_dbg("Processing %s CQE\n", bctx->is_tx_req ? "send" : "recv");
Expand Down Expand Up @@ -176,7 +177,7 @@ static struct ibv_ah *create_ah(RdmaBackendDev *backend_dev, struct ibv_pd *pd,
g_hash_table_insert(ah_hash, ah_key, ah);
} else {
g_bytes_unref(ah_key);
pr_dbg("ibv_create_ah failed for gid <%lx %lx>\n",
pr_dbg("Fail to create AH for gid <0x%" PRIx64 ", 0x%" PRIx64 ">\n",
be64_to_cpu(dgid->global.subnet_prefix),
be64_to_cpu(dgid->global.interface_id));
}
Expand Down Expand Up @@ -222,13 +223,13 @@ static int build_host_sge_array(RdmaDeviceResources *rdma_dev_res,
return VENDOR_ERR_INVLKEY | ssge[ssge_idx].lkey;
}

dsge->addr = mr->user_mr.host_virt + ssge[ssge_idx].addr -
dsge->addr = (uintptr_t)mr->user_mr.host_virt + ssge[ssge_idx].addr -
mr->user_mr.guest_start;
dsge->length = ssge[ssge_idx].length;
dsge->lkey = rdma_backend_mr_lkey(&mr->backend_mr);

pr_dbg("ssge->addr=0x%lx\n", (uint64_t)ssge[ssge_idx].addr);
pr_dbg("dsge->addr=0x%lx\n", dsge->addr);
pr_dbg("ssge->addr=0x%" PRIx64 "\n", ssge[ssge_idx].addr);
pr_dbg("dsge->addr=0x%" PRIx64 "\n", dsge->addr);
pr_dbg("dsge->length=%d\n", dsge->length);
pr_dbg("dsge->lkey=0x%x\n", dsge->lkey);

Expand Down Expand Up @@ -401,12 +402,12 @@ void rdma_backend_destroy_pd(RdmaBackendPD *pd)
}
}

int rdma_backend_create_mr(RdmaBackendMR *mr, RdmaBackendPD *pd, uint64_t addr,
int rdma_backend_create_mr(RdmaBackendMR *mr, RdmaBackendPD *pd, void *addr,
size_t length, int access)
{
pr_dbg("addr=0x%lx\n", addr);
pr_dbg("len=%ld\n", length);
mr->ibmr = ibv_reg_mr(pd->ibpd, (void *)addr, length, access);
pr_dbg("addr=0x%p\n", addr);
pr_dbg("len=%zu\n", length);
mr->ibmr = ibv_reg_mr(pd->ibpd, addr, length, access);
if (mr->ibmr) {
pr_dbg("lkey=0x%x\n", mr->ibmr->lkey);
pr_dbg("rkey=0x%x\n", mr->ibmr->rkey);
Expand Down Expand Up @@ -562,7 +563,7 @@ int rdma_backend_qp_state_rtr(RdmaBackendDev *backend_dev, RdmaBackendQP *qp,

switch (qp_type) {
case IBV_QPT_RC:
pr_dbg("dgid=0x%lx,%lx\n",
pr_dbg("dgid=0x%" PRIx64 ",%" PRIx64 "\n",
be64_to_cpu(ibv_gid.global.subnet_prefix),
be64_to_cpu(ibv_gid.global.interface_id));
pr_dbg("dqpn=0x%x\n", dqpn);
Expand Down Expand Up @@ -646,6 +647,18 @@ int rdma_backend_qp_state_rts(RdmaBackendQP *qp, uint8_t qp_type,
return 0;
}

int rdma_backend_query_qp(RdmaBackendQP *qp, struct ibv_qp_attr *attr,
int attr_mask, struct ibv_qp_init_attr *init_attr)
{
if (!qp->ibqp) {
pr_dbg("QP1\n");
attr->qp_state = IBV_QPS_RTS;
return 0;
}

return ibv_query_qp(qp->ibqp, attr, attr_mask, init_attr);
}

void rdma_backend_destroy_qp(RdmaBackendQP *qp)
{
if (qp->ibqp) {
Expand All @@ -656,8 +669,8 @@ void rdma_backend_destroy_qp(RdmaBackendQP *qp)
#define CHK_ATTR(req, dev, member, fmt) ({ \
pr_dbg("%s="fmt","fmt"\n", #member, dev.member, req->member); \
if (req->member > dev.member) { \
warn_report("%s = 0x%lx is higher than host device capability 0x%lx", \
#member, (uint64_t)req->member, (uint64_t)dev.member); \
warn_report("%s = "fmt" is higher than host device capability "fmt, \
#member, req->member, dev.member); \
req->member = dev.member; \
} \
pr_dbg("%s="fmt"\n", #member, req->member); })
Expand All @@ -669,7 +682,7 @@ static int init_device_caps(RdmaBackendDev *backend_dev,
return -EIO;
}

CHK_ATTR(dev_attr, backend_dev->dev_attr, max_mr_size, "%ld");
CHK_ATTR(dev_attr, backend_dev->dev_attr, max_mr_size, "%" PRId64);
CHK_ATTR(dev_attr, backend_dev->dev_attr, max_qp, "%d");
CHK_ATTR(dev_attr, backend_dev->dev_attr, max_sge, "%d");
CHK_ATTR(dev_attr, backend_dev->dev_attr, max_qp_wr, "%d");
Expand Down Expand Up @@ -782,9 +795,9 @@ int rdma_backend_init(RdmaBackendDev *backend_dev,
ret = -EIO;
goto out_destroy_comm_channel;
}
pr_dbg("subnet_prefix=0x%lx\n",
pr_dbg("subnet_prefix=0x%" PRIx64 "\n",
be64_to_cpu(backend_dev->gid.global.subnet_prefix));
pr_dbg("interface_id=0x%lx\n",
pr_dbg("interface_id=0x%" PRIx64 "\n",
be64_to_cpu(backend_dev->gid.global.interface_id));

snprintf(thread_name, sizeof(thread_name), "rdma_comp_%s",
Expand Down
6 changes: 4 additions & 2 deletions hw/rdma/rdma_backend.h
Expand Up @@ -16,7 +16,7 @@
#ifndef RDMA_BACKEND_H
#define RDMA_BACKEND_H

#include <qapi/error.h>
#include "qapi/error.h"
#include "rdma_rm_defs.h"
#include "rdma_backend_defs.h"

Expand Down Expand Up @@ -61,7 +61,7 @@ int rdma_backend_query_port(RdmaBackendDev *backend_dev,
int rdma_backend_create_pd(RdmaBackendDev *backend_dev, RdmaBackendPD *pd);
void rdma_backend_destroy_pd(RdmaBackendPD *pd);

int rdma_backend_create_mr(RdmaBackendMR *mr, RdmaBackendPD *pd, uint64_t addr,
int rdma_backend_create_mr(RdmaBackendMR *mr, RdmaBackendPD *pd, void *addr,
size_t length, int access);
void rdma_backend_destroy_mr(RdmaBackendMR *mr);

Expand All @@ -83,6 +83,8 @@ int rdma_backend_qp_state_rtr(RdmaBackendDev *backend_dev, RdmaBackendQP *qp,
bool use_qkey);
int rdma_backend_qp_state_rts(RdmaBackendQP *qp, uint8_t qp_type,
uint32_t sq_psn, uint32_t qkey, bool use_qkey);
int rdma_backend_query_qp(RdmaBackendQP *qp, struct ibv_qp_attr *attr,
int attr_mask, struct ibv_qp_init_attr *init_attr);
void rdma_backend_destroy_qp(RdmaBackendQP *qp);

void rdma_backend_post_send(RdmaBackendDev *backend_dev,
Expand Down
2 changes: 1 addition & 1 deletion hw/rdma/rdma_backend_defs.h
Expand Up @@ -17,7 +17,7 @@
#define RDMA_BACKEND_DEFS_H

#include <infiniband/verbs.h>
#include <qemu/thread.h>
#include "qemu/thread.h"

typedef struct RdmaDeviceResources RdmaDeviceResources;

Expand Down
38 changes: 28 additions & 10 deletions hw/rdma/rdma_rm.c
Expand Up @@ -13,9 +13,9 @@
*
*/

#include <qemu/osdep.h>
#include <qapi/error.h>
#include <cpu.h>
#include "qemu/osdep.h"
#include "qapi/error.h"
#include "cpu.h"

#include "rdma_utils.h"
#include "rdma_backend.h"
Expand Down Expand Up @@ -146,7 +146,7 @@ int rdma_rm_alloc_mr(RdmaDeviceResources *dev_res, uint32_t pd_handle,
RdmaRmMR *mr;
int ret = 0;
RdmaRmPD *pd;
uint64_t addr;
void *addr;
size_t length;

pd = rdma_rm_get_pd(dev_res, pd_handle);
Expand All @@ -165,14 +165,14 @@ int rdma_rm_alloc_mr(RdmaDeviceResources *dev_res, uint32_t pd_handle,
/* TODO: This is my guess but not so sure that this needs to be
* done */
length = TARGET_PAGE_SIZE;
addr = (uint64_t)g_malloc(length);
addr = g_malloc(length);
} else {
mr->user_mr.host_virt = (uint64_t) host_virt;
pr_dbg("host_virt=0x%lx\n", mr->user_mr.host_virt);
mr->user_mr.host_virt = host_virt;
pr_dbg("host_virt=0x%p\n", mr->user_mr.host_virt);
mr->user_mr.length = guest_length;
pr_dbg("length=0x%lx\n", guest_length);
pr_dbg("length=%zu\n", guest_length);
mr->user_mr.guest_start = guest_start;
pr_dbg("guest_start=0x%lx\n", mr->user_mr.guest_start);
pr_dbg("guest_start=0x%" PRIx64 "\n", mr->user_mr.guest_start);

length = mr->user_mr.length;
addr = mr->user_mr.host_virt;
Expand Down Expand Up @@ -216,7 +216,7 @@ void rdma_rm_dealloc_mr(RdmaDeviceResources *dev_res, uint32_t mr_handle)

if (mr) {
rdma_backend_destroy_mr(&mr->backend_mr);
munmap((void *)mr->user_mr.host_virt, mr->user_mr.length);
munmap(mr->user_mr.host_virt, mr->user_mr.length);
res_tbl_dealloc(&dev_res->mr_tbl, mr_handle);
}
}
Expand Down Expand Up @@ -453,6 +453,24 @@ int rdma_rm_modify_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
return 0;
}

int rdma_rm_query_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
uint32_t qp_handle, struct ibv_qp_attr *attr,
int attr_mask, struct ibv_qp_init_attr *init_attr)
{
RdmaRmQP *qp;

pr_dbg("qpn=%d\n", qp_handle);

qp = rdma_rm_get_qp(dev_res, qp_handle);
if (!qp) {
return -EINVAL;
}

pr_dbg("qp_type=%d\n", qp->qp_type);

return rdma_backend_query_qp(&qp->backend_qp, attr, attr_mask, init_attr);
}

void rdma_rm_dealloc_qp(RdmaDeviceResources *dev_res, uint32_t qp_handle)
{
RdmaRmQP *qp;
Expand Down
5 changes: 4 additions & 1 deletion hw/rdma/rdma_rm.h
Expand Up @@ -16,7 +16,7 @@
#ifndef RDMA_RM_H
#define RDMA_RM_H

#include <qapi/error.h>
#include "qapi/error.h"
#include "rdma_backend_defs.h"
#include "rdma_rm_defs.h"

Expand Down Expand Up @@ -59,6 +59,9 @@ int rdma_rm_modify_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
union ibv_gid *dgid, uint32_t dqpn,
enum ibv_qp_state qp_state, uint32_t qkey,
uint32_t rq_psn, uint32_t sq_psn);
int rdma_rm_query_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
uint32_t qp_handle, struct ibv_qp_attr *attr,
int attr_mask, struct ibv_qp_init_attr *init_attr);
void rdma_rm_dealloc_qp(RdmaDeviceResources *dev_res, uint32_t qp_handle);

int rdma_rm_alloc_cqe_ctx(RdmaDeviceResources *dev_res, uint32_t *cqe_ctx_id,
Expand Down
2 changes: 1 addition & 1 deletion hw/rdma/rdma_rm_defs.h
Expand Up @@ -56,7 +56,7 @@ typedef struct RdmaRmCQ {
} RdmaRmCQ;

typedef struct RdmaRmUserMR {
uint64_t host_virt;
void *host_virt;
uint64_t guest_start;
size_t length;
} RdmaRmUserMR;
Expand Down
6 changes: 3 additions & 3 deletions hw/rdma/rdma_utils.c
Expand Up @@ -27,8 +27,8 @@ void *rdma_pci_dma_map(PCIDevice *dev, dma_addr_t addr, dma_addr_t plen)

p = pci_dma_map(dev, addr, &len, DMA_DIRECTION_TO_DEVICE);
if (!p) {
pr_dbg("Fail in pci_dma_map, addr=0x%llx, len=%ld\n",
(long long unsigned int)addr, len);
pr_dbg("Fail in pci_dma_map, addr=0x%" PRIx64 ", len=%" PRId64 "\n",
addr, len);
return NULL;
}

Expand All @@ -37,7 +37,7 @@ void *rdma_pci_dma_map(PCIDevice *dev, dma_addr_t addr, dma_addr_t plen)
return NULL;
}

pr_dbg("0x%llx -> %p (len=%ld)\n", (long long unsigned int)addr, p, len);
pr_dbg("0x%" PRIx64 " -> %p (len=% " PRId64 ")\n", addr, p, len);

return p;
}
Expand Down
6 changes: 3 additions & 3 deletions hw/rdma/rdma_utils.h
Expand Up @@ -17,9 +17,9 @@
#ifndef RDMA_UTILS_H
#define RDMA_UTILS_H

#include <qemu/osdep.h>
#include <include/hw/pci/pci.h>
#include <include/sysemu/dma.h>
#include "qemu/osdep.h"
#include "hw/pci/pci.h"
#include "sysemu/dma.h"

#define pr_info(fmt, ...) \
fprintf(stdout, "%s: %-20s (%3d): " fmt, "pvrdma", __func__, __LINE__,\
Expand Down
8 changes: 4 additions & 4 deletions hw/rdma/vmw/pvrdma.h
Expand Up @@ -16,14 +16,14 @@
#ifndef PVRDMA_PVRDMA_H
#define PVRDMA_PVRDMA_H

#include <hw/pci/pci.h>
#include <hw/pci/msix.h>
#include "hw/pci/pci.h"
#include "hw/pci/msix.h"

#include "../rdma_backend_defs.h"
#include "../rdma_rm_defs.h"

#include <standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_ring.h>
#include <standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_dev_api.h>
#include "standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_ring.h"
#include "standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_dev_api.h"
#include "pvrdma_dev_ring.h"

/* BARs */
Expand Down

0 comments on commit ed4916e

Please sign in to comment.