From 617a0bbc51bdacc6cb644fd00d06a75d613a6a49 Mon Sep 17 00:00:00 2001 From: Jason Gunthorpe Date: Mon, 13 Mar 2017 11:50:56 -0600 Subject: [PATCH 1/7] Drop debugging print in CMakeLists.txt Signed-off-by: Jason Gunthorpe --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ebf8edfe..358bfd543 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -135,7 +135,6 @@ RDMA_BuildType() include_directories(${BUILD_INCLUDE}) RDMA_CheckSparse() -message(STATUS "SPARSE1 ${HAVE_SPARSE}") # Require GNU99 mode RDMA_EnableCStd() From 6ca779e117b88715cfa2ee38396d21e0dc397f7e Mon Sep 17 00:00:00 2001 From: Jason Gunthorpe Date: Mon, 13 Mar 2017 12:05:17 -0600 Subject: [PATCH 2/7] Fix missing swaps when computing path bits Sparse says the slid is BE in this context. Signed-off-by: Jason Gunthorpe --- ibacm/prov/acmp/src/acmp.c | 4 ++-- librdmacm/rsocket.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ibacm/prov/acmp/src/acmp.c b/ibacm/prov/acmp/src/acmp.c index d7c797fcc..da4e69cd1 100644 --- a/ibacm/prov/acmp/src/acmp.c +++ b/ibacm/prov/acmp/src/acmp.c @@ -656,7 +656,7 @@ acmp_record_mc_av(struct acmp_port *port, struct ib_mc_member_rec *mc_rec, dest->path.dgid = mc_rec->mgid; dest->path.sgid = mc_rec->port_gid; dest->path.dlid = mc_rec->mlid; - dest->path.slid = htobe16(port->lid) | port->sa_dest.av.src_path_bits; + dest->path.slid = htobe16(port->lid | port->sa_dest.av.src_path_bits); dest->path.flowlabel_hoplimit = htobe32(sl_flow_hop & 0xFFFFFFF); dest->path.tclass = mc_rec->tclass; dest->path.reversible_numpath = IBV_PATH_RECORD_REVERSIBLE | 1; @@ -675,7 +675,7 @@ acmp_init_path_av(struct acmp_port *port, struct acmp_dest *dest) dest->av.dlid = be16toh(dest->path.dlid); dest->av.sl = be16toh(dest->path.qosclass_sl) & 0xF; - dest->av.src_path_bits = dest->path.slid & 0x7F; + dest->av.src_path_bits = be16toh(dest->path.slid) & 0x7F; dest->av.static_rate = dest->path.rate & 0x3F; dest->av.port_num = port->port_num; diff --git a/librdmacm/rsocket.c b/librdmacm/rsocket.c index 2742b7bd9..db06a9c3b 100644 --- a/librdmacm/rsocket.c +++ b/librdmacm/rsocket.c @@ -4103,7 +4103,7 @@ static void udp_svc_create_ah(struct rsocket *rs, struct ds_dest *dest, uint32_t } attr.dlid = be16toh(id->route.path_rec->dlid); attr.sl = id->route.path_rec->sl; - attr.src_path_bits = id->route.path_rec->slid & udp_svc_path_bits(dest); + attr.src_path_bits = be16toh(id->route.path_rec->slid) & udp_svc_path_bits(dest); attr.static_rate = id->route.path_rec->rate; attr.port_num = id->port_num; From f417bf41bc8729e320ef7bc7d2701395842c3dfb Mon Sep 17 00:00:00 2001 From: Jason Gunthorpe Date: Mon, 13 Mar 2017 12:11:13 -0600 Subject: [PATCH 3/7] Fix various missing swaps in debugging/logging macros Based on sparse output. Signed-off-by: Jason Gunthorpe --- ibacm/prov/acmp/src/acmp.c | 13 +++++++------ ibacm/src/acm.c | 4 ++-- providers/qedr/qelr_verbs.c | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ibacm/prov/acmp/src/acmp.c b/ibacm/prov/acmp/src/acmp.c index da4e69cd1..fb8d30f3e 100644 --- a/ibacm/prov/acmp/src/acmp.c +++ b/ibacm/prov/acmp/src/acmp.c @@ -2419,8 +2419,8 @@ static struct acmp_port *acmp_get_port(struct acm_endpoint *endpoint) struct acmp_device *dev; acm_log(1, "dev 0x%" PRIx64 " port %d pkey 0x%x\n", - endpoint->port->dev->dev_guid, endpoint->port->port_num, - endpoint->pkey); + be64toh(endpoint->port->dev->dev_guid), + endpoint->port->port_num, endpoint->pkey); list_for_each(&acmp_dev_list, dev, entry) { if (dev->guid == endpoint->port->dev->dev_guid) @@ -2436,7 +2436,8 @@ acmp_get_ep(struct acmp_port *port, struct acm_endpoint *endpoint) struct acmp_ep *ep; acm_log(1, "dev 0x%" PRIx64 " port %d pkey 0x%x\n", - endpoint->port->dev->dev_guid, endpoint->port->port_num, endpoint->pkey); + be64toh(endpoint->port->dev->dev_guid), + endpoint->port->port_num, endpoint->pkey); list_for_each(&port->ep_list, ep, entry) { if (ep->pkey == endpoint->pkey) @@ -2736,13 +2737,13 @@ static int acmp_open_dev(const struct acm_device *device, void **dev_context) int i, ret; struct ibv_context *verbs; - acm_log(1, "dev_guid 0x%" PRIx64 " %s\n", device->dev_guid, + acm_log(1, "dev_guid 0x%" PRIx64 " %s\n", be64toh(device->dev_guid), device->verbs->device->name); list_for_each(&acmp_dev_list, dev, entry) { if (dev->guid == device->dev_guid) { acm_log(2, "dev_guid 0x%" PRIx64 " already exits\n", - device->dev_guid); + be64toh(device->dev_guid)); *dev_context = dev; dev->device = device; return 0; @@ -2823,7 +2824,7 @@ static void acmp_close_dev(void *dev_context) { struct acmp_device *dev = dev_context; - acm_log(1, "dev_guid 0x%" PRIx64 "\n", dev->device->dev_guid); + acm_log(1, "dev_guid 0x%" PRIx64 "\n", be64toh(dev->device->dev_guid)); dev->device = NULL; } diff --git a/ibacm/src/acm.c b/ibacm/src/acm.c index 3550b11b3..f3512dac1 100644 --- a/ibacm/src/acm.c +++ b/ibacm/src/acm.c @@ -2136,8 +2136,8 @@ static void acm_port_get_gid_tbl(struct acmc_port *port) if (ret || !port->gid_tbl[j].global.interface_id) break; acm_log(2, "guid %d: 0x%" PRIx64 " %" PRIx64 "\n", j, - port->gid_tbl[j].global.subnet_prefix, - port->gid_tbl[j].global.interface_id); + be64toh(port->gid_tbl[j].global.subnet_prefix), + be64toh(port->gid_tbl[j].global.interface_id)); } port->gid_cnt = j; } diff --git a/providers/qedr/qelr_verbs.c b/providers/qedr/qelr_verbs.c index 4800a4b0f..8d94a122a 100644 --- a/providers/qedr/qelr_verbs.c +++ b/providers/qedr/qelr_verbs.c @@ -561,8 +561,8 @@ static void qelr_print_ah_attr(struct qelr_devctx *cxt, struct ibv_ah_attr *attr { DP_VERBOSE(cxt->dbg_fp, QELR_MSG_QP, "grh.dgid=[%#" PRIx64 ":%#" PRIx64 "], grh.flow_label=%d, grh.sgid_index=%d, grh.hop_limit=%d, grh.traffic_class=%d, dlid=%d, sl=%d, src_path_bits=%d, static_rate = %d, port_num=%d\n", - attr->grh.dgid.global.interface_id, - attr->grh.dgid.global.subnet_prefix, + be64toh(attr->grh.dgid.global.interface_id), + be64toh(attr->grh.dgid.global.subnet_prefix), attr->grh.flow_label, attr->grh.hop_limit, attr->grh.sgid_index, attr->grh.traffic_class, attr->dlid, attr->sl, attr->src_path_bits, From a7423b75e2e2bd36b55ad69116b7db5415f5a172 Mon Sep 17 00:00:00 2001 From: Jason Gunthorpe Date: Mon, 13 Mar 2017 12:41:54 -0600 Subject: [PATCH 4/7] Add missing statics From sparse Signed-off-by: Jason Gunthorpe --- libibverbs/examples/xsrq_pingpong.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libibverbs/examples/xsrq_pingpong.c b/libibverbs/examples/xsrq_pingpong.c index 5fb882757..31a86f7c8 100644 --- a/libibverbs/examples/xsrq_pingpong.c +++ b/libibverbs/examples/xsrq_pingpong.c @@ -97,7 +97,7 @@ struct pingpong_context { int gidx; }; -struct pingpong_context ctx; +static struct pingpong_context ctx; static int open_device(char *ib_devname) From 0539ac206c8a29a0f8364e21d9cae307b4a30595 Mon Sep 17 00:00:00 2001 From: Jason Gunthorpe Date: Mon, 13 Mar 2017 16:59:09 -0600 Subject: [PATCH 5/7] acm: Fix incorrect TID masking The kernel uses the upper 32 bits of the TID for the agent ID (see drivers/infiniband/core/user_mad.c ib_umad_write) This worked on x86 because the TID is in BE at this point and the upper 32 bit masking is correct when working with BE data. Noticed by sparse. Signed-off-by: Jason Gunthorpe --- ibacm/src/acm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ibacm/src/acm.c b/ibacm/src/acm.c index f3512dac1..cf1078152 100644 --- a/ibacm/src/acm.c +++ b/ibacm/src/acm.c @@ -2770,8 +2770,8 @@ static void acmc_recv_mad(struct acmc_port *port) found = 0; pthread_mutex_lock(&port->lock); list_for_each(&port->sa_pending, req, entry) { - /* The lower 32-bit of the tid is used for agentid in umad */ - if (req->mad.sa_mad.mad_hdr.tid == (hdr->tid & 0xFFFFFFFF00000000ULL)) { + /* The upper 32-bit of the tid is used for agentid in umad */ + if (req->mad.sa_mad.mad_hdr.tid == (hdr->tid & htobe64(0xFFFFFFFF))) { found = 1; list_del(&req->entry); port->sa_credits++; From f2a406f537f94a888f85629570ed08c330c2dd16 Mon Sep 17 00:00:00 2001 From: Jason Gunthorpe Date: Mon, 13 Mar 2017 17:11:16 -0600 Subject: [PATCH 6/7] cmpost: Add missing swap for sin_port It looks like this didn't matter because this sin_port is only used for resolve_route which doesn't use sin_port data. Signed-off-by: Jason Gunthorpe --- libibcm/examples/cmpost.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libibcm/examples/cmpost.c b/libibcm/examples/cmpost.c index b8e7d8e07..b7c955139 100644 --- a/libibcm/examples/cmpost.c +++ b/libibcm/examples/cmpost.c @@ -632,7 +632,7 @@ static int get_dst_addr(char *dst, struct sockaddr_in *addr_in) } *addr_in = *(struct sockaddr_in *) res->ai_addr; - addr_in->sin_port = 7471; + addr_in->sin_port = htobe16(7471); out: freeaddrinfo(res); return ret; From 36372fdc6f657071e96b7a44ee39c52724e89c8a Mon Sep 17 00:00:00 2001 From: Jason Gunthorpe Date: Mon, 13 Mar 2017 17:35:06 -0600 Subject: [PATCH 7/7] acm: Fix missing swap in pkey compare It looks like endpoint->pkey is always used as host except for here. The routine always returns 0 on failure, so it is likely nobody noticed it was wrong. Found by sparse. Signed-off-by: Jason Gunthorpe --- ibacm/prov/acmp/src/acmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ibacm/prov/acmp/src/acmp.c b/ibacm/prov/acmp/src/acmp.c index fb8d30f3e..024d401fb 100644 --- a/ibacm/prov/acmp/src/acmp.c +++ b/ibacm/prov/acmp/src/acmp.c @@ -2459,7 +2459,7 @@ static uint16_t acmp_get_pkey_index(struct acm_endpoint *endpoint) for (i = 0, ret = 0; !ret; i++) { ret = ibv_query_pkey(port->dev->verbs, port->port_num, i, &pkey); - if (!ret && endpoint->pkey == pkey) + if (!ret && endpoint->pkey == be16toh(pkey)) return i; } return 0;