From patchwork Tue Feb 11 12:31:04 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Or Gerlitz X-Patchwork-Id: 3626811 Return-Path: X-Original-To: patchwork-linux-rdma@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 3ACFB9F2F6 for ; Tue, 11 Feb 2014 12:31:18 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 471C3201EF for ; Tue, 11 Feb 2014 12:31:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3D995201CD for ; Tue, 11 Feb 2014 12:31:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751358AbaBKMbP (ORCPT ); Tue, 11 Feb 2014 07:31:15 -0500 Received: from mailp.voltaire.com ([193.47.165.129]:44298 "EHLO mellanox.co.il" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1750812AbaBKMbO (ORCPT ); Tue, 11 Feb 2014 07:31:14 -0500 Received: from Internal Mail-Server by MTLPINE2 (envelope-from ogerlitz@mellanox.com) with SMTP; 11 Feb 2014 14:31:12 +0200 Received: from r-vnc04.mtr.labs.mlnx (r-vnc04.mtr.labs.mlnx [10.208.0.116]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id s1BCV5RA019240; Tue, 11 Feb 2014 14:31:06 +0200 From: Or Gerlitz To: roland@kernel.org Cc: linux-rdma@vger.kernel.org, monis@mellanox.com, matanb@mellanox.com, amirv@mellanox.com, yishaih@mellanox.com, dledford@redhat.com, Or Gerlitz Subject: [PATCH V1 libibverbs 3/3] Add ibv_query_port_ex support Date: Tue, 11 Feb 2014 14:31:04 +0200 Message-Id: <1392121864-9672-4-git-send-email-ogerlitz@mellanox.com> X-Mailer: git-send-email 1.7.8.2 In-Reply-To: <1392121864-9672-1-git-send-email-ogerlitz@mellanox.com> References: <1392121864-9672-1-git-send-email-ogerlitz@mellanox.com> Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Matan Barak This patch adds extended support for ibv_query_port. This allows to request fields that aren't availible by the current ibv_query_port API and avoid fetching from vendor library fields that the user doesn't need, which gives more room for optimizations. Signed-off-by: Matan Barak Signed-off-by: Or Gerlitz --- include/infiniband/verbs.h | 102 ++++++++++++++++++++++++++++++++++++++++++++ src/device.c | 2 + src/verbs.c | 7 ++- 3 files changed, 109 insertions(+), 2 deletions(-) diff --git a/include/infiniband/verbs.h b/include/infiniband/verbs.h index 63c4756..4efcdb6 100644 --- a/include/infiniband/verbs.h +++ b/include/infiniband/verbs.h @@ -487,6 +487,69 @@ struct ibv_ah_attr_ex { uint16_t vid; }; +enum { + IBV_QUERY_PORT_EX_STATE = 1 << 0, + IBV_QUERY_PORT_EX_MAX_MTU = 1 << 1, + IBV_QUERY_PORT_EX_ACTIVE_MTU = 1 << 2, + IBV_QUERY_PORT_EX_GID_TBL_LEN = 1 << 3, + IBV_QUERY_PORT_EX_CAP_FLAGS = 1 << 4, + IBV_QUERY_PORT_EX_MAX_MSG_SZ = 1 << 5, + IBV_QUERY_PORT_EX_BAD_PKEY_CNTR = 1 << 6, + IBV_QUERY_PORT_EX_QKEY_VIOL_CNTR = 1 << 7, + IBV_QUERY_PORT_EX_PKEY_TBL_LEN = 1 << 8, + IBV_QUERY_PORT_EX_LID = 1 << 9, + IBV_QUERY_PORT_EX_SM_LID = 1 << 10, + IBV_QUERY_PORT_EX_LMC = 1 << 11, + IBV_QUERY_PORT_EX_MAX_VL_NUM = 1 << 12, + IBV_QUERY_PORT_EX_SM_SL = 1 << 13, + IBV_QUERY_PORT_EX_SUBNET_TIMEOUT = 1 << 14, + IBV_QUERY_PORT_EX_INIT_TYPE_REPLY = 1 << 15, + IBV_QUERY_PORT_EX_ACTIVE_WIDTH = 1 << 16, + IBV_QUERY_PORT_EX_ACTIVE_SPEED = 1 << 17, + IBV_QUERY_PORT_EX_PHYS_STATE = 1 << 18, + IBV_QUERY_PORT_EX_LINK_LAYER = 1 << 19, + /* mask of the fields that exists in the standard query_port_command */ + IBV_QUERY_PORT_EX_STD_MASK = (1 << 20) - 1, + /* mask of all supported fields */ + IBV_QUERY_PORT_EX_MASK = IBV_QUERY_PORT_EX_STD_MASK, +}; + +enum ibv_query_port_ex_attr_mask { + IBV_QUERY_PORT_EX_ATTR_MASK1 = 1 << 0, + IBV_QUERY_PORT_EX_ATTR_MASKS = (1 << 1) - 1 +}; + +struct ibv_port_attr_ex { + union { + struct { + enum ibv_port_state state; + enum ibv_mtu max_mtu; + enum ibv_mtu active_mtu; + int gid_tbl_len; + uint32_t port_cap_flags; + uint32_t max_msg_sz; + uint32_t bad_pkey_cntr; + uint32_t qkey_viol_cntr; + uint16_t pkey_tbl_len; + uint16_t lid; + uint16_t sm_lid; + uint8_t lmc; + uint8_t max_vl_num; + uint8_t sm_sl; + uint8_t subnet_timeout; + uint8_t init_type_reply; + uint8_t active_width; + uint8_t active_speed; + uint8_t phys_state; + uint8_t link_layer; + uint8_t reserved; + }; + struct ibv_port_attr port_attr; + }; + uint32_t comp_mask; + uint32_t mask1; +}; + enum ibv_srq_attr_mask { IBV_SRQ_MAX_WR = 1 << 0, @@ -900,6 +963,10 @@ enum verbs_context_mask { struct verbs_context { /* "grows up" - new fields go here */ + int (*drv_query_port_ex)(struct ibv_context *context, uint8_t port_num, + struct ibv_port_attr_ex *port_attr); + int (*lib_query_port_ex)(struct ibv_context *context, uint8_t port_num, + struct ibv_port_attr_ex *port_attr); struct ibv_ah * (*drv_ibv_create_ah_ex)(struct ibv_pd *pd, struct ibv_ah_attr_ex *attr); struct ibv_qp *(*open_qp)(struct ibv_context *context, @@ -1028,6 +1095,41 @@ static inline int ___ibv_query_port(struct ibv_context *context, #define ibv_query_port(context, port_num, port_attr) \ ___ibv_query_port(context, port_num, port_attr) +static inline int ibv_query_port_ex(struct ibv_context *context, + uint8_t port_num, + struct ibv_port_attr_ex *port_attr) +{ + struct verbs_context *vctx; + + if (0 == port_attr->comp_mask) + return ibv_query_port(context, port_num, + &port_attr->port_attr); + + /* Check that only valid flags were given */ + if ((!port_attr->comp_mask & IBV_QUERY_PORT_EX_ATTR_MASK1) || + (port_attr->comp_mask & ~IBV_QUERY_PORT_EX_ATTR_MASKS) || + (port_attr->mask1 & ~IBV_QUERY_PORT_EX_MASK)) { + errno = EINVAL; + return -errno; + } + + vctx = verbs_get_ctx_op(context, lib_query_port_ex); + + if (!vctx) { + /* Fallback to legacy mode */ + if (port_attr->comp_mask == IBV_QUERY_PORT_EX_ATTR_MASK1 && + !(port_attr->mask1 & ~IBV_QUERY_PORT_EX_STD_MASK)) + return ibv_query_port(context, port_num, + &port_attr->port_attr); + + /* Unsupported field was requested */ + errno = ENOSYS; + return -errno; + } + + return vctx->lib_query_port_ex(context, port_num, port_attr); +} + /** * ibv_query_gid - Get a GID table entry */ diff --git a/src/device.c b/src/device.c index beb7b3c..29ad726 100644 --- a/src/device.c +++ b/src/device.c @@ -169,6 +169,8 @@ struct ibv_context *__ibv_open_device(struct ibv_device *device) * context_ex->lib_new_func1 = __verbs_new_func1; * context_ex->lib_new_func2 = __verbs_new_func2; */ + context_ex->lib_query_port_ex = + context_ex->drv_query_port_ex; } context->device = device; diff --git a/src/verbs.c b/src/verbs.c index 219e503..9bad068 100644 --- a/src/verbs.c +++ b/src/verbs.c @@ -550,7 +550,7 @@ struct ibv_ah *__ibv_create_ah(struct ibv_pd *pd, struct ibv_ah_attr *attr) int err; struct ibv_ah *ah = NULL; #ifndef NRESOLVE_NEIGH - struct ibv_port_attr port_attr; + struct ibv_port_attr_ex port_attr; int dst_family; int src_family; int oif; @@ -570,7 +570,10 @@ struct ibv_ah *__ibv_create_ah(struct ibv_pd *pd, struct ibv_ah_attr *attr) goto return_ah; } - err = ibv_query_port(pd->context, attr->port_num, &port_attr); + port_attr.comp_mask = IBV_QUERY_PORT_EX_ATTR_MASK1; + port_attr.mask1 = IBV_QUERY_PORT_EX_LINK_LAYER | + IBV_QUERY_PORT_EX_CAP_FLAGS; + err = ibv_query_port_ex(pd->context, attr->port_num, &port_attr); if (err) { fprintf(stderr, PFX "ibv_create_ah failed to query port.\n");