From patchwork Fri Mar 23 16:49:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Wise X-Patchwork-Id: 10305293 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 92BF1600CC for ; Fri, 23 Mar 2018 18:15:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 838B428FA5 for ; Fri, 23 Mar 2018 18:15:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7807E29015; Fri, 23 Mar 2018 18:15:30 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DC46B28FA5 for ; Fri, 23 Mar 2018 18:15:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752311AbeCWSP3 (ORCPT ); Fri, 23 Mar 2018 14:15:29 -0400 Received: from opengridcomputing.com ([70.118.0.34]:35755 "EHLO smtp.opengridcomputing.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752284AbeCWSP2 (ORCPT ); Fri, 23 Mar 2018 14:15:28 -0400 Received: by smtp.opengridcomputing.com (Postfix, from userid 503) id DE6772BC79; Fri, 23 Mar 2018 13:15:27 -0500 (CDT) Message-Id: <8127af325344d0c2da8118d9074bfb50bca2c219.1521827521.git.swise@opengridcomputing.com> In-Reply-To: References: From: Steve Wise Date: Fri, 23 Mar 2018 09:49:39 -0700 Subject: [PATCH v1 rdma-next 2/4] RDMA/nldev: add provider-specific resource tracking To: jgg@mellanox.com, dledford@redhat.com Cc: leon@kernel.org, linux-rdma@vger.kernel.org Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Each provider can register a "fill entry" function with the restrack core. This function will be called when filling out a resource, allowing the provider to add provider-specific details. The details consist of a table of nested attributes, that are in the form of "key, value" tuple. The key nlattr must be strings, and the value nlattr can be one of provider attributes that are generic, but typed, allowing the nlmessage to ve validated. Currently the types include string, s32, u32, x32, s64, u64, and x64. The inclusion of x, s, and u variants for numeric attributes allows the user tool to print the number in the desired format. More attrs can be defined as they become needed by providers. Signed-off-by: Steve Wise --- drivers/infiniband/core/nldev.c | 39 +++++++++++++++++++++++++++++++++++++++ include/rdma/restrack.h | 10 ++++++++++ include/uapi/rdma/rdma_netlink.h | 16 ++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c index 884843e..8346ede 100644 --- a/drivers/infiniband/core/nldev.c +++ b/drivers/infiniband/core/nldev.c @@ -95,8 +95,27 @@ [RDMA_NLDEV_ATTR_RES_PD_ENTRY] = { .type = NLA_NESTED }, [RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY] = { .type = NLA_U32 }, [RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY] = { .type = NLA_U32 }, + [RDMA_NLDEV_ATTR_PROVIDER] = { .type = NLA_NESTED }, + [RDMA_NLDEV_ATTR_PROVIDER_ENTRY] = { .type = NLA_NESTED }, + [RDMA_NLDEV_ATTR_PROVIDER_STRING] = { .type = NLA_NUL_STRING, + .len = RDMA_NLDEV_ATTR_PROVIDER_STRLEN }, + [RDMA_NLDEV_ATTR_PROVIDER_D32] = { .type = NLA_S32 }, + [RDMA_NLDEV_ATTR_PROVIDER_U32] = { .type = NLA_U32 }, + [RDMA_NLDEV_ATTR_PROVIDER_X32] = { .type = NLA_U32 }, + [RDMA_NLDEV_ATTR_PROVIDER_D64] = { .type = NLA_S64 }, + [RDMA_NLDEV_ATTR_PROVIDER_U64] = { .type = NLA_U64 }, + [RDMA_NLDEV_ATTR_PROVIDER_X64] = { .type = NLA_U64 }, }; +static int provider_fill_res_entry(struct rdma_restrack_root *resroot, + struct sk_buff *msg, + struct netlink_callback *cb, + struct rdma_restrack_entry *res) +{ + return resroot->fill_res_entry ? + resroot->fill_res_entry(msg, cb, res) : 0; +} + static int fill_nldev_handle(struct sk_buff *msg, struct ib_device *device) { if (nla_put_u32(msg, RDMA_NLDEV_ATTR_DEV_INDEX, device->index)) @@ -264,6 +283,7 @@ static int fill_res_qp_entry(struct sk_buff *msg, struct netlink_callback *cb, struct rdma_restrack_entry *res, uint32_t port) { struct ib_qp *qp = container_of(res, struct ib_qp, res); + struct rdma_restrack_root *resroot = &qp->device->res; struct ib_qp_init_attr qp_init_attr; struct nlattr *entry_attr; struct ib_qp_attr qp_attr; @@ -313,6 +333,9 @@ static int fill_res_qp_entry(struct sk_buff *msg, struct netlink_callback *cb, if (fill_res_name_pid(msg, res)) goto err; + if (provider_fill_res_entry(resroot, msg, cb, res)) + goto err; + nla_nest_end(msg, entry_attr); return 0; @@ -328,6 +351,7 @@ static int fill_res_cm_id_entry(struct sk_buff *msg, { struct rdma_id_private *id_priv = container_of(res, struct rdma_id_private, res); + struct rdma_restrack_root *resroot = &id_priv->id.device->res; struct rdma_cm_id *cm_id = &id_priv->id; struct nlattr *entry_attr; @@ -369,6 +393,9 @@ static int fill_res_cm_id_entry(struct sk_buff *msg, if (fill_res_name_pid(msg, res)) goto err; + if (provider_fill_res_entry(resroot, msg, cb, res)) + goto err; + nla_nest_end(msg, entry_attr); return 0; @@ -382,6 +409,7 @@ static int fill_res_cq_entry(struct sk_buff *msg, struct netlink_callback *cb, struct rdma_restrack_entry *res, uint32_t port) { struct ib_cq *cq = container_of(res, struct ib_cq, res); + struct rdma_restrack_root *resroot = &cq->device->res; struct nlattr *entry_attr; entry_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_RES_CQ_ENTRY); @@ -402,6 +430,9 @@ static int fill_res_cq_entry(struct sk_buff *msg, struct netlink_callback *cb, if (fill_res_name_pid(msg, res)) goto err; + if (provider_fill_res_entry(resroot, msg, cb, res)) + goto err; + nla_nest_end(msg, entry_attr); return 0; @@ -415,6 +446,7 @@ static int fill_res_mr_entry(struct sk_buff *msg, struct netlink_callback *cb, struct rdma_restrack_entry *res, uint32_t port) { struct ib_mr *mr = container_of(res, struct ib_mr, res); + struct rdma_restrack_root *resroot = &mr->pd->device->res; struct nlattr *entry_attr; entry_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_RES_MR_ENTRY); @@ -438,6 +470,9 @@ static int fill_res_mr_entry(struct sk_buff *msg, struct netlink_callback *cb, if (fill_res_name_pid(msg, res)) goto err; + if (provider_fill_res_entry(resroot, msg, cb, res)) + goto err; + nla_nest_end(msg, entry_attr); return 0; @@ -451,6 +486,7 @@ static int fill_res_pd_entry(struct sk_buff *msg, struct netlink_callback *cb, struct rdma_restrack_entry *res, uint32_t port) { struct ib_pd *pd = container_of(res, struct ib_pd, res); + struct rdma_restrack_root *resroot = &pd->device->res; struct nlattr *entry_attr; entry_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_RES_PD_ENTRY); @@ -477,6 +513,9 @@ static int fill_res_pd_entry(struct sk_buff *msg, struct netlink_callback *cb, if (fill_res_name_pid(msg, res)) goto err; + if (provider_fill_res_entry(resroot, msg, cb, res)) + goto err; + nla_nest_end(msg, entry_attr); return 0; diff --git a/include/rdma/restrack.h b/include/rdma/restrack.h index f3b3e35..bd3cd9a 100644 --- a/include/rdma/restrack.h +++ b/include/rdma/restrack.h @@ -44,6 +44,8 @@ enum rdma_restrack_type { }; #define RDMA_RESTRACK_HASH_BITS 8 +struct rdma_restrack_entry; + /** * struct rdma_restrack_root - main resource tracking management * entity, per-device @@ -57,6 +59,14 @@ struct rdma_restrack_root { * @hash: global database for all resources per-device */ DECLARE_HASHTABLE(hash, RDMA_RESTRACK_HASH_BITS); + /** + * @fill_res_entry: provider-specific fill function + * + * Allows rdma providers to add their own restrack attributes. + */ + int (*fill_res_entry)(struct sk_buff *msg, + struct netlink_callback *cb, + struct rdma_restrack_entry *entry); }; /** diff --git a/include/uapi/rdma/rdma_netlink.h b/include/uapi/rdma/rdma_netlink.h index 84b3f63..70443d4 100644 --- a/include/uapi/rdma/rdma_netlink.h +++ b/include/uapi/rdma/rdma_netlink.h @@ -249,6 +249,10 @@ enum rdma_nldev_command { RDMA_NLDEV_NUM_OPS }; +enum { + RDMA_NLDEV_ATTR_PROVIDER_STRLEN = 16, +}; + enum rdma_nldev_attr { /* don't change the order or add anything between, this is ABI! */ RDMA_NLDEV_ATTR_UNSPEC, @@ -390,6 +394,18 @@ enum rdma_nldev_attr { RDMA_NLDEV_ATTR_RES_PD_ENTRY, /* nested table */ RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY, /* u32 */ RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY, /* u32 */ + /* + * provider-specific attributes. + */ + RDMA_NLDEV_ATTR_PROVIDER, /* nested table */ + RDMA_NLDEV_ATTR_PROVIDER_ENTRY, /* nested table */ + RDMA_NLDEV_ATTR_PROVIDER_STRING, /* string */ + RDMA_NLDEV_ATTR_PROVIDER_D32, /* u32 */ + RDMA_NLDEV_ATTR_PROVIDER_U32, /* u32 */ + RDMA_NLDEV_ATTR_PROVIDER_X32, /* u32 */ + RDMA_NLDEV_ATTR_PROVIDER_D64, /* u64 */ + RDMA_NLDEV_ATTR_PROVIDER_U64, /* u64 */ + RDMA_NLDEV_ATTR_PROVIDER_X64, /* u64 */ RDMA_NLDEV_ATTR_MAX };