From patchwork Tue Jan 22 18:31:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029437 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="b/+HEF1u"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcSq5btfz9s3q for ; Wed, 23 Jan 2019 05:31:39 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726814AbfAVSbi (ORCPT ); Tue, 22 Jan 2019 13:31:38 -0500 Received: from mail.kernel.org ([198.145.29.99]:54572 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725971AbfAVSbi (ORCPT ); Tue, 22 Jan 2019 13:31:38 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 23571217D6; Tue, 22 Jan 2019 18:31:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181897; bh=YhSzZYZVJAALCflV9xsV6OtXa+/6GeCKZXjW2NoqcWk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=b/+HEF1uddmMCTfelM4HMNxGwtC+efT5Y0hC/L/K7URi7X9Rko+ICR+Xi8sQYL89v 0Dfc1KSDgA2oMTudlfSyp57CXmERNR2al4288LSgAMsDvjuD0rcGwJe1CZIJUv5beg 2eJmHWUNVa0bT11qA54SjZm28pa87Lf8DwbEiAtQ= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 01/19] rdma: update uapi headers Date: Tue, 22 Jan 2019 20:31:07 +0200 Message-Id: <20190122183125.15920-2-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Signed-off-by: Leon Romanovsky --- rdma/include/uapi/rdma/rdma_netlink.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rdma/include/uapi/rdma/rdma_netlink.h b/rdma/include/uapi/rdma/rdma_netlink.h index 04c80ceb..a1e6d658 100644 --- a/rdma/include/uapi/rdma/rdma_netlink.h +++ b/rdma/include/uapi/rdma/rdma_netlink.h @@ -430,6 +430,16 @@ enum rdma_nldev_attr { RDMA_NLDEV_ATTR_DRIVER_S64, /* s64 */ RDMA_NLDEV_ATTR_DRIVER_U64, /* u64 */ + /* + * Indexes to get/set secific entry, + * for QP use RDMA_NLDEV_ATTR_RES_LQPN + */ + RDMA_NLDEV_ATTR_RES_PDN, /* u32 */ + RDMA_NLDEV_ATTR_RES_CQN, /* u32 */ + RDMA_NLDEV_ATTR_RES_MRN, /* u32 */ + RDMA_NLDEV_ATTR_RES_CM_IDN, /* u32 */ + RDMA_NLDEV_ATTR_RES_CTXN, /* u32 */ + /* * Always the end */ From patchwork Tue Jan 22 18:31:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029438 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="u3GlSPku"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcSv0vvKz9s3q for ; Wed, 23 Jan 2019 05:31:43 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726825AbfAVSbm (ORCPT ); Tue, 22 Jan 2019 13:31:42 -0500 Received: from mail.kernel.org ([198.145.29.99]:54604 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725971AbfAVSbl (ORCPT ); Tue, 22 Jan 2019 13:31:41 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4709621726; Tue, 22 Jan 2019 18:31:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181900; bh=OhqCrTdsDqnofR8ZJyovXxO84gCJOO5aEY8xgSPtVhk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=u3GlSPkuW2fC/ykaeNOTIqyMkCgAyB92dG8rfqutZiB8PxIP372b8VgQdeOSdskxX nFhXp6LtTVgZanQrnoGQp4yxJ61Q3KXPNycLYfcH9wBFX9RLXgKqcAN4bStVNJujFp weTOdOFL+LOkBJjM9QgaF4cPrSHKAt2uUdySFaF0= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 02/19] rdma: Remove duplicated print code Date: Tue, 22 Jan 2019 20:31:08 +0200 Message-Id: <20190122183125.15920-3-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky There is no need to keep same print functions for uint32_t and uint64_t, unify them into one function. Signed-off-by: Leon Romanovsky --- rdma/res.c | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/rdma/res.c b/rdma/res.c index 6b0f5fe3..87865ec8 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -808,28 +808,20 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) return MNL_CB_OK; } -static void print_key(struct rd *rd, const char *name, uint32_t val) +static void print_key(struct rd *rd, const char *name, uint64_t val) { if (rd->json_output) jsonw_xint_field(rd->jw, name, val); else - pr_out("%s 0x%x ", name, val); + pr_out("%s 0x%" PRIx64 " ", name, val); } -static void print_iova(struct rd *rd, uint64_t val) +static void res_print_uint(struct rd *rd, const char *name, uint64_t val) { if (rd->json_output) - jsonw_xint_field(rd->jw, "iova", val); + jsonw_uint_field(rd->jw, name, val); else - pr_out("iova 0x%" PRIx64 " ", val); -} - -static void print_mrlen(struct rd *rd, uint64_t val) -{ - if (rd->json_output) - jsonw_uint_field(rd->jw, "mrlen", val); - else - pr_out("mrlen %" PRIu64 " ", val); + pr_out("%s %" PRIu64 " ", name, val); } static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) @@ -907,8 +899,8 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) print_key(rd, "lkey", lkey); if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) - print_iova(rd, iova); - print_mrlen(rd, mrlen); + print_key(rd, "iova", iova); + res_print_uint(rd, "mrlen", mrlen); print_pid(rd, pid); print_comm(rd, comm, nla_line); From patchwork Tue Jan 22 18:31:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029445 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="ORIwizNs"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTM5tV2z9s3q for ; Wed, 23 Jan 2019 05:32:07 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726984AbfAVScF (ORCPT ); Tue, 22 Jan 2019 13:32:05 -0500 Received: from mail.kernel.org ([198.145.29.99]:54856 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726039AbfAVScE (ORCPT ); Tue, 22 Jan 2019 13:32:04 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 757C221726; Tue, 22 Jan 2019 18:32:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181923; bh=G1HUu9qaUv+S82TH8Wbb5OMLnppQYG1K7xhw/WJupEY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ORIwizNs8MDPnovCTIDFBEeHNFavl4rebsYrXf8Wola5PlA1gFonm2SyYw1uVq/2Z GxE8eqvKLTGwpMSa9fSkwCd2z/5gIW/FAJiCbfLdVvMr+JtliRQZ5hjMGeTXno+0kx 0PQQnx/w3w3suaYiphYE6Ekyau3OGr3QFapoj2a8= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 03/19] rdma: Provide unique indexes for all visible objects Date: Tue, 22 Jan 2019 20:31:09 +0200 Message-Id: <20190122183125.15920-4-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Signed-off-by: Leon Romanovsky --- rdma/res.c | 83 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 63 insertions(+), 20 deletions(-) diff --git a/rdma/res.c b/rdma/res.c index 87865ec8..f941de5c 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -549,6 +549,22 @@ static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port) return 0; } +static void print_key(struct rd *rd, const char *name, uint64_t val) +{ + if (rd->json_output) + jsonw_xint_field(rd->jw, name, val); + else + pr_out("%s 0x%" PRIx64 " ", name, val); +} + +static void res_print_uint(struct rd *rd, const char *name, uint64_t val) +{ + if (rd->json_output) + jsonw_uint_field(rd->jw, name, val); + else + pr_out("%s %" PRIu64 " ", name, val); +} + static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; @@ -574,6 +590,7 @@ static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) uint32_t port = 0, pid = 0; uint8_t type = 0, state; uint32_t lqpn = 0, ps; + uint32_t cm_idn = 0; char *comm = NULL; int err; @@ -651,6 +668,12 @@ static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) continue; } + if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) + cm_idn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]); + if (rd_check_is_filtered(rd, "cm-idn", cm_idn)) + continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) { /* discard const from mnl_attr_get_str */ comm = (char *)mnl_attr_get_str( @@ -669,6 +692,8 @@ static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) print_ps(rd, ps); print_pid(rd, pid); print_comm(rd, comm, nla_line); + if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) + res_print_uint(rd, "cm-idn", cm_idn); if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) print_ipaddr(rd, "src-addr", src_addr_str, src_port); @@ -743,6 +768,7 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) char *comm = NULL; uint32_t pid = 0; uint8_t poll_ctx = 0; + uint32_t cqn = 0; uint64_t users; uint32_t cqe; int err; @@ -783,6 +809,12 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) continue; } + if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) + cqn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_CQN]); + if (rd_check_is_filtered(rd, "cqn", cqn)) + continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) /* discard const from mnl_attr_get_str */ comm = (char *)mnl_attr_get_str( @@ -799,6 +831,9 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) print_pid(rd, pid); print_comm(rd, comm, nla_line); + if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) + res_print_uint(rd, "cqn", cqn); + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) free(comm); @@ -808,22 +843,6 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) return MNL_CB_OK; } -static void print_key(struct rd *rd, const char *name, uint64_t val) -{ - if (rd->json_output) - jsonw_xint_field(rd->jw, name, val); - else - pr_out("%s 0x%" PRIx64 " ", name, val); -} - -static void res_print_uint(struct rd *rd, const char *name, uint64_t val) -{ - if (rd->json_output) - jsonw_uint_field(rd->jw, name, val); - else - pr_out("%s %" PRIu64 " ", name, val); -} - static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; @@ -847,6 +866,7 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) uint32_t rkey = 0, lkey = 0; uint64_t iova = 0, mrlen; char *comm = NULL; + uint32_t mrn = 0; uint32_t pid = 0; int err; @@ -885,6 +905,12 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) continue; } + if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) + mrn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_MRN]); + if (rd_check_is_filtered(rd, "mrn", mrn)) + continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) /* discard const from mnl_attr_get_str */ comm = (char *)mnl_attr_get_str( @@ -904,6 +930,9 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) print_pid(rd, pid); print_comm(rd, comm, nla_line); + if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) + res_print_uint(rd, "mrn", mrn); + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) free(comm); @@ -936,6 +965,7 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; char *comm = NULL; uint32_t pid = 0; + uint32_t pdn = 0; uint64_t users; int err; @@ -970,6 +1000,12 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) if (rd_check_is_filtered(rd, "pid", pid)) continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + pdn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + if (rd_check_is_filtered(rd, "pdn", pdn)) + continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) /* discard const from mnl_attr_get_str */ comm = (char *)mnl_attr_get_str( @@ -987,6 +1023,9 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) print_pid(rd, pid); print_comm(rd, comm, nla_line); + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + res_print_uint(rd, "pdn", pdn); + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) free(comm); @@ -1033,7 +1072,8 @@ struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "src-addr", .is_number = false }, { .name = "src-port", .is_number = true }, { .name = "dst-addr", .is_number = false }, - { .name = "dst-port", .is_number = true } + { .name = "dst-port", .is_number = true }, + { .name = "cm-idn", .is_number = true } }; RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false); @@ -1043,7 +1083,8 @@ struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "dev", .is_number = false }, { .name = "users", .is_number = true }, { .name = "poll-ctx", .is_number = false }, - { .name = "pid", .is_number = true } + { .name = "pid", .is_number = true }, + { .name = "cqn", .is_number = true } }; RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true); @@ -1054,7 +1095,8 @@ struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "rkey", .is_number = true }, { .name = "lkey", .is_number = true }, { .name = "mrlen", .is_number = true }, - { .name = "pid", .is_number = true } + { .name = "pid", .is_number = true }, + { .name = "mrn", .is_number = true } }; RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true); @@ -1063,7 +1105,8 @@ static const struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "dev", .is_number = false }, { .name = "users", .is_number = true }, - { .name = "pid", .is_number = true } + { .name = "pid", .is_number = true }, + { .name = "pdn", .is_number = true } }; RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true); From patchwork Tue Jan 22 18:31:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029439 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="jUAe5hBm"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcSy5w82z9s3q for ; Wed, 23 Jan 2019 05:31:46 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726853AbfAVSbp (ORCPT ); Tue, 22 Jan 2019 13:31:45 -0500 Received: from mail.kernel.org ([198.145.29.99]:54636 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726832AbfAVSbp (ORCPT ); Tue, 22 Jan 2019 13:31:45 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 6BC7421726; Tue, 22 Jan 2019 18:31:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181904; bh=GdIPKvf7ESKPhoNw9KvTfTNopFkeeKQqU0hG8EZcH8U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jUAe5hBmARdDHYvkZDLJ3L5pvvyqgeYeRhdW4sKtKvCzka5W7dXpG1wNK2sbk9JMy edJusjrqJG1hb5w7BFnWOwM7CN4KKJGPi1ekw7VXgcoMH0B03dQJJfRbAIu5feD+5G fEAdcS2fR4/NisRhlDmLbSFI7Qx+rgzJkmc3V4o0= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 04/19] rdma: Provide parent context index for all objects except CM_ID Date: Tue, 22 Jan 2019 20:31:10 +0200 Message-Id: <20190122183125.15920-5-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Allow users to correlate allocated object with relevant parent [leonro@server ~]$ rdma res show pd dev mlx5_0 users 5 pid 0 comm [ib_core] pdn 1 dev mlx5_0 users 7 pid 0 comm [ib_ipoib] pdn 2 dev mlx5_0 users 0 pid 0 comm [mlx5_ib] pdn 3 dev mlx5_0 users 2 pid 548 comm ibv_rc_pingpong ctxn 0 pdn 4 [leonro@server ~]$ rdma res show cq cqn 0-100 dev mlx5_0 cqe 2047 users 6 poll-ctx UNBOUND_WORKQUEUE pid 0 comm [ib_core] cqn 2 dev mlx5_0 cqe 255 users 2 poll-ctx SOFTIRQ pid 0 comm [mlx5_ib] cqn 3 dev mlx5_0 cqe 511 users 1 poll-ctx DIRECT pid 0 comm [ib_ipoib] cqn 4 dev mlx5_0 cqe 255 users 1 poll-ctx DIRECT pid 0 comm [ib_ipoib] cqn 5 dev mlx5_0 cqe 255 users 0 poll-ctx SOFTIRQ pid 0 comm [mlx5_ib] cqn 6 dev mlx5_0 cqe 511 users 2 pid 548 comm ibv_rc_pingpong cqn 7 ctxn 0 [leonro@server ~]$ rdma res show mr dev mlx5_0 mrlen 4096 pid 548 comm ibv_rc_pingpong mrn 4 pdn 0 [leonro@nps-server-14-015 ~]$ /images/leonro/src/iproute2/rdma/rdma res show qp link mlx5_0/1 lqpn 0 type SMI state RTS sq-psn 0 pid 0 comm [ib_core] link mlx5_0/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core] link mlx5_0/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core] link mlx5_0/1 lqpn 8 type UD state RTS sq-psn 0 pid 0 comm [ib_ipoib] link mlx5_0/1 lqpn 9 pdn 4 rqpn 0 type RC state INIT rq-psn 0 sq-psn 0 path-mig-state MIGRATED pid 548 comm ibv_rc_pingpong Signed-off-by: Leon Romanovsky --- rdma/res.c | 110 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 72 insertions(+), 38 deletions(-) diff --git a/rdma/res.c b/rdma/res.c index f941de5c..308f66c0 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -320,6 +320,22 @@ static char *get_task_name(uint32_t pid) return comm; } +static void print_key(struct rd *rd, const char *name, uint64_t val) +{ + if (rd->json_output) + jsonw_xint_field(rd->jw, name, val); + else + pr_out("%s 0x%" PRIx64 " ", name, val); +} + +static void res_print_uint(struct rd *rd, const char *name, uint64_t val) +{ + if (rd->json_output) + jsonw_uint_field(rd->jw, name, val); + else + pr_out("%s %" PRIu64 " ", name, val); +} + static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; @@ -343,6 +359,7 @@ static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn; uint8_t type, state, path_mig_state = 0; uint32_t port = 0, pid = 0; + uint32_t pdn = 0; char *comm = NULL; int err; @@ -369,6 +386,11 @@ static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) if (rd_check_is_filtered(rd, "lqpn", lqpn)) continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + pdn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + if (rd_check_is_filtered(rd, "pdn", pdn)) + continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) { rqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQPN]); if (rd_check_is_filtered(rd, "rqpn", rqpn)) @@ -428,6 +450,8 @@ static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) print_link(rd, idx, name, port, nla_line); print_lqpn(rd, lqpn); + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + res_print_uint(rd, "pdn", pdn); print_rqpn(rd, rqpn, nla_line); print_type(rd, type); @@ -549,22 +573,6 @@ static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port) return 0; } -static void print_key(struct rd *rd, const char *name, uint64_t val) -{ - if (rd->json_output) - jsonw_xint_field(rd->jw, name, val); - else - pr_out("%s 0x%" PRIx64 " ", name, val); -} - -static void res_print_uint(struct rd *rd, const char *name, uint64_t val) -{ - if (rd->json_output) - jsonw_uint_field(rd->jw, name, val); - else - pr_out("%s %" PRIu64 " ", name, val); -} - static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; @@ -768,6 +776,7 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) char *comm = NULL; uint32_t pid = 0; uint8_t poll_ctx = 0; + uint32_t ctxn = 0; uint32_t cqn = 0; uint64_t users; uint32_t cqe; @@ -815,6 +824,12 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) if (rd_check_is_filtered(rd, "cqn", cqn)) continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) + ctxn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); + if (rd_check_is_filtered(rd, "ctxn", ctxn)) + continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) /* discard const from mnl_attr_get_str */ comm = (char *)mnl_attr_get_str( @@ -833,6 +848,8 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) res_print_uint(rd, "cqn", cqn); + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) + res_print_uint(rd, "ctxn", ctxn); if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) free(comm); @@ -866,6 +883,7 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) uint32_t rkey = 0, lkey = 0; uint64_t iova = 0, mrlen; char *comm = NULL; + uint32_t pdn = 0; uint32_t mrn = 0; uint32_t pid = 0; int err; @@ -911,6 +929,12 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) if (rd_check_is_filtered(rd, "mrn", mrn)) continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + pdn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + if (rd_check_is_filtered(rd, "pdn", pdn)) + continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) /* discard const from mnl_attr_get_str */ comm = (char *)mnl_attr_get_str( @@ -933,6 +957,9 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) res_print_uint(rd, "mrn", mrn); + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + res_print_uint(rd, "pdn", pdn); + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) free(comm); @@ -964,6 +991,7 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) uint32_t local_dma_lkey = 0, unsafe_global_rkey = 0; struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; char *comm = NULL; + uint32_t ctxn = 0; uint32_t pid = 0; uint32_t pdn = 0; uint64_t users; @@ -997,7 +1025,13 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) comm = get_task_name(pid); } - if (rd_check_is_filtered(rd, "pid", pid)) + if (rd_check_is_filtered(rd, "pid", pid)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) + ctxn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); + + if (rd_check_is_filtered(rd, "ctxn", ctxn)) continue; if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) @@ -1022,6 +1056,8 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) print_key(rd, "unsafe_global_rkey", unsafe_global_rkey); print_pid(rd, pid); print_comm(rd, comm, nla_line); + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) + res_print_uint(rd, "ctxn", ctxn); if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) res_print_uint(rd, "pdn", pdn); @@ -1038,24 +1074,18 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) RES_FUNC(res_no_args, RDMA_NLDEV_CMD_RES_GET, NULL, true); static const struct -filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = {{ .name = "link", - .is_number = false }, - { .name = "lqpn", - .is_number = true }, - { .name = "rqpn", - .is_number = true }, - { .name = "pid", - .is_number = true }, - { .name = "sq-psn", - .is_number = true }, - { .name = "rq-psn", - .is_number = true }, - { .name = "type", - .is_number = false }, - { .name = "path-mig-state", - .is_number = false }, - { .name = "state", - .is_number = false } }; +filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = { + { .name = "link", .is_number = false }, + { .name = "lqpn", .is_number = true }, + { .name = "rqpn", .is_number = true }, + { .name = "pid", .is_number = true }, + { .name = "sq-psn", .is_number = true }, + { .name = "rq-psn", .is_number = true }, + { .name = "type", .is_number = false }, + { .name = "path-mig-state", .is_number = false }, + { .name = "state", .is_number = false }, + { .name = "pdn", .is_number = true }, +}; RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false); @@ -1084,7 +1114,8 @@ struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "users", .is_number = true }, { .name = "poll-ctx", .is_number = false }, { .name = "pid", .is_number = true }, - { .name = "cqn", .is_number = true } + { .name = "cqn", .is_number = true }, + { .name = "ctxn", .is_number = true } }; RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true); @@ -1096,7 +1127,8 @@ struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "lkey", .is_number = true }, { .name = "mrlen", .is_number = true }, { .name = "pid", .is_number = true }, - { .name = "mrn", .is_number = true } + { .name = "mrn", .is_number = true }, + { .name = "pdn", .is_number = true } }; RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true); @@ -1106,7 +1138,9 @@ struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "dev", .is_number = false }, { .name = "users", .is_number = true }, { .name = "pid", .is_number = true }, - { .name = "pdn", .is_number = true } + { .name = "ctxn", .is_number = true }, + { .name = "pdn", .is_number = true }, + { .name = "ctxn", .is_number = true } }; RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true); From patchwork Tue Jan 22 18:31:11 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029440 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="BDfVLk7r"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcT33drHz9s3q for ; Wed, 23 Jan 2019 05:31:51 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726886AbfAVSbu (ORCPT ); Tue, 22 Jan 2019 13:31:50 -0500 Received: from mail.kernel.org ([198.145.29.99]:54672 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726857AbfAVSbs (ORCPT ); Tue, 22 Jan 2019 13:31:48 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 96ABD217D6; Tue, 22 Jan 2019 18:31:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181907; bh=2gbOnlN7yLBe8po9GoDsMtUMfu3meFBua9hW4sPt8y8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BDfVLk7ry9REXdT9n7Pvo6tYgRwbz4MmG3YJaozuSxgaCM7Gm+/aXgH7MmUG10MOL +TXxR/AAmKIkqd7j9x5MYW37JSDCmq2Rbnjll7/4lhWGYRRNx552mA16turKZZcCuN fXNypD6fnCcXQiESSr6Alo1n79jY5EZB07G11SPU= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 05/19] rdma: Move resource PD logic to separate file Date: Tue, 22 Jan 2019 20:31:11 +0200 Message-Id: <20190122183125.15920-6-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Logically separate resource PD logic to separate file, in order to make PD specific logic self-contained. Signed-off-by: Leon Romanovsky --- rdma/Makefile | 2 +- rdma/res-pd.c | 110 ++++++++++++++++++++++++++++++++++++ rdma/res.c | 154 +++----------------------------------------------- rdma/res.h | 55 ++++++++++++++++++ 4 files changed, 175 insertions(+), 146 deletions(-) create mode 100644 rdma/res-pd.c create mode 100644 rdma/res.h diff --git a/rdma/Makefile b/rdma/Makefile index 0498994f..9c2fb203 100644 --- a/rdma/Makefile +++ b/rdma/Makefile @@ -6,7 +6,7 @@ TARGETS := ifeq ($(HAVE_MNL),y) CFLAGS += -I./include/uapi/ -RDMA_OBJ = rdma.o utils.o dev.o link.o res.o +RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o TARGETS += rdma endif diff --git a/rdma/res-pd.c b/rdma/res-pd.c new file mode 100644 index 00000000..d879a21a --- /dev/null +++ b/rdma/res-pd.c @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB +/* + * res-pd.c RDMA tool + * Authors: Leon Romanovsky + */ + +#include "res.h" +#include + +int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct nlattr *nla_table, *nla_entry; + struct rd *rd = data; + const char *name; + uint32_t idx; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME] || + !tb[RDMA_NLDEV_ATTR_RES_PD]) + return MNL_CB_ERROR; + + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + nla_table = tb[RDMA_NLDEV_ATTR_RES_PD]; + + mnl_attr_for_each_nested(nla_entry, nla_table) { + uint32_t local_dma_lkey = 0, unsafe_global_rkey = 0; + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + char *comm = NULL; + uint32_t ctxn = 0; + uint32_t pid = 0; + uint32_t pdn = 0; + uint64_t users; + int err; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (err != MNL_CB_OK) + return MNL_CB_ERROR; + + if (!nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || + (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && + !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { + return MNL_CB_ERROR; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) + local_dma_lkey = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]); + + users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); + if (rd_check_is_filtered(rd, "users", users)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) + unsafe_global_rkey = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]); + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { + pid = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_PID]); + comm = get_task_name(pid); + } + + if (rd_check_is_filtered(rd, "pid", pid)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) + ctxn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); + + if (rd_check_is_filtered(rd, "ctxn", ctxn)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + pdn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + if (rd_check_is_filtered(rd, "pdn", pdn)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) + /* discard const from mnl_attr_get_str */ + comm = (char *)mnl_attr_get_str( + nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); + + if (rd->json_output) + jsonw_start_array(rd->jw); + + print_dev(rd, idx, name); + if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) + print_key(rd, "local_dma_lkey", local_dma_lkey); + print_users(rd, users); + if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) + print_key(rd, "unsafe_global_rkey", unsafe_global_rkey); + print_pid(rd, pid); + print_comm(rd, comm, nla_line); + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) + res_print_uint(rd, "ctxn", ctxn); + + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + res_print_uint(rd, "pdn", pdn); + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) + free(comm); + + print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); + newline(rd); + } + return MNL_CB_OK; +} diff --git a/rdma/res.c b/rdma/res.c index 308f66c0..494a82e4 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -9,7 +9,7 @@ * Authors: Leon Romanovsky */ -#include "rdma.h" +#include "res.h" #include static int res_help(struct rd *rd) @@ -92,7 +92,7 @@ static int res_no_args_parse_cb(const struct nlmsghdr *nlh, void *data) return MNL_CB_OK; } -static int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback) +int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback) { uint32_t flags = NLM_F_REQUEST | NLM_F_ACK; uint32_t seq; @@ -119,27 +119,6 @@ static int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback) return ret; } -#define RES_FUNC(name, command, valid_filters, strict_port) \ - static int _##name(struct rd *rd)\ - { \ - return _res_send_msg(rd, command, name##_parse_cb); \ - } \ - static int name(struct rd *rd) \ - {\ - int ret = rd_build_filter(rd, valid_filters); \ - if (ret) \ - return ret; \ - if ((uintptr_t)valid_filters != (uintptr_t)NULL) { \ - ret = rd_set_arg_to_devname(rd); \ - if (ret) \ - return ret;\ - } \ - if (strict_port) \ - return rd_exec_dev(rd, _##name); \ - else \ - return rd_exec_link(rd, _##name, strict_port); \ - } - static const char *path_mig_to_str(uint8_t idx) { static const char * const path_mig_str[] = { "MIGRATED", @@ -244,7 +223,7 @@ static void print_pathmig(struct rd *rd, uint32_t val, pr_out("path-mig-state %s ", path_mig_to_str(val)); } -static void print_pid(struct rd *rd, uint32_t val) +void print_pid(struct rd *rd, uint32_t val) { if (rd->json_output) jsonw_uint_field(rd->jw, "pid", val); @@ -252,8 +231,7 @@ static void print_pid(struct rd *rd, uint32_t val) pr_out("pid %u ", val); } -static void print_comm(struct rd *rd, const char *str, - struct nlattr **nla_line) +void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line) { char tmp[18]; @@ -271,7 +249,7 @@ static void print_comm(struct rd *rd, const char *str, pr_out("comm %s ", tmp); } -static void print_dev(struct rd *rd, uint32_t idx, const char *name) +void print_dev(struct rd *rd, uint32_t idx, const char *name) { if (rd->json_output) { jsonw_uint_field(rd->jw, "ifindex", idx); @@ -299,7 +277,7 @@ static void print_link(struct rd *rd, uint32_t idx, const char *name, } } -static char *get_task_name(uint32_t pid) +char *get_task_name(uint32_t pid) { char *comm; FILE *f; @@ -320,7 +298,7 @@ static char *get_task_name(uint32_t pid) return comm; } -static void print_key(struct rd *rd, const char *name, uint64_t val) +void print_key(struct rd *rd, const char *name, uint64_t val) { if (rd->json_output) jsonw_xint_field(rd->jw, name, val); @@ -328,7 +306,7 @@ static void print_key(struct rd *rd, const char *name, uint64_t val) pr_out("%s 0x%" PRIx64 " ", name, val); } -static void res_print_uint(struct rd *rd, const char *name, uint64_t val) +void res_print_uint(struct rd *rd, const char *name, uint64_t val) { if (rd->json_output) jsonw_uint_field(rd->jw, name, val); @@ -725,7 +703,7 @@ static void print_cqe(struct rd *rd, uint32_t val) pr_out("cqe %u ", val); } -static void print_users(struct rd *rd, uint64_t val) +void print_users(struct rd *rd, uint64_t val) { if (rd->json_output) jsonw_uint_field(rd->jw, "users", val); @@ -969,108 +947,6 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) return MNL_CB_OK; } -static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) -{ - struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; - struct nlattr *nla_table, *nla_entry; - struct rd *rd = data; - const char *name; - uint32_t idx; - - mnl_attr_parse(nlh, 0, rd_attr_cb, tb); - if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || - !tb[RDMA_NLDEV_ATTR_DEV_NAME] || - !tb[RDMA_NLDEV_ATTR_RES_PD]) - return MNL_CB_ERROR; - - name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); - idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); - nla_table = tb[RDMA_NLDEV_ATTR_RES_PD]; - - mnl_attr_for_each_nested(nla_entry, nla_table) { - uint32_t local_dma_lkey = 0, unsafe_global_rkey = 0; - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - char *comm = NULL; - uint32_t ctxn = 0; - uint32_t pid = 0; - uint32_t pdn = 0; - uint64_t users; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; - - if (!nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) - local_dma_lkey = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]); - - users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); - if (rd_check_is_filtered(rd, "users", users)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) - unsafe_global_rkey = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) - ctxn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); - - if (rd_check_is_filtered(rd, "ctxn", ctxn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - pdn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - if (rd_check_is_filtered(rd, "pdn", pdn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str( - nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_dev(rd, idx, name); - if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) - print_key(rd, "local_dma_lkey", local_dma_lkey); - print_users(rd, users); - if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) - print_key(rd, "unsafe_global_rkey", unsafe_global_rkey); - print_pid(rd, pid); - print_comm(rd, comm, nla_line); - if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) - res_print_uint(rd, "ctxn", ctxn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - res_print_uint(rd, "pdn", pdn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); - } - return MNL_CB_OK; -} - RES_FUNC(res_no_args, RDMA_NLDEV_CMD_RES_GET, NULL, true); static const struct @@ -1133,18 +1009,6 @@ struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = { RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true); -static const -struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = { - { .name = "dev", .is_number = false }, - { .name = "users", .is_number = true }, - { .name = "pid", .is_number = true }, - { .name = "ctxn", .is_number = true }, - { .name = "pdn", .is_number = true }, - { .name = "ctxn", .is_number = true } -}; - -RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true); - static int res_show(struct rd *rd) { const struct rd_cmd cmds[] = { diff --git a/rdma/res.h b/rdma/res.h new file mode 100644 index 00000000..dd01b803 --- /dev/null +++ b/rdma/res.h @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ +/* + * res.h RDMA tool + * Authors: Leon Romanovsky + */ +#ifndef _RDMA_TOOL_RES_H_ +#define _RDMA_TOOL_RES_H_ + +#include "rdma.h" + +int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback); +int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data); + +#define RES_FUNC(name, command, valid_filters, strict_port) \ + static inline int _##name(struct rd *rd)\ + { \ + return _res_send_msg(rd, command, name##_parse_cb); \ + } \ + static inline int name(struct rd *rd) \ + {\ + int ret = rd_build_filter(rd, valid_filters); \ + if (ret) \ + return ret; \ + if ((uintptr_t)valid_filters != (uintptr_t)NULL) { \ + ret = rd_set_arg_to_devname(rd); \ + if (ret) \ + return ret;\ + } \ + if (strict_port) \ + return rd_exec_dev(rd, _##name); \ + else \ + return rd_exec_link(rd, _##name, strict_port); \ + } + +static const +struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = { + { .name = "dev", .is_number = false }, + { .name = "users", .is_number = true }, + { .name = "pid", .is_number = true }, + { .name = "ctxn", .is_number = true }, + { .name = "pdn", .is_number = true }, + { .name = "ctxn", .is_number = true } +}; + +RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true); + +char *get_task_name(uint32_t pid); +void print_dev(struct rd *rd, uint32_t idx, const char *name); +void print_users(struct rd *rd, uint64_t val); +void print_key(struct rd *rd, const char *name, uint64_t val); +void res_print_uint(struct rd *rd, const char *name, uint64_t val); +void print_pid(struct rd *rd, uint32_t val); +void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line); + +#endif /* _RDMA_TOOL_RES_H_ */ From patchwork Tue Jan 22 18:31:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029441 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="0Mi7H4hC"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcT720B4z9s3q for ; Wed, 23 Jan 2019 05:31:55 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726815AbfAVSby (ORCPT ); Tue, 22 Jan 2019 13:31:54 -0500 Received: from mail.kernel.org ([198.145.29.99]:54710 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726857AbfAVSbv (ORCPT ); Tue, 22 Jan 2019 13:31:51 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id BFEE221726; Tue, 22 Jan 2019 18:31:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181910; bh=jJn5JiR/ACzUlTG2S+wHZN89Tt6dHyKZmwHMmk1KP2Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=0Mi7H4hC6J4oztfLGfreokV/RIDJWOIvoS2mTzHi4Mi3doNOVCG9BqcCDUbHdFn5J YGVtHVQ6TgufnpaJoDop8rwmXKxajV2jaWK22rEK64KUwstz+eirAVUwFPjTXPJui2 hjLfsvtm2c0cOuLpaNottbp+59+qOaNK+s6k/yyU= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 06/19] rdma: Refactor out resource MR logic to separate file Date: Tue, 22 Jan 2019 20:31:12 +0200 Message-Id: <20190122183125.15920-7-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Logically separate resource MR logic to separate file, in order to make MR specific logic self-contained. Signed-off-by: Leon Romanovsky --- rdma/Makefile | 2 +- rdma/res-mr.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++ rdma/res.c | 122 -------------------------------------------------- rdma/res.h | 14 ++++++ 4 files changed, 132 insertions(+), 123 deletions(-) create mode 100644 rdma/res-mr.c diff --git a/rdma/Makefile b/rdma/Makefile index 9c2fb203..0b4e1eef 100644 --- a/rdma/Makefile +++ b/rdma/Makefile @@ -6,7 +6,7 @@ TARGETS := ifeq ($(HAVE_MNL),y) CFLAGS += -I./include/uapi/ -RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o +RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o TARGETS += rdma endif diff --git a/rdma/res-mr.c b/rdma/res-mr.c new file mode 100644 index 00000000..dae5def2 --- /dev/null +++ b/rdma/res-mr.c @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB +/* + * res-mr.c RDMA tool + * Authors: Leon Romanovsky + */ + +#include "res.h" +#include + +int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct nlattr *nla_table, *nla_entry; + struct rd *rd = data; + const char *name; + uint32_t idx; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME] || + !tb[RDMA_NLDEV_ATTR_RES_MR]) + return MNL_CB_ERROR; + + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + nla_table = tb[RDMA_NLDEV_ATTR_RES_MR]; + + mnl_attr_for_each_nested(nla_entry, nla_table) { + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + uint32_t rkey = 0, lkey = 0; + uint64_t iova = 0, mrlen; + char *comm = NULL; + uint32_t pdn = 0; + uint32_t mrn = 0; + uint32_t pid = 0; + int err; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (err != MNL_CB_OK) + return MNL_CB_ERROR; + + if (!nla_line[RDMA_NLDEV_ATTR_RES_MRLEN] || + (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && + !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { + return MNL_CB_ERROR; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) + rkey = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_RKEY]); + if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) + lkey = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_LKEY]); + if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) + iova = mnl_attr_get_u64( + nla_line[RDMA_NLDEV_ATTR_RES_IOVA]); + + mrlen = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]); + if (rd_check_is_filtered(rd, "mrlen", mrlen)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { + pid = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_PID]); + comm = get_task_name(pid); + } + + if (rd_check_is_filtered(rd, "pid", pid)) { + free(comm); + continue; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) + mrn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_MRN]); + if (rd_check_is_filtered(rd, "mrn", mrn)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + pdn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + if (rd_check_is_filtered(rd, "pdn", pdn)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) + /* discard const from mnl_attr_get_str */ + comm = (char *)mnl_attr_get_str( + nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); + + if (rd->json_output) + jsonw_start_array(rd->jw); + + print_dev(rd, idx, name); + if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) + print_key(rd, "rkey", rkey); + if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) + print_key(rd, "lkey", lkey); + if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) + print_key(rd, "iova", iova); + res_print_uint(rd, "mrlen", mrlen); + print_pid(rd, pid); + print_comm(rd, comm, nla_line); + + if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) + res_print_uint(rd, "mrn", mrn); + + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + res_print_uint(rd, "pdn", pdn); + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) + free(comm); + + print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); + newline(rd); + } + return MNL_CB_OK; +} + diff --git a/rdma/res.c b/rdma/res.c index 494a82e4..1de8c797 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -838,115 +838,6 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) return MNL_CB_OK; } -static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) -{ - struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; - struct nlattr *nla_table, *nla_entry; - struct rd *rd = data; - const char *name; - uint32_t idx; - - mnl_attr_parse(nlh, 0, rd_attr_cb, tb); - if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || - !tb[RDMA_NLDEV_ATTR_DEV_NAME] || - !tb[RDMA_NLDEV_ATTR_RES_MR]) - return MNL_CB_ERROR; - - name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); - idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); - nla_table = tb[RDMA_NLDEV_ATTR_RES_MR]; - - mnl_attr_for_each_nested(nla_entry, nla_table) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - uint32_t rkey = 0, lkey = 0; - uint64_t iova = 0, mrlen; - char *comm = NULL; - uint32_t pdn = 0; - uint32_t mrn = 0; - uint32_t pid = 0; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; - - if (!nla_line[RDMA_NLDEV_ATTR_RES_MRLEN] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) - rkey = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_RKEY]); - if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) - lkey = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_LKEY]); - if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) - iova = mnl_attr_get_u64( - nla_line[RDMA_NLDEV_ATTR_RES_IOVA]); - - mrlen = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]); - if (rd_check_is_filtered(rd, "mrlen", mrlen)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) { - free(comm); - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) - mrn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_MRN]); - if (rd_check_is_filtered(rd, "mrn", mrn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - pdn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - if (rd_check_is_filtered(rd, "pdn", pdn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str( - nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_dev(rd, idx, name); - if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) - print_key(rd, "rkey", rkey); - if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) - print_key(rd, "lkey", lkey); - if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) - print_key(rd, "iova", iova); - res_print_uint(rd, "mrlen", mrlen); - print_pid(rd, pid); - print_comm(rd, comm, nla_line); - - if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) - res_print_uint(rd, "mrn", mrn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - res_print_uint(rd, "pdn", pdn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); - } - return MNL_CB_OK; -} - RES_FUNC(res_no_args, RDMA_NLDEV_CMD_RES_GET, NULL, true); static const struct @@ -996,19 +887,6 @@ struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = { RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true); -static const -struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = { - { .name = "dev", .is_number = false }, - { .name = "rkey", .is_number = true }, - { .name = "lkey", .is_number = true }, - { .name = "mrlen", .is_number = true }, - { .name = "pid", .is_number = true }, - { .name = "mrn", .is_number = true }, - { .name = "pdn", .is_number = true } -}; - -RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true); - static int res_show(struct rd *rd) { const struct rd_cmd cmds[] = { diff --git a/rdma/res.h b/rdma/res.h index dd01b803..e3619773 100644 --- a/rdma/res.h +++ b/rdma/res.h @@ -10,6 +10,7 @@ int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback); int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data); +int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data); #define RES_FUNC(name, command, valid_filters, strict_port) \ static inline int _##name(struct rd *rd)\ @@ -44,6 +45,19 @@ struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = { RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true); +static const +struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = { + { .name = "dev", .is_number = false }, + { .name = "rkey", .is_number = true }, + { .name = "lkey", .is_number = true }, + { .name = "mrlen", .is_number = true }, + { .name = "pid", .is_number = true }, + { .name = "mrn", .is_number = true }, + { .name = "pdn", .is_number = true } +}; + +RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true); + char *get_task_name(uint32_t pid); void print_dev(struct rd *rd, uint32_t idx, const char *name); void print_users(struct rd *rd, uint64_t val); From patchwork Tue Jan 22 18:31:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029442 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="fZBNKeqk"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcT91v58z9s3q for ; Wed, 23 Jan 2019 05:31:57 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726938AbfAVSb4 (ORCPT ); Tue, 22 Jan 2019 13:31:56 -0500 Received: from mail.kernel.org ([198.145.29.99]:54750 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726891AbfAVSbz (ORCPT ); Tue, 22 Jan 2019 13:31:55 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id EBBAD217D6; Tue, 22 Jan 2019 18:31:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181913; bh=2QFTDOoHOts4i1ymUEP5vv2fWKzC2Lc5gF3w/yLMXPE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fZBNKeqkkDkFR67hc35hBJMtGHRjj1l27zrt6cJIv7r9y6ksy3rkkLjZYzyLnHtAF rUrcSZSpQ7BAxEfqFLswdL/AC5FlMqOHX5pwVwtans+LJ5R6skr/ZVvdboc72Cdogs vmzk41Ssd+lfxMnWAtKI5bt7+lFiGcI7zjSMXNDQ= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 07/19] rdma: Move out resource CQ logic to separate file Date: Tue, 22 Jan 2019 20:31:13 +0200 Message-Id: <20190122183125.15920-8-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Logically separate resource CQ logic to separate file, in order to make CQ specific logic self-contained. Signed-off-by: Leon Romanovsky --- rdma/Makefile | 2 +- rdma/res-cq.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++ rdma/res.c | 147 -------------------------------------------------- rdma/res.h | 13 +++++ 4 files changed, 157 insertions(+), 148 deletions(-) create mode 100644 rdma/res-cq.c diff --git a/rdma/Makefile b/rdma/Makefile index 0b4e1eef..e32ccd18 100644 --- a/rdma/Makefile +++ b/rdma/Makefile @@ -6,7 +6,7 @@ TARGETS := ifeq ($(HAVE_MNL),y) CFLAGS += -I./include/uapi/ -RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o +RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o res-cq.o TARGETS += rdma endif diff --git a/rdma/res-cq.c b/rdma/res-cq.c new file mode 100644 index 00000000..fbfe593b --- /dev/null +++ b/rdma/res-cq.c @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB +/* + * res-cq.c RDMA tool + * Authors: Leon Romanovsky + */ + +#include "res.h" +#include + +static void print_cqe(struct rd *rd, uint32_t val) +{ + if (rd->json_output) + jsonw_uint_field(rd->jw, "cqe", val); + else + pr_out("cqe %u ", val); +} + +static const char *poll_ctx_to_str(uint8_t idx) +{ + static const char * const cm_id_states_str[] = { + "DIRECT", "SOFTIRQ", "WORKQUEUE", "UNBOUND_WORKQUEUE"}; + + if (idx < ARRAY_SIZE(cm_id_states_str)) + return cm_id_states_str[idx]; + return "UNKNOWN"; +} + +static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx) +{ + if (rd->json_output) { + jsonw_string_field(rd->jw, "poll-ctx", + poll_ctx_to_str(poll_ctx)); + return; + } + pr_out("poll-ctx %s ", poll_ctx_to_str(poll_ctx)); +} + +int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct nlattr *nla_table, *nla_entry; + struct rd *rd = data; + const char *name; + uint32_t idx; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME] || + !tb[RDMA_NLDEV_ATTR_RES_CQ]) + return MNL_CB_ERROR; + + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + nla_table = tb[RDMA_NLDEV_ATTR_RES_CQ]; + + mnl_attr_for_each_nested(nla_entry, nla_table) { + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + char *comm = NULL; + uint32_t pid = 0; + uint8_t poll_ctx = 0; + uint32_t ctxn = 0; + uint32_t cqn = 0; + uint64_t users; + uint32_t cqe; + int err; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (err != MNL_CB_OK) + return MNL_CB_ERROR; + + if (!nla_line[RDMA_NLDEV_ATTR_RES_CQE] || + !nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || + (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && + !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { + return MNL_CB_ERROR; + } + + cqe = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQE]); + + users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); + if (rd_check_is_filtered(rd, "users", users)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) { + poll_ctx = mnl_attr_get_u8( + nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]); + if (rd_check_is_string_filtered( + rd, "poll-ctx", poll_ctx_to_str(poll_ctx))) + continue; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { + pid = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_PID]); + comm = get_task_name(pid); + } + + if (rd_check_is_filtered(rd, "pid", pid)) { + free(comm); + continue; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) + cqn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_CQN]); + if (rd_check_is_filtered(rd, "cqn", cqn)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) + ctxn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); + if (rd_check_is_filtered(rd, "ctxn", ctxn)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) + /* discard const from mnl_attr_get_str */ + comm = (char *)mnl_attr_get_str( + nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); + + if (rd->json_output) + jsonw_start_array(rd->jw); + + print_dev(rd, idx, name); + print_cqe(rd, cqe); + print_users(rd, users); + if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) + print_poll_ctx(rd, poll_ctx); + print_pid(rd, pid); + print_comm(rd, comm, nla_line); + + if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) + res_print_uint(rd, "cqn", cqn); + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) + res_print_uint(rd, "ctxn", ctxn); + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) + free(comm); + + print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); + newline(rd); + } + return MNL_CB_OK; +} + diff --git a/rdma/res.c b/rdma/res.c index 1de8c797..7956882e 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -695,14 +695,6 @@ static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) return MNL_CB_OK; } -static void print_cqe(struct rd *rd, uint32_t val) -{ - if (rd->json_output) - jsonw_uint_field(rd->jw, "cqe", val); - else - pr_out("cqe %u ", val); -} - void print_users(struct rd *rd, uint64_t val) { if (rd->json_output) @@ -711,133 +703,6 @@ void print_users(struct rd *rd, uint64_t val) pr_out("users %" PRIu64 " ", val); } -static const char *poll_ctx_to_str(uint8_t idx) -{ - static const char * const cm_id_states_str[] = { - "DIRECT", "SOFTIRQ", "WORKQUEUE", "UNBOUND_WORKQUEUE"}; - - if (idx < ARRAY_SIZE(cm_id_states_str)) - return cm_id_states_str[idx]; - return "UNKNOWN"; -} - -static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx) -{ - if (rd->json_output) { - jsonw_string_field(rd->jw, "poll-ctx", - poll_ctx_to_str(poll_ctx)); - return; - } - pr_out("poll-ctx %s ", poll_ctx_to_str(poll_ctx)); -} - -static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) -{ - struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; - struct nlattr *nla_table, *nla_entry; - struct rd *rd = data; - const char *name; - uint32_t idx; - - mnl_attr_parse(nlh, 0, rd_attr_cb, tb); - if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || - !tb[RDMA_NLDEV_ATTR_DEV_NAME] || - !tb[RDMA_NLDEV_ATTR_RES_CQ]) - return MNL_CB_ERROR; - - name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); - idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); - nla_table = tb[RDMA_NLDEV_ATTR_RES_CQ]; - - mnl_attr_for_each_nested(nla_entry, nla_table) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - char *comm = NULL; - uint32_t pid = 0; - uint8_t poll_ctx = 0; - uint32_t ctxn = 0; - uint32_t cqn = 0; - uint64_t users; - uint32_t cqe; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; - - if (!nla_line[RDMA_NLDEV_ATTR_RES_CQE] || - !nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - cqe = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQE]); - - users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); - if (rd_check_is_filtered(rd, "users", users)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) { - poll_ctx = mnl_attr_get_u8( - nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]); - if (rd_check_is_string_filtered(rd, "poll-ctx", - poll_ctx_to_str(poll_ctx))) - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) { - free(comm); - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) - cqn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_CQN]); - if (rd_check_is_filtered(rd, "cqn", cqn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) - ctxn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); - if (rd_check_is_filtered(rd, "ctxn", ctxn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str( - nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_dev(rd, idx, name); - print_cqe(rd, cqe); - print_users(rd, users); - if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) - print_poll_ctx(rd, poll_ctx); - print_pid(rd, pid); - print_comm(rd, comm, nla_line); - - if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) - res_print_uint(rd, "cqn", cqn); - if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) - res_print_uint(rd, "ctxn", ctxn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); - } - return MNL_CB_OK; -} - RES_FUNC(res_no_args, RDMA_NLDEV_CMD_RES_GET, NULL, true); static const struct @@ -875,18 +740,6 @@ struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = { RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false); -static const -struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = { - { .name = "dev", .is_number = false }, - { .name = "users", .is_number = true }, - { .name = "poll-ctx", .is_number = false }, - { .name = "pid", .is_number = true }, - { .name = "cqn", .is_number = true }, - { .name = "ctxn", .is_number = true } -}; - -RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true); - static int res_show(struct rd *rd) { const struct rd_cmd cmds[] = { diff --git a/rdma/res.h b/rdma/res.h index e3619773..19f0d420 100644 --- a/rdma/res.h +++ b/rdma/res.h @@ -11,6 +11,7 @@ int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback); int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data); int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data); +int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data); #define RES_FUNC(name, command, valid_filters, strict_port) \ static inline int _##name(struct rd *rd)\ @@ -58,6 +59,18 @@ struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = { RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true); +static const +struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = { + { .name = "dev", .is_number = false }, + { .name = "users", .is_number = true }, + { .name = "poll-ctx", .is_number = false }, + { .name = "pid", .is_number = true }, + { .name = "cqn", .is_number = true }, + { .name = "ctxn", .is_number = true } +}; + +RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true); + char *get_task_name(uint32_t pid); void print_dev(struct rd *rd, uint32_t idx, const char *name); void print_users(struct rd *rd, uint64_t val); From patchwork Tue Jan 22 18:31:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029443 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="f9oFcggj"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTF0WCLz9s4s for ; Wed, 23 Jan 2019 05:32:00 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726961AbfAVSb7 (ORCPT ); Tue, 22 Jan 2019 13:31:59 -0500 Received: from mail.kernel.org ([198.145.29.99]:54788 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726880AbfAVSb6 (ORCPT ); Tue, 22 Jan 2019 13:31:58 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 1B55721726; Tue, 22 Jan 2019 18:31:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181916; bh=Ic86m7wcRbVV1vO7DYbQM4As3Lwhd8H3w/mFQJzWvGQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f9oFcggj6SlYZMSkOvjlM4TLtn7Zz67ZzAw1iMGK+iD4MxXhxTr0+gRE/YduwKycX a4yDOGdFjomPTdwUTMJLPseiINUbziU+erfmc+DB2n4ZUooVfxUFVn+9LPFS+hqab3 82xrE4ITOPGhfQBbSn1bdaks39Epg9+Rn+B33Pjs= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 08/19] rdma: Move out resource CM-ID logic to separate file Date: Tue, 22 Jan 2019 20:31:14 +0200 Message-Id: <20190122183125.15920-9-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Logically separate resource CM-ID logic to separate file, in order to make CM-ID specific logic self-contained. Signed-off-by: Leon Romanovsky --- rdma/Makefile | 3 +- rdma/res-cmid.c | 252 ++++++++++++++++++++++++++++++++++++++++++++ rdma/res.c | 271 +----------------------------------------------- rdma/res.h | 24 +++++ 4 files changed, 282 insertions(+), 268 deletions(-) create mode 100644 rdma/res-cmid.c diff --git a/rdma/Makefile b/rdma/Makefile index e32ccd18..ef240404 100644 --- a/rdma/Makefile +++ b/rdma/Makefile @@ -6,7 +6,8 @@ TARGETS := ifeq ($(HAVE_MNL),y) CFLAGS += -I./include/uapi/ -RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o res-cq.o +RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o res-cq.o \ + res-cmid.o TARGETS += rdma endif diff --git a/rdma/res-cmid.c b/rdma/res-cmid.c new file mode 100644 index 00000000..b63634a3 --- /dev/null +++ b/rdma/res-cmid.c @@ -0,0 +1,252 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB +/* + * res-cmid.c RDMA tool + * Authors: Leon Romanovsky + */ + +#include "res.h" +#include + +static void print_qp_type(struct rd *rd, uint32_t val) +{ + if (rd->json_output) + jsonw_string_field(rd->jw, "qp-type", qp_types_to_str(val)); + else + pr_out("qp-type %s ", qp_types_to_str(val)); +} + +static const char *cm_id_state_to_str(uint8_t idx) +{ + static const char *const cm_id_states_str[] = { + "IDLE", "ADDR_QUERY", "ADDR_RESOLVED", + "ROUTE_QUERY", "ROUTE_RESOLVED", "CONNECT", + "DISCONNECT", "ADDR_BOUND", "LISTEN", + "DEVICE_REMOVAL", "DESTROYING" + }; + + if (idx < ARRAY_SIZE(cm_id_states_str)) + return cm_id_states_str[idx]; + return "UNKNOWN"; +} + +static const char *cm_id_ps_to_str(uint32_t ps) +{ + switch (ps) { + case RDMA_PS_IPOIB: + return "IPoIB"; + case RDMA_PS_IB: + return "IPoIB"; + case RDMA_PS_TCP: + return "TCP"; + case RDMA_PS_UDP: + return "UDP"; + default: + return "---"; + } +} + +static void print_cm_id_state(struct rd *rd, uint8_t state) +{ + if (rd->json_output) { + jsonw_string_field(rd->jw, "state", cm_id_state_to_str(state)); + return; + } + pr_out("state %s ", cm_id_state_to_str(state)); +} + +static void print_ps(struct rd *rd, uint32_t ps) +{ + if (rd->json_output) { + jsonw_string_field(rd->jw, "ps", cm_id_ps_to_str(ps)); + return; + } + pr_out("ps %s ", cm_id_ps_to_str(ps)); +} + +static void print_ipaddr(struct rd *rd, const char *key, char *addrstr, + uint16_t port) +{ + if (rd->json_output) { + int name_size = INET6_ADDRSTRLEN + strlen(":65535"); + char json_name[name_size]; + + snprintf(json_name, name_size, "%s:%u", addrstr, port); + jsonw_string_field(rd->jw, key, json_name); + return; + } + pr_out("%s %s:%u ", key, addrstr, port); +} + +static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port) +{ + struct __kernel_sockaddr_storage *addr; + + addr = (struct __kernel_sockaddr_storage *)mnl_attr_get_payload( + nla_line); + switch (addr->ss_family) { + case AF_INET: { + struct sockaddr_in *sin = (struct sockaddr_in *)addr; + + if (!inet_ntop(AF_INET, (const void *)&sin->sin_addr, addr_str, + INET6_ADDRSTRLEN)) + return -EINVAL; + *port = ntohs(sin->sin_port); + break; + } + case AF_INET6: { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr; + + if (!inet_ntop(AF_INET6, (const void *)&sin6->sin6_addr, + addr_str, INET6_ADDRSTRLEN)) + return -EINVAL; + *port = ntohs(sin6->sin6_port); + break; + } + default: + return -EINVAL; + } + return 0; +} + +int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct nlattr *nla_table, *nla_entry; + struct rd *rd = data; + const char *name; + int idx; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME] || + !tb[RDMA_NLDEV_ATTR_RES_CM_ID]) + return MNL_CB_ERROR; + + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + nla_table = tb[RDMA_NLDEV_ATTR_RES_CM_ID]; + mnl_attr_for_each_nested(nla_entry, nla_table) { + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + char src_addr_str[INET6_ADDRSTRLEN]; + char dst_addr_str[INET6_ADDRSTRLEN]; + uint16_t src_port, dst_port; + uint32_t port = 0, pid = 0; + uint8_t type = 0, state; + uint32_t lqpn = 0, ps; + uint32_t cm_idn = 0; + char *comm = NULL; + int err; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (err != MNL_CB_OK) + return -EINVAL; + + if (!nla_line[RDMA_NLDEV_ATTR_RES_STATE] || + !nla_line[RDMA_NLDEV_ATTR_RES_PS] || + (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && + !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { + return MNL_CB_ERROR; + } + + if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) + port = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]); + + if (port && port != rd->port_idx) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) { + lqpn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); + if (rd_check_is_filtered(rd, "lqpn", lqpn)) + continue; + } + if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) { + type = mnl_attr_get_u8( + nla_line[RDMA_NLDEV_ATTR_RES_TYPE]); + if (rd_check_is_string_filtered(rd, "qp-type", + qp_types_to_str(type))) + continue; + } + + ps = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PS]); + if (rd_check_is_string_filtered(rd, "ps", cm_id_ps_to_str(ps))) + continue; + + state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]); + if (rd_check_is_string_filtered(rd, "state", + cm_id_state_to_str(state))) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) { + if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR], + src_addr_str, &src_port)) + continue; + if (rd_check_is_string_filtered(rd, "src-addr", + src_addr_str)) + continue; + if (rd_check_is_filtered(rd, "src-port", src_port)) + continue; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) { + if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR], + dst_addr_str, &dst_port)) + continue; + if (rd_check_is_string_filtered(rd, "dst-addr", + dst_addr_str)) + continue; + if (rd_check_is_filtered(rd, "dst-port", dst_port)) + continue; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { + pid = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_PID]); + comm = get_task_name(pid); + } + + if (rd_check_is_filtered(rd, "pid", pid)) { + free(comm); + continue; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) + cm_idn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]); + if (rd_check_is_filtered(rd, "cm-idn", cm_idn)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) { + /* discard const from mnl_attr_get_str */ + comm = (char *)mnl_attr_get_str( + nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); + } + + if (rd->json_output) + jsonw_start_array(rd->jw); + + print_link(rd, idx, name, port, nla_line); + if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) + print_lqpn(rd, lqpn); + if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) + print_qp_type(rd, type); + print_cm_id_state(rd, state); + print_ps(rd, ps); + print_pid(rd, pid); + print_comm(rd, comm, nla_line); + if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) + res_print_uint(rd, "cm-idn", cm_idn); + + if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) + print_ipaddr(rd, "src-addr", src_addr_str, src_port); + if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) + print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port); + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) + free(comm); + + print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); + newline(rd); + } + return MNL_CB_OK; +} diff --git a/rdma/res.c b/rdma/res.c index 7956882e..d5ae60e1 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -140,7 +140,7 @@ static const char *qp_states_to_str(uint8_t idx) return "UNKNOWN"; } -static const char *qp_types_to_str(uint8_t idx) +const char *qp_types_to_str(uint8_t idx) { static const char * const qp_types_str[] = { "SMI", "GSI", "RC", "UC", "UD", "RAW_IPV6", @@ -153,7 +153,7 @@ static const char *qp_types_to_str(uint8_t idx) return "UNKNOWN"; } -static void print_lqpn(struct rd *rd, uint32_t val) +void print_lqpn(struct rd *rd, uint32_t val) { if (rd->json_output) jsonw_uint_field(rd->jw, "lqpn", val); @@ -259,8 +259,8 @@ void print_dev(struct rd *rd, uint32_t idx, const char *name) } } -static void print_link(struct rd *rd, uint32_t idx, const char *name, - uint32_t port, struct nlattr **nla_line) +void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port, + struct nlattr **nla_line) { if (rd->json_output) { jsonw_uint_field(rd->jw, "ifindex", idx); @@ -451,250 +451,6 @@ static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) return MNL_CB_OK; } -static void print_qp_type(struct rd *rd, uint32_t val) -{ - if (rd->json_output) - jsonw_string_field(rd->jw, "qp-type", - qp_types_to_str(val)); - else - pr_out("qp-type %s ", qp_types_to_str(val)); -} - -static const char *cm_id_state_to_str(uint8_t idx) -{ - static const char * const cm_id_states_str[] = { - "IDLE", "ADDR_QUERY", "ADDR_RESOLVED", "ROUTE_QUERY", - "ROUTE_RESOLVED", "CONNECT", "DISCONNECT", "ADDR_BOUND", - "LISTEN", "DEVICE_REMOVAL", "DESTROYING" }; - - if (idx < ARRAY_SIZE(cm_id_states_str)) - return cm_id_states_str[idx]; - return "UNKNOWN"; -} - -static const char *cm_id_ps_to_str(uint32_t ps) -{ - switch (ps) { - case RDMA_PS_IPOIB: - return "IPoIB"; - case RDMA_PS_IB: - return "IPoIB"; - case RDMA_PS_TCP: - return "TCP"; - case RDMA_PS_UDP: - return "UDP"; - default: - return "---"; - } -} - -static void print_cm_id_state(struct rd *rd, uint8_t state) -{ - if (rd->json_output) { - jsonw_string_field(rd->jw, "state", cm_id_state_to_str(state)); - return; - } - pr_out("state %s ", cm_id_state_to_str(state)); -} - -static void print_ps(struct rd *rd, uint32_t ps) -{ - if (rd->json_output) { - jsonw_string_field(rd->jw, "ps", cm_id_ps_to_str(ps)); - return; - } - pr_out("ps %s ", cm_id_ps_to_str(ps)); -} - -static void print_ipaddr(struct rd *rd, const char *key, char *addrstr, - uint16_t port) -{ - if (rd->json_output) { - int name_size = INET6_ADDRSTRLEN+strlen(":65535"); - char json_name[name_size]; - - snprintf(json_name, name_size, "%s:%u", addrstr, port); - jsonw_string_field(rd->jw, key, json_name); - return; - } - pr_out("%s %s:%u ", key, addrstr, port); -} - -static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port) -{ - struct __kernel_sockaddr_storage *addr; - - addr = (struct __kernel_sockaddr_storage *) - mnl_attr_get_payload(nla_line); - switch (addr->ss_family) { - case AF_INET: { - struct sockaddr_in *sin = (struct sockaddr_in *)addr; - - if (!inet_ntop(AF_INET, (const void *)&sin->sin_addr, addr_str, - INET6_ADDRSTRLEN)) - return -EINVAL; - *port = ntohs(sin->sin_port); - break; - } - case AF_INET6: { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr; - - if (!inet_ntop(AF_INET6, (const void *)&sin6->sin6_addr, - addr_str, INET6_ADDRSTRLEN)) - return -EINVAL; - *port = ntohs(sin6->sin6_port); - break; - } - default: - return -EINVAL; - } - return 0; -} - -static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) -{ - struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; - struct nlattr *nla_table, *nla_entry; - struct rd *rd = data; - const char *name; - int idx; - - mnl_attr_parse(nlh, 0, rd_attr_cb, tb); - if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || - !tb[RDMA_NLDEV_ATTR_DEV_NAME] || - !tb[RDMA_NLDEV_ATTR_RES_CM_ID]) - return MNL_CB_ERROR; - - name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); - idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); - nla_table = tb[RDMA_NLDEV_ATTR_RES_CM_ID]; - mnl_attr_for_each_nested(nla_entry, nla_table) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - char src_addr_str[INET6_ADDRSTRLEN]; - char dst_addr_str[INET6_ADDRSTRLEN]; - uint16_t src_port, dst_port; - uint32_t port = 0, pid = 0; - uint8_t type = 0, state; - uint32_t lqpn = 0, ps; - uint32_t cm_idn = 0; - char *comm = NULL; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return -EINVAL; - - if (!nla_line[RDMA_NLDEV_ATTR_RES_STATE] || - !nla_line[RDMA_NLDEV_ATTR_RES_PS] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) - port = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]); - - if (port && port != rd->port_idx) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) { - lqpn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); - if (rd_check_is_filtered(rd, "lqpn", lqpn)) - continue; - } - if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) { - type = mnl_attr_get_u8( - nla_line[RDMA_NLDEV_ATTR_RES_TYPE]); - if (rd_check_is_string_filtered(rd, "qp-type", - qp_types_to_str(type))) - continue; - } - - ps = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PS]); - if (rd_check_is_string_filtered(rd, "ps", cm_id_ps_to_str(ps))) - continue; - - state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]); - if (rd_check_is_string_filtered(rd, "state", - cm_id_state_to_str(state))) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) { - if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR], - src_addr_str, &src_port)) - continue; - if (rd_check_is_string_filtered(rd, "src-addr", - src_addr_str)) - continue; - if (rd_check_is_filtered(rd, "src-port", src_port)) - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) { - if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR], - dst_addr_str, &dst_port)) - continue; - if (rd_check_is_string_filtered(rd, "dst-addr", - dst_addr_str)) - continue; - if (rd_check_is_filtered(rd, "dst-port", dst_port)) - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) { - free(comm); - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) - cm_idn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]); - if (rd_check_is_filtered(rd, "cm-idn", cm_idn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) { - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str( - nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - } - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_link(rd, idx, name, port, nla_line); - if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) - print_lqpn(rd, lqpn); - if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) - print_qp_type(rd, type); - print_cm_id_state(rd, state); - print_ps(rd, ps); - print_pid(rd, pid); - print_comm(rd, comm, nla_line); - if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) - res_print_uint(rd, "cm-idn", cm_idn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) - print_ipaddr(rd, "src-addr", src_addr_str, src_port); - if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) - print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); - } - return MNL_CB_OK; -} - void print_users(struct rd *rd, uint64_t val) { if (rd->json_output) @@ -721,25 +477,6 @@ filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = { RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false); -static const -struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = { - { .name = "link", .is_number = false }, - { .name = "lqpn", .is_number = true }, - { .name = "qp-type", .is_number = false }, - { .name = "state", .is_number = false }, - { .name = "ps", .is_number = false }, - { .name = "dev-type", .is_number = false }, - { .name = "transport-type", .is_number = false }, - { .name = "pid", .is_number = true }, - { .name = "src-addr", .is_number = false }, - { .name = "src-port", .is_number = true }, - { .name = "dst-addr", .is_number = false }, - { .name = "dst-port", .is_number = true }, - { .name = "cm-idn", .is_number = true } -}; - -RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false); - static int res_show(struct rd *rd) { const struct rd_cmd cmds[] = { diff --git a/rdma/res.h b/rdma/res.h index 19f0d420..e9d0d12e 100644 --- a/rdma/res.h +++ b/rdma/res.h @@ -12,6 +12,7 @@ int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback); int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data); int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data); int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data); +int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data); #define RES_FUNC(name, command, valid_filters, strict_port) \ static inline int _##name(struct rd *rd)\ @@ -71,12 +72,35 @@ struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = { RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true); +static const +struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = { + { .name = "link", .is_number = false }, + { .name = "lqpn", .is_number = true }, + { .name = "qp-type", .is_number = false }, + { .name = "state", .is_number = false }, + { .name = "ps", .is_number = false }, + { .name = "dev-type", .is_number = false }, + { .name = "transport-type", .is_number = false }, + { .name = "pid", .is_number = true }, + { .name = "src-addr", .is_number = false }, + { .name = "src-port", .is_number = true }, + { .name = "dst-addr", .is_number = false }, + { .name = "dst-port", .is_number = true }, + { .name = "cm-idn", .is_number = true } +}; + +RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false); + char *get_task_name(uint32_t pid); void print_dev(struct rd *rd, uint32_t idx, const char *name); +void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port, + struct nlattr **nla_line); void print_users(struct rd *rd, uint64_t val); void print_key(struct rd *rd, const char *name, uint64_t val); void res_print_uint(struct rd *rd, const char *name, uint64_t val); void print_pid(struct rd *rd, uint32_t val); void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line); +const char *qp_types_to_str(uint8_t idx); +void print_lqpn(struct rd *rd, uint32_t val); #endif /* _RDMA_TOOL_RES_H_ */ From patchwork Tue Jan 22 18:31:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029444 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="mj2ayrAK"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTJ2BrYz9s3q for ; Wed, 23 Jan 2019 05:32:04 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726967AbfAVScC (ORCPT ); Tue, 22 Jan 2019 13:32:02 -0500 Received: from mail.kernel.org ([198.145.29.99]:54820 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726039AbfAVScB (ORCPT ); Tue, 22 Jan 2019 13:32:01 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4C35D217D6; Tue, 22 Jan 2019 18:31:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181919; bh=QD5L6BThtJ4jEGxT+aE1RwoiXjeAfvkWf+HsL6QEuxw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mj2ayrAKTnVsL99dfIX11qQ5h6x1X4EgvPj1ioGAatvHJvqoRKEcph/LMFBvTV/Td sPR6uNwAQunAUF3aAup6gTAorcrQqECKisi6mkDdSYA9afR6qgM5LCjHG8Hr6B/12C mYJyCfpvdZqW6jrh3aCLNCFe2zVkiRuKbQY72+eo= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 09/19] rdma: Move resource PD logic to separate file Date: Tue, 22 Jan 2019 20:31:15 +0200 Message-Id: <20190122183125.15920-10-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Logically separate resource PD logic to separate file, in order to make PD specific logic self-contained. Signed-off-by: Leon Romanovsky --- rdma/Makefile | 2 +- rdma/res-qp.c | 234 +++++++++++++++++++++++++++++++++++++++++++++++++ rdma/res.c | 236 -------------------------------------------------- rdma/res.h | 17 ++++ 4 files changed, 252 insertions(+), 237 deletions(-) create mode 100644 rdma/res-qp.c diff --git a/rdma/Makefile b/rdma/Makefile index ef240404..ad7f4177 100644 --- a/rdma/Makefile +++ b/rdma/Makefile @@ -7,7 +7,7 @@ ifeq ($(HAVE_MNL),y) CFLAGS += -I./include/uapi/ RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o res-cq.o \ - res-cmid.o + res-cmid.o res-qp.o TARGETS += rdma endif diff --git a/rdma/res-qp.c b/rdma/res-qp.c new file mode 100644 index 00000000..85725fea --- /dev/null +++ b/rdma/res-qp.c @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB +/* + * res-qp.c RDMA tool + * Authors: Leon Romanovsky + */ + +#include "res.h" +#include + +static const char *path_mig_to_str(uint8_t idx) +{ + static const char *const path_mig_str[] = { "MIGRATED", "REARM", + "ARMED" }; + + if (idx < ARRAY_SIZE(path_mig_str)) + return path_mig_str[idx]; + return "UNKNOWN"; +} + +static const char *qp_states_to_str(uint8_t idx) +{ + static const char *const qp_states_str[] = { "RESET", "INIT", "RTR", + "RTS", "SQD", "SQE", + "ERR" }; + + if (idx < ARRAY_SIZE(qp_states_str)) + return qp_states_str[idx]; + return "UNKNOWN"; +} + +static void print_rqpn(struct rd *rd, uint32_t val, struct nlattr **nla_line) +{ + if (!nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) + return; + + if (rd->json_output) + jsonw_uint_field(rd->jw, "rqpn", val); + else + pr_out("rqpn %u ", val); +} + +static void print_type(struct rd *rd, uint32_t val) +{ + if (rd->json_output) + jsonw_string_field(rd->jw, "type", qp_types_to_str(val)); + else + pr_out("type %s ", qp_types_to_str(val)); +} + +static void print_state(struct rd *rd, uint32_t val) +{ + if (rd->json_output) + jsonw_string_field(rd->jw, "state", qp_states_to_str(val)); + else + pr_out("state %s ", qp_states_to_str(val)); +} + +static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line) +{ + if (!nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) + return; + + if (rd->json_output) + jsonw_uint_field(rd->jw, "rq-psn", val); + else + pr_out("rq-psn %u ", val); +} + +static void print_sqpsn(struct rd *rd, uint32_t val) +{ + if (rd->json_output) + jsonw_uint_field(rd->jw, "sq-psn", val); + else + pr_out("sq-psn %u ", val); +} + +static void print_pathmig(struct rd *rd, uint32_t val, struct nlattr **nla_line) +{ + if (!nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) + return; + + if (rd->json_output) + jsonw_string_field(rd->jw, "path-mig-state", + path_mig_to_str(val)); + else + pr_out("path-mig-state %s ", path_mig_to_str(val)); +} + +int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct nlattr *nla_table, *nla_entry; + struct rd *rd = data; + const char *name; + uint32_t idx; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME] || + !tb[RDMA_NLDEV_ATTR_RES_QP]) + return MNL_CB_ERROR; + + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + nla_table = tb[RDMA_NLDEV_ATTR_RES_QP]; + + mnl_attr_for_each_nested(nla_entry, nla_table) { + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn; + uint8_t type, state, path_mig_state = 0; + uint32_t port = 0, pid = 0; + uint32_t pdn = 0; + char *comm = NULL; + int err; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (err != MNL_CB_OK) + return MNL_CB_ERROR; + + if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN] || + !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] || + !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] || + !nla_line[RDMA_NLDEV_ATTR_RES_STATE] || + (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && + !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { + return MNL_CB_ERROR; + } + + if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) + port = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]); + + if (port != rd->port_idx) + continue; + + lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); + if (rd_check_is_filtered(rd, "lqpn", lqpn)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + pdn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + if (rd_check_is_filtered(rd, "pdn", pdn)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) { + rqpn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_RQPN]); + if (rd_check_is_filtered(rd, "rqpn", rqpn)) + continue; + } else { + if (rd_check_is_key_exist(rd, "rqpn")) + continue; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) { + rq_psn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]); + if (rd_check_is_filtered(rd, "rq-psn", rq_psn)) + continue; + } else { + if (rd_check_is_key_exist(rd, "rq-psn")) + continue; + } + + sq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]); + if (rd_check_is_filtered(rd, "sq-psn", sq_psn)) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) { + path_mig_state = mnl_attr_get_u8( + nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]); + if (rd_check_is_string_filtered( + rd, "path-mig-state", + path_mig_to_str(path_mig_state))) + continue; + } else { + if (rd_check_is_key_exist(rd, "path-mig-state")) + continue; + } + + type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]); + if (rd_check_is_string_filtered(rd, "type", + qp_types_to_str(type))) + continue; + + state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]); + if (rd_check_is_string_filtered(rd, "state", + qp_states_to_str(state))) + continue; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { + pid = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_PID]); + comm = get_task_name(pid); + } + + if (rd_check_is_filtered(rd, "pid", pid)) { + free(comm); + continue; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) + /* discard const from mnl_attr_get_str */ + comm = (char *)mnl_attr_get_str( + nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); + + if (rd->json_output) + jsonw_start_array(rd->jw); + + print_link(rd, idx, name, port, nla_line); + + print_lqpn(rd, lqpn); + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + res_print_uint(rd, "pdn", pdn); + print_rqpn(rd, rqpn, nla_line); + + print_type(rd, type); + print_state(rd, state); + + print_rqpsn(rd, rq_psn, nla_line); + print_sqpsn(rd, sq_psn); + + print_pathmig(rd, path_mig_state, nla_line); + print_pid(rd, pid); + print_comm(rd, comm, nla_line); + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) + free(comm); + + print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); + newline(rd); + } + return MNL_CB_OK; +} diff --git a/rdma/res.c b/rdma/res.c index d5ae60e1..6d4da38c 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -119,27 +119,6 @@ int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback) return ret; } -static const char *path_mig_to_str(uint8_t idx) -{ - static const char * const path_mig_str[] = { "MIGRATED", - "REARM", "ARMED" }; - - if (idx < ARRAY_SIZE(path_mig_str)) - return path_mig_str[idx]; - return "UNKNOWN"; -} - -static const char *qp_states_to_str(uint8_t idx) -{ - static const char * const qp_states_str[] = { "RESET", "INIT", - "RTR", "RTS", "SQD", - "SQE", "ERR" }; - - if (idx < ARRAY_SIZE(qp_states_str)) - return qp_states_str[idx]; - return "UNKNOWN"; -} - const char *qp_types_to_str(uint8_t idx) { static const char * const qp_types_str[] = { "SMI", "GSI", "RC", @@ -161,68 +140,6 @@ void print_lqpn(struct rd *rd, uint32_t val) pr_out("lqpn %u ", val); } -static void print_rqpn(struct rd *rd, uint32_t val, struct nlattr **nla_line) -{ - if (!nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) - return; - - if (rd->json_output) - jsonw_uint_field(rd->jw, "rqpn", val); - else - pr_out("rqpn %u ", val); -} - -static void print_type(struct rd *rd, uint32_t val) -{ - if (rd->json_output) - jsonw_string_field(rd->jw, "type", - qp_types_to_str(val)); - else - pr_out("type %s ", qp_types_to_str(val)); -} - -static void print_state(struct rd *rd, uint32_t val) -{ - if (rd->json_output) - jsonw_string_field(rd->jw, "state", - qp_states_to_str(val)); - else - pr_out("state %s ", qp_states_to_str(val)); -} - -static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line) -{ - if (!nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) - return; - - if (rd->json_output) - jsonw_uint_field(rd->jw, "rq-psn", val); - else - pr_out("rq-psn %u ", val); -} - -static void print_sqpsn(struct rd *rd, uint32_t val) -{ - if (rd->json_output) - jsonw_uint_field(rd->jw, "sq-psn", val); - else - pr_out("sq-psn %u ", val); -} - -static void print_pathmig(struct rd *rd, uint32_t val, - struct nlattr **nla_line) -{ - if (!nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) - return; - - if (rd->json_output) - jsonw_string_field(rd->jw, - "path-mig-state", - path_mig_to_str(val)); - else - pr_out("path-mig-state %s ", path_mig_to_str(val)); -} - void print_pid(struct rd *rd, uint32_t val) { if (rd->json_output) @@ -314,143 +231,6 @@ void res_print_uint(struct rd *rd, const char *name, uint64_t val) pr_out("%s %" PRIu64 " ", name, val); } -static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) -{ - struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; - struct nlattr *nla_table, *nla_entry; - struct rd *rd = data; - const char *name; - uint32_t idx; - - mnl_attr_parse(nlh, 0, rd_attr_cb, tb); - if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || - !tb[RDMA_NLDEV_ATTR_DEV_NAME] || - !tb[RDMA_NLDEV_ATTR_RES_QP]) - return MNL_CB_ERROR; - - name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); - idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); - nla_table = tb[RDMA_NLDEV_ATTR_RES_QP]; - - mnl_attr_for_each_nested(nla_entry, nla_table) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn; - uint8_t type, state, path_mig_state = 0; - uint32_t port = 0, pid = 0; - uint32_t pdn = 0; - char *comm = NULL; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; - - if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN] || - !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] || - !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] || - !nla_line[RDMA_NLDEV_ATTR_RES_STATE] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) - port = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]); - - if (port != rd->port_idx) - continue; - - lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); - if (rd_check_is_filtered(rd, "lqpn", lqpn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - pdn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - if (rd_check_is_filtered(rd, "pdn", pdn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) { - rqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQPN]); - if (rd_check_is_filtered(rd, "rqpn", rqpn)) - continue; - } else { - if (rd_check_is_key_exist(rd, "rqpn")) - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) { - rq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]); - if (rd_check_is_filtered(rd, "rq-psn", rq_psn)) - continue; - } else { - if (rd_check_is_key_exist(rd, "rq-psn")) - continue; - } - - sq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]); - if (rd_check_is_filtered(rd, "sq-psn", sq_psn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) { - path_mig_state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]); - if (rd_check_is_string_filtered(rd, "path-mig-state", path_mig_to_str(path_mig_state))) - continue; - } else { - if (rd_check_is_key_exist(rd, "path-mig-state")) - continue; - } - - type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]); - if (rd_check_is_string_filtered(rd, "type", qp_types_to_str(type))) - continue; - - state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]); - if (rd_check_is_string_filtered(rd, "state", qp_states_to_str(state))) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) { - free(comm); - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_link(rd, idx, name, port, nla_line); - - print_lqpn(rd, lqpn); - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - res_print_uint(rd, "pdn", pdn); - print_rqpn(rd, rqpn, nla_line); - - print_type(rd, type); - print_state(rd, state); - - print_rqpsn(rd, rq_psn, nla_line); - print_sqpsn(rd, sq_psn); - - print_pathmig(rd, path_mig_state, nla_line); - print_pid(rd, pid); - print_comm(rd, comm, nla_line); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); - } - return MNL_CB_OK; -} - void print_users(struct rd *rd, uint64_t val) { if (rd->json_output) @@ -461,22 +241,6 @@ void print_users(struct rd *rd, uint64_t val) RES_FUNC(res_no_args, RDMA_NLDEV_CMD_RES_GET, NULL, true); -static const struct -filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = { - { .name = "link", .is_number = false }, - { .name = "lqpn", .is_number = true }, - { .name = "rqpn", .is_number = true }, - { .name = "pid", .is_number = true }, - { .name = "sq-psn", .is_number = true }, - { .name = "rq-psn", .is_number = true }, - { .name = "type", .is_number = false }, - { .name = "path-mig-state", .is_number = false }, - { .name = "state", .is_number = false }, - { .name = "pdn", .is_number = true }, -}; - -RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false); - static int res_show(struct rd *rd) { const struct rd_cmd cmds[] = { diff --git a/rdma/res.h b/rdma/res.h index e9d0d12e..95d88a3a 100644 --- a/rdma/res.h +++ b/rdma/res.h @@ -13,6 +13,7 @@ int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data); int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data); int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data); int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data); +int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data); #define RES_FUNC(name, command, valid_filters, strict_port) \ static inline int _##name(struct rd *rd)\ @@ -91,6 +92,22 @@ struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = { RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false); +static const struct +filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = { + { .name = "link", .is_number = false }, + { .name = "lqpn", .is_number = true }, + { .name = "rqpn", .is_number = true }, + { .name = "pid", .is_number = true }, + { .name = "sq-psn", .is_number = true }, + { .name = "rq-psn", .is_number = true }, + { .name = "type", .is_number = false }, + { .name = "path-mig-state", .is_number = false }, + { .name = "state", .is_number = false }, + { .name = "pdn", .is_number = true }, +}; + +RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false); + char *get_task_name(uint32_t pid); void print_dev(struct rd *rd, uint32_t idx, const char *name); void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port, From patchwork Tue Jan 22 18:31:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029452 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="JoDOl9af"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTn2Yv4z9s3q for ; Wed, 23 Jan 2019 05:32:29 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727119AbfAVSc2 (ORCPT ); Tue, 22 Jan 2019 13:32:28 -0500 Received: from mail.kernel.org ([198.145.29.99]:55132 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727066AbfAVSc0 (ORCPT ); Tue, 22 Jan 2019 13:32:26 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id AA19A21726; Tue, 22 Jan 2019 18:32:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181945; bh=9SH1ap24mwWGVmFTSlJyv688zyELBb5ofpkKRuU5n+c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JoDOl9afD6nmrW1uaBDRJGaW9KGyJ3vEUmz8XEQNQTyGUB87/z8DsP+qx3HQHL7Np kHnOOYpN0m9IjgbZpe2ViGthsXXbrJP6HjLn1PHkzBzZEPL6yuQx2kSZo/RBV4ONZQ SPWn5u31rKMQMfCgxyFfbFswKHwJLXKdGncjfRV8= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 10/19] rdma: Properly mark RDMAtool license Date: Tue, 22 Jan 2019 20:31:16 +0200 Message-Id: <20190122183125.15920-11-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky RDMA subsystem is dual-licensed with "GPL-2.0 OR Linux-OpenIB" proper license and Mellanox submission are supposed to have this type of license. Signed-off-by: Leon Romanovsky --- rdma/Makefile | 2 +- rdma/dev.c | 7 +------ rdma/link.c | 7 +------ rdma/rdma.c | 7 +------ rdma/rdma.h | 7 +------ rdma/res.c | 7 +------ rdma/utils.c | 7 +------ 7 files changed, 7 insertions(+), 37 deletions(-) diff --git a/rdma/Makefile b/rdma/Makefile index ad7f4177..6a424234 100644 --- a/rdma/Makefile +++ b/rdma/Makefile @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: GPL-2.0 +# SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB include ../config.mk TARGETS := diff --git a/rdma/dev.c b/rdma/dev.c index 60ff4b31..954e0015 100644 --- a/rdma/dev.c +++ b/rdma/dev.c @@ -1,11 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* * dev.c RDMA tool - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * * Authors: Leon Romanovsky */ diff --git a/rdma/link.c b/rdma/link.c index c064be62..89e81b84 100644 --- a/rdma/link.c +++ b/rdma/link.c @@ -1,11 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* * link.c RDMA tool - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * * Authors: Leon Romanovsky */ diff --git a/rdma/rdma.c b/rdma/rdma.c index 010e9837..676e03c2 100644 --- a/rdma/rdma.c +++ b/rdma/rdma.c @@ -1,11 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* * rdma.c RDMA tool - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * * Authors: Leon Romanovsky */ diff --git a/rdma/rdma.h b/rdma/rdma.h index 547bb574..d2559e7c 100644 --- a/rdma/rdma.h +++ b/rdma/rdma.h @@ -1,11 +1,6 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* * rdma.c RDMA tool - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * * Authors: Leon Romanovsky */ #ifndef _RDMA_TOOL_H_ diff --git a/rdma/res.c b/rdma/res.c index 6d4da38c..f621afa8 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -1,11 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* * res.c RDMA tool - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * * Authors: Leon Romanovsky */ diff --git a/rdma/utils.c b/rdma/utils.c index 069d44fe..bce052d5 100644 --- a/rdma/utils.c +++ b/rdma/utils.c @@ -1,11 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* * utils.c RDMA tool - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * * Authors: Leon Romanovsky */ From patchwork Tue Jan 22 18:31:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029446 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="rPF5yLQk"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTQ2nmPz9s4s for ; Wed, 23 Jan 2019 05:32:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727015AbfAVScI (ORCPT ); Tue, 22 Jan 2019 13:32:08 -0500 Received: from mail.kernel.org ([198.145.29.99]:54898 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726039AbfAVScH (ORCPT ); Tue, 22 Jan 2019 13:32:07 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9D4EC217D6; Tue, 22 Jan 2019 18:32:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181926; bh=5D1WLgexSjn8/M617vAaIud5YL0u1mkd7aBdg7Ndgss=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rPF5yLQk6OOSv7mzk7bpOpP8E1A97W7GJLtJ/qZxL2OsXsvD/6nFOxJBNoJQFBQV6 OxmkKtpec1jCy+i3mEzkG41B10R/kjuY9HlNc25As8Sz50KpXxP/8Pk5L4YYyEhRVJ OmXjpZrlsXSWQ+C3iFFwE9N7SX1j/KmaUpS8lIFY= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 11/19] rdma: Simplify code to reuse existing functions Date: Tue, 22 Jan 2019 20:31:17 +0200 Message-Id: <20190122183125.15920-12-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Remove duplicated functions in favour general res_print_uint() call. Signed-off-by: Leon Romanovsky --- rdma/res-cmid.c | 4 ++-- rdma/res-cq.c | 14 +++----------- rdma/res-mr.c | 2 +- rdma/res-pd.c | 4 ++-- rdma/res-qp.c | 14 +++----------- rdma/res.c | 34 ++-------------------------------- rdma/res.h | 3 --- 7 files changed, 13 insertions(+), 62 deletions(-) diff --git a/rdma/res-cmid.c b/rdma/res-cmid.c index b63634a3..5eea7a6b 100644 --- a/rdma/res-cmid.c +++ b/rdma/res-cmid.c @@ -227,12 +227,12 @@ int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) print_link(rd, idx, name, port, nla_line); if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) - print_lqpn(rd, lqpn); + res_print_uint(rd, "lqpn", lqpn); if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) print_qp_type(rd, type); print_cm_id_state(rd, state); print_ps(rd, ps); - print_pid(rd, pid); + res_print_uint(rd, "pid", pid); print_comm(rd, comm, nla_line); if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) res_print_uint(rd, "cm-idn", cm_idn); diff --git a/rdma/res-cq.c b/rdma/res-cq.c index fbfe593b..93c18251 100644 --- a/rdma/res-cq.c +++ b/rdma/res-cq.c @@ -7,14 +7,6 @@ #include "res.h" #include -static void print_cqe(struct rd *rd, uint32_t val) -{ - if (rd->json_output) - jsonw_uint_field(rd->jw, "cqe", val); - else - pr_out("cqe %u ", val); -} - static const char *poll_ctx_to_str(uint8_t idx) { static const char * const cm_id_states_str[] = { @@ -120,11 +112,11 @@ int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) jsonw_start_array(rd->jw); print_dev(rd, idx, name); - print_cqe(rd, cqe); - print_users(rd, users); + res_print_uint(rd, "cqe", cqe); + res_print_uint(rd, "users", users); if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) print_poll_ctx(rd, poll_ctx); - print_pid(rd, pid); + res_print_uint(rd, "pid", pid); print_comm(rd, comm, nla_line); if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) diff --git a/rdma/res-mr.c b/rdma/res-mr.c index dae5def2..e373035a 100644 --- a/rdma/res-mr.c +++ b/rdma/res-mr.c @@ -97,7 +97,7 @@ int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) print_key(rd, "iova", iova); res_print_uint(rd, "mrlen", mrlen); - print_pid(rd, pid); + res_print_uint(rd, "pid", pid); print_comm(rd, comm, nla_line); if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) diff --git a/rdma/res-pd.c b/rdma/res-pd.c index d879a21a..24ac7f1b 100644 --- a/rdma/res-pd.c +++ b/rdma/res-pd.c @@ -89,10 +89,10 @@ int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) print_dev(rd, idx, name); if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) print_key(rd, "local_dma_lkey", local_dma_lkey); - print_users(rd, users); + res_print_uint(rd, "users", users); if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) print_key(rd, "unsafe_global_rkey", unsafe_global_rkey); - print_pid(rd, pid); + res_print_uint(rd, "pid", pid); print_comm(rd, comm, nla_line); if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) res_print_uint(rd, "ctxn", ctxn); diff --git a/rdma/res-qp.c b/rdma/res-qp.c index 85725fea..ecd2cbd6 100644 --- a/rdma/res-qp.c +++ b/rdma/res-qp.c @@ -66,14 +66,6 @@ static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line) pr_out("rq-psn %u ", val); } -static void print_sqpsn(struct rd *rd, uint32_t val) -{ - if (rd->json_output) - jsonw_uint_field(rd->jw, "sq-psn", val); - else - pr_out("sq-psn %u ", val); -} - static void print_pathmig(struct rd *rd, uint32_t val, struct nlattr **nla_line) { if (!nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) @@ -209,7 +201,7 @@ int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) print_link(rd, idx, name, port, nla_line); - print_lqpn(rd, lqpn); + res_print_uint(rd, "lqpn", lqpn); if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) res_print_uint(rd, "pdn", pdn); print_rqpn(rd, rqpn, nla_line); @@ -218,10 +210,10 @@ int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) print_state(rd, state); print_rqpsn(rd, rq_psn, nla_line); - print_sqpsn(rd, sq_psn); + res_print_uint(rd, "sq-psn", sq_psn); print_pathmig(rd, path_mig_state, nla_line); - print_pid(rd, pid); + res_print_uint(rd, "pid", pid); print_comm(rd, comm, nla_line); if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) diff --git a/rdma/res.c b/rdma/res.c index f621afa8..140c0908 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -35,7 +35,6 @@ static int res_print_summary(struct rd *rd, struct nlattr **tb) mnl_attr_for_each_nested(nla_entry, nla_table) { struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - char json_name[32]; err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); if (err != MNL_CB_OK) @@ -48,12 +47,7 @@ static int res_print_summary(struct rd *rd, struct nlattr **tb) name = mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME]); curr = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]); - if (rd->json_output) { - snprintf(json_name, 32, "%s", name); - jsonw_lluint_field(rd->jw, json_name, curr); - } else { - pr_out("%s %"PRId64 " ", name, curr); - } + res_print_uint(rd, name, curr); } return 0; } @@ -127,22 +121,6 @@ const char *qp_types_to_str(uint8_t idx) return "UNKNOWN"; } -void print_lqpn(struct rd *rd, uint32_t val) -{ - if (rd->json_output) - jsonw_uint_field(rd->jw, "lqpn", val); - else - pr_out("lqpn %u ", val); -} - -void print_pid(struct rd *rd, uint32_t val) -{ - if (rd->json_output) - jsonw_uint_field(rd->jw, "pid", val); - else - pr_out("pid %u ", val); -} - void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line) { char tmp[18]; @@ -221,19 +199,11 @@ void print_key(struct rd *rd, const char *name, uint64_t val) void res_print_uint(struct rd *rd, const char *name, uint64_t val) { if (rd->json_output) - jsonw_uint_field(rd->jw, name, val); + jsonw_u64_field(rd->jw, name, val); else pr_out("%s %" PRIu64 " ", name, val); } -void print_users(struct rd *rd, uint64_t val) -{ - if (rd->json_output) - jsonw_uint_field(rd->jw, "users", val); - else - pr_out("users %" PRIu64 " ", val); -} - RES_FUNC(res_no_args, RDMA_NLDEV_CMD_RES_GET, NULL, true); static int res_show(struct rd *rd) diff --git a/rdma/res.h b/rdma/res.h index 95d88a3a..89dd818a 100644 --- a/rdma/res.h +++ b/rdma/res.h @@ -112,12 +112,9 @@ char *get_task_name(uint32_t pid); void print_dev(struct rd *rd, uint32_t idx, const char *name); void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port, struct nlattr **nla_line); -void print_users(struct rd *rd, uint64_t val); void print_key(struct rd *rd, const char *name, uint64_t val); void res_print_uint(struct rd *rd, const char *name, uint64_t val); -void print_pid(struct rd *rd, uint32_t val); void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line); const char *qp_types_to_str(uint8_t idx); -void print_lqpn(struct rd *rd, uint32_t val); #endif /* _RDMA_TOOL_RES_H_ */ From patchwork Tue Jan 22 18:31:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029447 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="ktOsQpGA"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTV2bMYz9s3q for ; Wed, 23 Jan 2019 05:32:14 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727033AbfAVScM (ORCPT ); Tue, 22 Jan 2019 13:32:12 -0500 Received: from mail.kernel.org ([198.145.29.99]:54930 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726039AbfAVScK (ORCPT ); Tue, 22 Jan 2019 13:32:10 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id C1D2921726; Tue, 22 Jan 2019 18:32:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181929; bh=VuRVTEpni6hPjsYtJuLAxiSOfRjXIrCWk+Zz5GoiPyY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ktOsQpGAqYmlwH1sK5jt87uvGwXcB65AqThR4bIuLbrQAehq1if/CkScSKLt7WF+W g9uCn5aC+UC5j7V8lUKe7b5twDSunRYpJmeaNY7cA9+Cne5kIl0AwVD+X6ffEkKemv w2EdjTLU6nCNx4pfyOb4kIvrRyikOaxsyD3dIK5A= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 12/19] rdma: Simplify CM_ID print code Date: Tue, 22 Jan 2019 20:31:18 +0200 Message-Id: <20190122183125.15920-13-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Refactor our the CM_ID print code. Signed-off-by: Leon Romanovsky --- rdma/res-cmid.c | 246 ++++++++++++++++++++++++------------------------ 1 file changed, 124 insertions(+), 122 deletions(-) diff --git a/rdma/res-cmid.c b/rdma/res-cmid.c index 5eea7a6b..12d1acee 100644 --- a/rdma/res-cmid.c +++ b/rdma/res-cmid.c @@ -108,11 +108,130 @@ static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port) return 0; } +static int res_cm_id_line(struct rd *rd, const char *name, int idx, + struct nlattr *nla_entry) +{ + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + char src_addr_str[INET6_ADDRSTRLEN]; + char dst_addr_str[INET6_ADDRSTRLEN]; + uint16_t src_port, dst_port; + uint32_t port = 0, pid = 0; + uint8_t type = 0, state; + uint32_t lqpn = 0, ps; + uint32_t cm_idn = 0; + char *comm = NULL; + int err; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (err != MNL_CB_OK) + return MNL_CB_ERROR; + + if (!nla_line[RDMA_NLDEV_ATTR_RES_STATE] || + !nla_line[RDMA_NLDEV_ATTR_RES_PS] || + (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && + !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { + return MNL_CB_ERROR; + } + + if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) + port = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]); + + if (port && port != rd->port_idx) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) { + lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); + if (rd_check_is_filtered(rd, "lqpn", lqpn)) + goto out; + } + if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) { + type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]); + if (rd_check_is_string_filtered(rd, "qp-type", + qp_types_to_str(type))) + goto out; + } + + ps = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PS]); + if (rd_check_is_string_filtered(rd, "ps", cm_id_ps_to_str(ps))) + goto out; + + state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]); + if (rd_check_is_string_filtered(rd, "state", cm_id_state_to_str(state))) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) { + if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR], + src_addr_str, &src_port)) + goto out; + if (rd_check_is_string_filtered(rd, "src-addr", src_addr_str)) + goto out; + if (rd_check_is_filtered(rd, "src-port", src_port)) + goto out; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) { + if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR], + dst_addr_str, &dst_port)) + goto out; + if (rd_check_is_string_filtered(rd, "dst-addr", dst_addr_str)) + goto out; + if (rd_check_is_filtered(rd, "dst-port", dst_port)) + goto out; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { + pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); + comm = get_task_name(pid); + } + + if (rd_check_is_filtered(rd, "pid", pid)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) + cm_idn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]); + if (rd_check_is_filtered(rd, "cm-idn", cm_idn)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) { + /* discard const from mnl_attr_get_str */ + comm = (char *)mnl_attr_get_str( + nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); + } + + if (rd->json_output) + jsonw_start_array(rd->jw); + + print_link(rd, idx, name, port, nla_line); + if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) + res_print_uint(rd, "lqpn", lqpn); + if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) + print_qp_type(rd, type); + print_cm_id_state(rd, state); + print_ps(rd, ps); + res_print_uint(rd, "pid", pid); + print_comm(rd, comm, nla_line); + if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) + res_print_uint(rd, "cm-idn", cm_idn); + + if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) + print_ipaddr(rd, "src-addr", src_addr_str, src_port); + if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) + print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port); + + print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); + newline(rd); + +out: if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) + free(comm); + return MNL_CB_OK; +} + int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; struct nlattr *nla_table, *nla_entry; struct rd *rd = data; + int ret = MNL_CB_OK; const char *name; int idx; @@ -124,129 +243,12 @@ int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); nla_table = tb[RDMA_NLDEV_ATTR_RES_CM_ID]; + mnl_attr_for_each_nested(nla_entry, nla_table) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - char src_addr_str[INET6_ADDRSTRLEN]; - char dst_addr_str[INET6_ADDRSTRLEN]; - uint16_t src_port, dst_port; - uint32_t port = 0, pid = 0; - uint8_t type = 0, state; - uint32_t lqpn = 0, ps; - uint32_t cm_idn = 0; - char *comm = NULL; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return -EINVAL; + ret = res_cm_id_line(rd, name, idx, nla_entry); - if (!nla_line[RDMA_NLDEV_ATTR_RES_STATE] || - !nla_line[RDMA_NLDEV_ATTR_RES_PS] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) - port = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]); - - if (port && port != rd->port_idx) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) { - lqpn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); - if (rd_check_is_filtered(rd, "lqpn", lqpn)) - continue; - } - if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) { - type = mnl_attr_get_u8( - nla_line[RDMA_NLDEV_ATTR_RES_TYPE]); - if (rd_check_is_string_filtered(rd, "qp-type", - qp_types_to_str(type))) - continue; - } - - ps = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PS]); - if (rd_check_is_string_filtered(rd, "ps", cm_id_ps_to_str(ps))) - continue; - - state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]); - if (rd_check_is_string_filtered(rd, "state", - cm_id_state_to_str(state))) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) { - if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR], - src_addr_str, &src_port)) - continue; - if (rd_check_is_string_filtered(rd, "src-addr", - src_addr_str)) - continue; - if (rd_check_is_filtered(rd, "src-port", src_port)) - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) { - if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR], - dst_addr_str, &dst_port)) - continue; - if (rd_check_is_string_filtered(rd, "dst-addr", - dst_addr_str)) - continue; - if (rd_check_is_filtered(rd, "dst-port", dst_port)) - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) { - free(comm); - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) - cm_idn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]); - if (rd_check_is_filtered(rd, "cm-idn", cm_idn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) { - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str( - nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - } - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_link(rd, idx, name, port, nla_line); - if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) - res_print_uint(rd, "lqpn", lqpn); - if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) - print_qp_type(rd, type); - print_cm_id_state(rd, state); - print_ps(rd, ps); - res_print_uint(rd, "pid", pid); - print_comm(rd, comm, nla_line); - if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) - res_print_uint(rd, "cm-idn", cm_idn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) - print_ipaddr(rd, "src-addr", src_addr_str, src_port); - if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) - print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); + if (ret != MNL_CB_OK) + break; } - return MNL_CB_OK; + return ret; } From patchwork Tue Jan 22 18:31:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029448 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="CFBN8V0a"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTZ4knbz9s3q for ; Wed, 23 Jan 2019 05:32:18 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727062AbfAVScR (ORCPT ); Tue, 22 Jan 2019 13:32:17 -0500 Received: from mail.kernel.org ([198.145.29.99]:54968 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727039AbfAVScO (ORCPT ); Tue, 22 Jan 2019 13:32:14 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 058F1217D6; Tue, 22 Jan 2019 18:32:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181932; bh=tKS+7Ms+y8nkWw4Bo7C+et1IaCwJAKaTSUBgp1PqqQ0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CFBN8V0ayV/pOsrRsg0Rfjsnn/+n8hBr7Jk+vvCX3hxYfgy00JeSNgDfKirRtyuTn 8rYcFId8sPfLLt+bJLJQnX3Ms13WIawLqG5z05mJbNztpZfxGWG4UYaN89+wC03b2Z 5pojG55J/nkSAOaGWQh5GhM2WHpT/v4tvBQmZ8gs= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 13/19] rdma: Refactor CQ prints Date: Tue, 22 Jan 2019 20:31:19 +0200 Message-Id: <20190122183125.15920-14-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Signed-off-by: Leon Romanovsky --- rdma/res-cq.c | 177 ++++++++++++++++++++++++++------------------------ 1 file changed, 91 insertions(+), 86 deletions(-) diff --git a/rdma/res-cq.c b/rdma/res-cq.c index 93c18251..e50d76ce 100644 --- a/rdma/res-cq.c +++ b/rdma/res-cq.c @@ -27,11 +27,97 @@ static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx) pr_out("poll-ctx %s ", poll_ctx_to_str(poll_ctx)); } +static int res_cq_line(struct rd *rd, const char *name, int idx, + struct nlattr *nla_entry) +{ + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + char *comm = NULL; + uint32_t pid = 0; + uint8_t poll_ctx = 0; + uint32_t ctxn = 0; + uint32_t cqn = 0; + uint64_t users; + uint32_t cqe; + int err; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (err != MNL_CB_OK) + return MNL_CB_ERROR; + + if (!nla_line[RDMA_NLDEV_ATTR_RES_CQE] || + !nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || + (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && + !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { + return MNL_CB_ERROR; + } + + cqe = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQE]); + + users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); + if (rd_check_is_filtered(rd, "users", users)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) { + poll_ctx = + mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]); + if (rd_check_is_string_filtered(rd, "poll-ctx", + poll_ctx_to_str(poll_ctx))) + goto out; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { + pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); + comm = get_task_name(pid); + } + + if (rd_check_is_filtered(rd, "pid", pid)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) + cqn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQN]); + if (rd_check_is_filtered(rd, "cqn", cqn)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) + ctxn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); + if (rd_check_is_filtered(rd, "ctxn", ctxn)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) + /* discard const from mnl_attr_get_str */ + comm = (char *)mnl_attr_get_str( + nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); + + if (rd->json_output) + jsonw_start_array(rd->jw); + + print_dev(rd, idx, name); + res_print_uint(rd, "cqe", cqe); + res_print_uint(rd, "users", users); + if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) + print_poll_ctx(rd, poll_ctx); + res_print_uint(rd, "pid", pid); + print_comm(rd, comm, nla_line); + + if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) + res_print_uint(rd, "cqn", cqn); + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) + res_print_uint(rd, "ctxn", ctxn); + + print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); + newline(rd); + +out: if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) + free(comm); + return MNL_CB_OK; +} + int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; struct nlattr *nla_table, *nla_entry; struct rd *rd = data; + int ret = MNL_CB_OK; const char *name; uint32_t idx; @@ -45,91 +131,10 @@ int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) nla_table = tb[RDMA_NLDEV_ATTR_RES_CQ]; mnl_attr_for_each_nested(nla_entry, nla_table) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - char *comm = NULL; - uint32_t pid = 0; - uint8_t poll_ctx = 0; - uint32_t ctxn = 0; - uint32_t cqn = 0; - uint64_t users; - uint32_t cqe; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; - - if (!nla_line[RDMA_NLDEV_ATTR_RES_CQE] || - !nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - cqe = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQE]); - - users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); - if (rd_check_is_filtered(rd, "users", users)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) { - poll_ctx = mnl_attr_get_u8( - nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]); - if (rd_check_is_string_filtered( - rd, "poll-ctx", poll_ctx_to_str(poll_ctx))) - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) { - free(comm); - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) - cqn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_CQN]); - if (rd_check_is_filtered(rd, "cqn", cqn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) - ctxn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); - if (rd_check_is_filtered(rd, "ctxn", ctxn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str( - nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_dev(rd, idx, name); - res_print_uint(rd, "cqe", cqe); - res_print_uint(rd, "users", users); - if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) - print_poll_ctx(rd, poll_ctx); - res_print_uint(rd, "pid", pid); - print_comm(rd, comm, nla_line); - - if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) - res_print_uint(rd, "cqn", cqn); - if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) - res_print_uint(rd, "ctxn", ctxn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); + ret = res_cq_line(rd, name, idx, nla_entry); + + if (ret != MNL_CB_OK) + break; } - return MNL_CB_OK; + return ret; } - From patchwork Tue Jan 22 18:31:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029449 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="Vt78zJFq"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTb48kbz9sCs for ; Wed, 23 Jan 2019 05:32:19 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727067AbfAVScS (ORCPT ); Tue, 22 Jan 2019 13:32:18 -0500 Received: from mail.kernel.org ([198.145.29.99]:55014 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726976AbfAVScQ (ORCPT ); Tue, 22 Jan 2019 13:32:16 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2A5F621726; Tue, 22 Jan 2019 18:32:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181935; bh=Rbw+3wtzYLgnkstLajTKV6iQyVs8ypuTwmO68H6kHqs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Vt78zJFqIdv4c0Q1TA+fqpgb1iANJ9bFo8R1QBW5D++Phf/sapkUHtzzf58Mge7LJ i/uXQyeFQXE0SiEr+6whJ1rfj5GyzrgrVyrpRzFKmVYlF9fgHso1UmOTk3kDH0W83u yDJwR/c2xEp4AsjCdfROhbavOBVOJ25ose/h26vY= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 14/19] rdma: Separate MR code Date: Tue, 22 Jan 2019 20:31:20 +0200 Message-Id: <20190122183125.15920-15-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Signed-off-by: Leon Romanovsky --- rdma/res-mr.c | 178 +++++++++++++++++++++++++------------------------- 1 file changed, 90 insertions(+), 88 deletions(-) diff --git a/rdma/res-mr.c b/rdma/res-mr.c index e373035a..36993b5e 100644 --- a/rdma/res-mr.c +++ b/rdma/res-mr.c @@ -7,11 +7,96 @@ #include "res.h" #include +static int res_mr_line(struct rd *rd, const char *name, int idx, + struct nlattr *nla_entry) +{ + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + uint32_t rkey = 0, lkey = 0; + uint64_t iova = 0, mrlen; + char *comm = NULL; + uint32_t pdn = 0; + uint32_t mrn = 0; + uint32_t pid = 0; + int err; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (err != MNL_CB_OK) + return MNL_CB_ERROR; + + if (!nla_line[RDMA_NLDEV_ATTR_RES_MRLEN] || + (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && + !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { + return MNL_CB_ERROR; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) + rkey = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RKEY]); + if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) + lkey = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LKEY]); + if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) + iova = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_IOVA]); + + mrlen = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]); + if (rd_check_is_filtered(rd, "mrlen", mrlen)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { + pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); + comm = get_task_name(pid); + } + + if (rd_check_is_filtered(rd, "pid", pid)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) + mrn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_MRN]); + if (rd_check_is_filtered(rd, "mrn", mrn)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + pdn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + if (rd_check_is_filtered(rd, "pdn", pdn)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) + /* discard const from mnl_attr_get_str */ + comm = (char *)mnl_attr_get_str( + nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); + + if (rd->json_output) + jsonw_start_array(rd->jw); + + print_dev(rd, idx, name); + if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) + print_key(rd, "rkey", rkey); + if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) + print_key(rd, "lkey", lkey); + if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) + print_key(rd, "iova", iova); + res_print_uint(rd, "mrlen", mrlen); + res_print_uint(rd, "pid", pid); + print_comm(rd, comm, nla_line); + + if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) + res_print_uint(rd, "mrn", mrn); + + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + res_print_uint(rd, "pdn", pdn); + + print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); + newline(rd); + +out: + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) + free(comm); + return MNL_CB_OK; +} int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; struct nlattr *nla_table, *nla_entry; struct rd *rd = data; + int ret = MNL_CB_OK; const char *name; uint32_t idx; @@ -25,93 +110,10 @@ int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) nla_table = tb[RDMA_NLDEV_ATTR_RES_MR]; mnl_attr_for_each_nested(nla_entry, nla_table) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - uint32_t rkey = 0, lkey = 0; - uint64_t iova = 0, mrlen; - char *comm = NULL; - uint32_t pdn = 0; - uint32_t mrn = 0; - uint32_t pid = 0; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; - - if (!nla_line[RDMA_NLDEV_ATTR_RES_MRLEN] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) - rkey = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_RKEY]); - if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) - lkey = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_LKEY]); - if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) - iova = mnl_attr_get_u64( - nla_line[RDMA_NLDEV_ATTR_RES_IOVA]); - - mrlen = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]); - if (rd_check_is_filtered(rd, "mrlen", mrlen)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) { - free(comm); - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) - mrn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_MRN]); - if (rd_check_is_filtered(rd, "mrn", mrn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - pdn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - if (rd_check_is_filtered(rd, "pdn", pdn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str( - nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_dev(rd, idx, name); - if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) - print_key(rd, "rkey", rkey); - if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) - print_key(rd, "lkey", lkey); - if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) - print_key(rd, "iova", iova); - res_print_uint(rd, "mrlen", mrlen); - res_print_uint(rd, "pid", pid); - print_comm(rd, comm, nla_line); - - if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) - res_print_uint(rd, "mrn", mrn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - res_print_uint(rd, "pdn", pdn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); + ret = res_mr_line(rd, name, idx, nla_entry); + + if (ret != MNL_CB_OK) + break; } - return MNL_CB_OK; + return ret; } - From patchwork Tue Jan 22 18:31:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029450 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="F176sTMt"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTd6LzXz9s3q for ; Wed, 23 Jan 2019 05:32:21 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727090AbfAVScU (ORCPT ); Tue, 22 Jan 2019 13:32:20 -0500 Received: from mail.kernel.org ([198.145.29.99]:55046 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726976AbfAVScT (ORCPT ); Tue, 22 Jan 2019 13:32:19 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 562D4217D6; Tue, 22 Jan 2019 18:32:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181938; bh=xHMxEexKh2mUyPRxp1enrYPvCxPh6pniFUmExjA7Tbw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=F176sTMtiSH1hajPMFC/4lbL1qmCn1zsjHpNpyVdsEly3H/36acs+013kwSrOP/E8 KiizzJPLif5MKp0zGwzCvp3eUSaGVKLcSupOrSjTG6WpyAHXm+8SzX7IokU7N8U2D+ 06TLNYyONh3U8tuneVJE/iwA83OGnbdTwiPlJ39c= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 15/19] rdma: Separate PD code Date: Tue, 22 Jan 2019 20:31:21 +0200 Message-Id: <20190122183125.15920-16-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Signed-off-by: Leon Romanovsky --- rdma/res-pd.c | 170 ++++++++++++++++++++++++++------------------------ 1 file changed, 89 insertions(+), 81 deletions(-) diff --git a/rdma/res-pd.c b/rdma/res-pd.c index 24ac7f1b..3c9ffa4e 100644 --- a/rdma/res-pd.c +++ b/rdma/res-pd.c @@ -7,11 +7,95 @@ #include "res.h" #include +static int res_pd_line(struct rd *rd, const char *name, int idx, + struct nlattr *nla_entry) +{ + uint32_t local_dma_lkey = 0, unsafe_global_rkey = 0; + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + char *comm = NULL; + uint32_t ctxn = 0; + uint32_t pid = 0; + uint32_t pdn = 0; + uint64_t users; + int err; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (err != MNL_CB_OK) + return MNL_CB_ERROR; + + if (!nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || + (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && + !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { + return MNL_CB_ERROR; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) + local_dma_lkey = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]); + + users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); + if (rd_check_is_filtered(rd, "users", users)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) + unsafe_global_rkey = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]); + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { + pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); + comm = get_task_name(pid); + } + + if (rd_check_is_filtered(rd, "pid", pid)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) + ctxn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); + + if (rd_check_is_filtered(rd, "ctxn", ctxn)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + pdn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + if (rd_check_is_filtered(rd, "pdn", pdn)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) + /* discard const from mnl_attr_get_str */ + comm = (char *)mnl_attr_get_str( + nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); + + if (rd->json_output) + jsonw_start_array(rd->jw); + + print_dev(rd, idx, name); + if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) + print_key(rd, "local_dma_lkey", local_dma_lkey); + res_print_uint(rd, "users", users); + if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) + print_key(rd, "unsafe_global_rkey", unsafe_global_rkey); + res_print_uint(rd, "pid", pid); + print_comm(rd, comm, nla_line); + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) + res_print_uint(rd, "ctxn", ctxn); + + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + res_print_uint(rd, "pdn", pdn); + + print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); + newline(rd); + +out: if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) + free(comm); + return MNL_CB_OK; +} + int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; struct nlattr *nla_table, *nla_entry; struct rd *rd = data; + int ret = MNL_CB_OK; const char *name; uint32_t idx; @@ -25,86 +109,10 @@ int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) nla_table = tb[RDMA_NLDEV_ATTR_RES_PD]; mnl_attr_for_each_nested(nla_entry, nla_table) { - uint32_t local_dma_lkey = 0, unsafe_global_rkey = 0; - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - char *comm = NULL; - uint32_t ctxn = 0; - uint32_t pid = 0; - uint32_t pdn = 0; - uint64_t users; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; - - if (!nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) - local_dma_lkey = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]); - - users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); - if (rd_check_is_filtered(rd, "users", users)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) - unsafe_global_rkey = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) - ctxn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); - - if (rd_check_is_filtered(rd, "ctxn", ctxn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - pdn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - if (rd_check_is_filtered(rd, "pdn", pdn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str( - nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_dev(rd, idx, name); - if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) - print_key(rd, "local_dma_lkey", local_dma_lkey); - res_print_uint(rd, "users", users); - if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) - print_key(rd, "unsafe_global_rkey", unsafe_global_rkey); - res_print_uint(rd, "pid", pid); - print_comm(rd, comm, nla_line); - if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) - res_print_uint(rd, "ctxn", ctxn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - res_print_uint(rd, "pdn", pdn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); + ret = res_pd_line(rd, name, idx, nla_entry); + + if (ret != MNL_CB_OK) + break; } - return MNL_CB_OK; + return ret; } From patchwork Tue Jan 22 18:31:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029451 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="iDy3lycZ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTk3kdbz9s3q for ; Wed, 23 Jan 2019 05:32:26 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727101AbfAVScZ (ORCPT ); Tue, 22 Jan 2019 13:32:25 -0500 Received: from mail.kernel.org ([198.145.29.99]:55090 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727068AbfAVScX (ORCPT ); Tue, 22 Jan 2019 13:32:23 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 79F1421726; Tue, 22 Jan 2019 18:32:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181942; bh=UiBOfK2uVzSbJG/9wCh7tF9eph/Zl++l3EhjmklxY90=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iDy3lycZfVv3Bq/VyTITjDMuAzweGxVH3EjSj7BOaKZEidCwskuJvwM4PcuHb8xSQ sxVAcvTECbBpjtcqH85bcPzl9cJ9jKP1H2U49zTtvbBtRXk9VvD1IKl17AIGroBnR9 hZT1CiJLV6fmW5w0B3ODzulqu9HzfGpRm72h5jPY= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 16/19] rdma: Move QP code to separate function Date: Tue, 22 Jan 2019 20:31:22 +0200 Message-Id: <20190122183125.15920-17-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Signed-off-by: Leon Romanovsky --- rdma/res-qp.c | 253 +++++++++++++++++++++++++------------------------- 1 file changed, 127 insertions(+), 126 deletions(-) diff --git a/rdma/res-qp.c b/rdma/res-qp.c index ecd2cbd6..e74c8b01 100644 --- a/rdma/res-qp.c +++ b/rdma/res-qp.c @@ -78,11 +78,133 @@ static void print_pathmig(struct rd *rd, uint32_t val, struct nlattr **nla_line) pr_out("path-mig-state %s ", path_mig_to_str(val)); } +static int res_qp_line(struct rd *rd, const char *name, int idx, + struct nlattr *nla_entry) +{ + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn; + uint8_t type, state, path_mig_state = 0; + uint32_t port = 0, pid = 0; + uint32_t pdn = 0; + char *comm = NULL; + int err; + + err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (err != MNL_CB_OK) + return MNL_CB_ERROR; + + if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN] || + !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] || + !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] || + !nla_line[RDMA_NLDEV_ATTR_RES_STATE] || + (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && + !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { + return MNL_CB_ERROR; + } + + if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) + port = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]); + + if (port != rd->port_idx) + goto out; + + lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); + if (rd_check_is_filtered(rd, "lqpn", lqpn)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + pdn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + if (rd_check_is_filtered(rd, "pdn", pdn)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) { + rqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQPN]); + if (rd_check_is_filtered(rd, "rqpn", rqpn)) + goto out; + } else { + if (rd_check_is_key_exist(rd, "rqpn")) + goto out; + } + + if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) { + rq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]); + if (rd_check_is_filtered(rd, "rq-psn", rq_psn)) + goto out; + } else { + if (rd_check_is_key_exist(rd, "rq-psn")) + goto out; + } + + sq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]); + if (rd_check_is_filtered(rd, "sq-psn", sq_psn)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) { + path_mig_state = mnl_attr_get_u8( + nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]); + if (rd_check_is_string_filtered(rd, "path-mig-state", + path_mig_to_str(path_mig_state))) + goto out; + } else { + if (rd_check_is_key_exist(rd, "path-mig-state")) + goto out; + } + + type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]); + if (rd_check_is_string_filtered(rd, "type", qp_types_to_str(type))) + goto out; + + state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]); + if (rd_check_is_string_filtered(rd, "state", qp_states_to_str(state))) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { + pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); + comm = get_task_name(pid); + } + + if (rd_check_is_filtered(rd, "pid", pid)) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) + /* discard const from mnl_attr_get_str */ + comm = (char *)mnl_attr_get_str( + nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); + + if (rd->json_output) + jsonw_start_array(rd->jw); + + print_link(rd, idx, name, port, nla_line); + + res_print_uint(rd, "lqpn", lqpn); + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + res_print_uint(rd, "pdn", pdn); + print_rqpn(rd, rqpn, nla_line); + + print_type(rd, type); + print_state(rd, state); + + print_rqpsn(rd, rq_psn, nla_line); + res_print_uint(rd, "sq-psn", sq_psn); + + print_pathmig(rd, path_mig_state, nla_line); + res_print_uint(rd, "pid", pid); + print_comm(rd, comm, nla_line); + + print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); + newline(rd); +out: + if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) + free(comm); + return MNL_CB_OK; +} + int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; struct nlattr *nla_table, *nla_entry; struct rd *rd = data; + int ret = MNL_CB_OK; const char *name; uint32_t idx; @@ -96,131 +218,10 @@ int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) nla_table = tb[RDMA_NLDEV_ATTR_RES_QP]; mnl_attr_for_each_nested(nla_entry, nla_table) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn; - uint8_t type, state, path_mig_state = 0; - uint32_t port = 0, pid = 0; - uint32_t pdn = 0; - char *comm = NULL; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; - - if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN] || - !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] || - !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] || - !nla_line[RDMA_NLDEV_ATTR_RES_STATE] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) - port = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]); - - if (port != rd->port_idx) - continue; - - lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); - if (rd_check_is_filtered(rd, "lqpn", lqpn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - pdn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - if (rd_check_is_filtered(rd, "pdn", pdn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) { - rqpn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_RQPN]); - if (rd_check_is_filtered(rd, "rqpn", rqpn)) - continue; - } else { - if (rd_check_is_key_exist(rd, "rqpn")) - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) { - rq_psn = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]); - if (rd_check_is_filtered(rd, "rq-psn", rq_psn)) - continue; - } else { - if (rd_check_is_key_exist(rd, "rq-psn")) - continue; - } - - sq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]); - if (rd_check_is_filtered(rd, "sq-psn", sq_psn)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) { - path_mig_state = mnl_attr_get_u8( - nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]); - if (rd_check_is_string_filtered( - rd, "path-mig-state", - path_mig_to_str(path_mig_state))) - continue; - } else { - if (rd_check_is_key_exist(rd, "path-mig-state")) - continue; - } - - type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]); - if (rd_check_is_string_filtered(rd, "type", - qp_types_to_str(type))) - continue; - - state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]); - if (rd_check_is_string_filtered(rd, "state", - qp_states_to_str(state))) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) { - free(comm); - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str( - nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_link(rd, idx, name, port, nla_line); - - res_print_uint(rd, "lqpn", lqpn); - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - res_print_uint(rd, "pdn", pdn); - print_rqpn(rd, rqpn, nla_line); - - print_type(rd, type); - print_state(rd, state); - - print_rqpsn(rd, rq_psn, nla_line); - res_print_uint(rd, "sq-psn", sq_psn); - - print_pathmig(rd, path_mig_state, nla_line); - res_print_uint(rd, "pid", pid); - print_comm(rd, comm, nla_line); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); + ret = res_qp_line(rd, name, idx, nla_entry); + + if (ret != MNL_CB_OK) + break; } - return MNL_CB_OK; + return ret; } From patchwork Tue Jan 22 18:31:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029455 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="v/UWUpuZ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTy35Cbz9s4s for ; Wed, 23 Jan 2019 05:32:38 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727175AbfAVSch (ORCPT ); Tue, 22 Jan 2019 13:32:37 -0500 Received: from mail.kernel.org ([198.145.29.99]:55248 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727131AbfAVScg (ORCPT ); Tue, 22 Jan 2019 13:32:36 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3D4E821726; Tue, 22 Jan 2019 18:32:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181954; bh=Z/6IDiE0SgYMz4AAY6VIHzPjHkSVLAEoH8cwpIMMpnE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=v/UWUpuZNQaZnlBDm9nl1ZhrRgQINAAGHBXeR4v+RDZ7lu4XjvFuxNon/kwWqatPH s20eLTBTwyB0zZP7PlUGNcSn47aHMzL9w20ElAIdiGJB3oHHf3w7C2FZiNoy7nY2th w6qgf1w69+tnz2XD19Fo2UMtW/p+tYCd9SDdn0YU= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 17/19] rdma: Unify netlink attribute checks prior to prints Date: Tue, 22 Jan 2019 20:31:23 +0200 Message-Id: <20190122183125.15920-18-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Place check if netlink attribute available in general place, instead of doing the same check in many paces. Signed-off-by: Leon Romanovsky --- rdma/res-cmid.c | 9 ++++----- rdma/res-cq.c | 22 +++++++++++----------- rdma/res-mr.c | 21 +++++++-------------- rdma/res-pd.c | 20 +++++++++----------- rdma/res-qp.c | 10 +++++----- rdma/res.c | 16 +++++++++++++--- rdma/res.h | 6 ++++-- 7 files changed, 53 insertions(+), 51 deletions(-) diff --git a/rdma/res-cmid.c b/rdma/res-cmid.c index 12d1acee..22d99a8b 100644 --- a/rdma/res-cmid.c +++ b/rdma/res-cmid.c @@ -202,16 +202,15 @@ static int res_cm_id_line(struct rd *rd, const char *name, int idx, jsonw_start_array(rd->jw); print_link(rd, idx, name, port, nla_line); - if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) - res_print_uint(rd, "lqpn", lqpn); + res_print_uint(rd, "cm-idn", cm_idn, + nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]); + res_print_uint(rd, "lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) print_qp_type(rd, type); print_cm_id_state(rd, state); print_ps(rd, ps); - res_print_uint(rd, "pid", pid); + res_print_uint(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); print_comm(rd, comm, nla_line); - if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) - res_print_uint(rd, "cm-idn", cm_idn); if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) print_ipaddr(rd, "src-addr", src_addr_str, src_port); diff --git a/rdma/res-cq.c b/rdma/res-cq.c index e50d76ce..cea4f6bd 100644 --- a/rdma/res-cq.c +++ b/rdma/res-cq.c @@ -17,8 +17,11 @@ static const char *poll_ctx_to_str(uint8_t idx) return "UNKNOWN"; } -static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx) +static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx, struct nlattr *attr) { + if (!attr) + return; + if (rd->json_output) { jsonw_string_field(rd->jw, "poll-ctx", poll_ctx_to_str(poll_ctx)); @@ -92,18 +95,15 @@ static int res_cq_line(struct rd *rd, const char *name, int idx, jsonw_start_array(rd->jw); print_dev(rd, idx, name); - res_print_uint(rd, "cqe", cqe); - res_print_uint(rd, "users", users); - if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) - print_poll_ctx(rd, poll_ctx); - res_print_uint(rd, "pid", pid); + res_print_uint(rd, "cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]); + res_print_uint(rd, "cqe", cqe, nla_line[RDMA_NLDEV_ATTR_RES_CQE]); + res_print_uint(rd, "users", users, + nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); + print_poll_ctx(rd, poll_ctx, nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]); + res_print_uint(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); + res_print_uint(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); print_comm(rd, comm, nla_line); - if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) - res_print_uint(rd, "cqn", cqn); - if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) - res_print_uint(rd, "ctxn", ctxn); - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); newline(rd); diff --git a/rdma/res-mr.c b/rdma/res-mr.c index 36993b5e..82e6d150 100644 --- a/rdma/res-mr.c +++ b/rdma/res-mr.c @@ -67,22 +67,15 @@ static int res_mr_line(struct rd *rd, const char *name, int idx, jsonw_start_array(rd->jw); print_dev(rd, idx, name); - if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) - print_key(rd, "rkey", rkey); - if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) - print_key(rd, "lkey", lkey); - if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) - print_key(rd, "iova", iova); - res_print_uint(rd, "mrlen", mrlen); - res_print_uint(rd, "pid", pid); + res_print_uint(rd, "mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]); + print_key(rd, "rkey", rkey, nla_line[RDMA_NLDEV_ATTR_RES_RKEY]); + print_key(rd, "lkey", lkey, nla_line[RDMA_NLDEV_ATTR_RES_LKEY]); + print_key(rd, "iova", iova, nla_line[RDMA_NLDEV_ATTR_RES_IOVA]); + res_print_uint(rd, "mrlen", mrlen, nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]); + res_print_uint(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + res_print_uint(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); print_comm(rd, comm, nla_line); - if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) - res_print_uint(rd, "mrn", mrn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - res_print_uint(rd, "pdn", pdn); - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); newline(rd); diff --git a/rdma/res-pd.c b/rdma/res-pd.c index 3c9ffa4e..e8c042dc 100644 --- a/rdma/res-pd.c +++ b/rdma/res-pd.c @@ -69,18 +69,16 @@ static int res_pd_line(struct rd *rd, const char *name, int idx, jsonw_start_array(rd->jw); print_dev(rd, idx, name); - if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) - print_key(rd, "local_dma_lkey", local_dma_lkey); - res_print_uint(rd, "users", users); - if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) - print_key(rd, "unsafe_global_rkey", unsafe_global_rkey); - res_print_uint(rd, "pid", pid); + res_print_uint(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + print_key(rd, "local_dma_lkey", local_dma_lkey, + nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]); + res_print_uint(rd, "users", users, + nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); + print_key(rd, "unsafe_global_rkey", unsafe_global_rkey, + nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]); + res_print_uint(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); + res_print_uint(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); print_comm(rd, comm, nla_line); - if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) - res_print_uint(rd, "ctxn", ctxn); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - res_print_uint(rd, "pdn", pdn); print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); newline(rd); diff --git a/rdma/res-qp.c b/rdma/res-qp.c index e74c8b01..5d5ef27b 100644 --- a/rdma/res-qp.c +++ b/rdma/res-qp.c @@ -176,19 +176,19 @@ static int res_qp_line(struct rd *rd, const char *name, int idx, print_link(rd, idx, name, port, nla_line); - res_print_uint(rd, "lqpn", lqpn); - if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) - res_print_uint(rd, "pdn", pdn); + res_print_uint(rd, "lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); print_rqpn(rd, rqpn, nla_line); print_type(rd, type); print_state(rd, state); print_rqpsn(rd, rq_psn, nla_line); - res_print_uint(rd, "sq-psn", sq_psn); + res_print_uint(rd, "sq-psn", sq_psn, + nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]); print_pathmig(rd, path_mig_state, nla_line); - res_print_uint(rd, "pid", pid); + res_print_uint(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + res_print_uint(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); print_comm(rd, comm, nla_line); print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); diff --git a/rdma/res.c b/rdma/res.c index 140c0908..564af9b4 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -47,7 +47,9 @@ static int res_print_summary(struct rd *rd, struct nlattr **tb) name = mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME]); curr = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]); - res_print_uint(rd, name, curr); + res_print_uint( + rd, name, curr, + nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]); } return 0; } @@ -188,16 +190,24 @@ char *get_task_name(uint32_t pid) return comm; } -void print_key(struct rd *rd, const char *name, uint64_t val) +void print_key(struct rd *rd, const char *name, uint64_t val, + struct nlattr *nlattr) { + if (!nlattr) + return; + if (rd->json_output) jsonw_xint_field(rd->jw, name, val); else pr_out("%s 0x%" PRIx64 " ", name, val); } -void res_print_uint(struct rd *rd, const char *name, uint64_t val) +void res_print_uint(struct rd *rd, const char *name, uint64_t val, + struct nlattr *nlattr) { + if (!nlattr) + return; + if (rd->json_output) jsonw_u64_field(rd->jw, name, val); else diff --git a/rdma/res.h b/rdma/res.h index 89dd818a..575e1192 100644 --- a/rdma/res.h +++ b/rdma/res.h @@ -112,8 +112,10 @@ char *get_task_name(uint32_t pid); void print_dev(struct rd *rd, uint32_t idx, const char *name); void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port, struct nlattr **nla_line); -void print_key(struct rd *rd, const char *name, uint64_t val); -void res_print_uint(struct rd *rd, const char *name, uint64_t val); +void print_key(struct rd *rd, const char *name, uint64_t val, + struct nlattr *nlattr); +void res_print_uint(struct rd *rd, const char *name, uint64_t val, + struct nlattr *nlattr); void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line); const char *qp_types_to_str(uint8_t idx); From patchwork Tue Jan 22 18:31:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029453 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="o0wH5pAP"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTs15rbz9s4s for ; Wed, 23 Jan 2019 05:32:33 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727046AbfAVScb (ORCPT ); Tue, 22 Jan 2019 13:32:31 -0500 Received: from mail.kernel.org ([198.145.29.99]:55174 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727131AbfAVSca (ORCPT ); Tue, 22 Jan 2019 13:32:30 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D551021726; Tue, 22 Jan 2019 18:32:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181948; bh=wutsBilL81BzarFz/pPU2TN8eb9Ljax48D5s0fhGbGM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=o0wH5pAPE+PqbdnRDrXjEn9hPNm+BAo7xOIR1IAd2evSXL+CodM9Q9WrK7Qcfznfi bFUeNdDUhe4/tgxOKegy3KpRywwo3NwurJzQhYWP9RIabm0nKmeYp2OsL8Dfwkpimb IORicGviTl1MrXgK1aJEBmMNrc6EhhumYufohf/8= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 18/19] rdma: Perform single .doit call to query specific objects Date: Tue, 22 Jan 2019 20:31:24 +0200 Message-Id: <20190122183125.15920-19-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky If user provides specific index, we can speedup query by using .doit callback and save full dump and filtering after that. Signed-off-by: Leon Romanovsky --- rdma/rdma.h | 10 +++++- rdma/res-cmid.c | 33 +++++++++++++------ rdma/res-cq.c | 34 ++++++++++++++------ rdma/res-mr.c | 33 ++++++++++++++----- rdma/res-pd.c | 32 ++++++++++++++----- rdma/res-qp.c | 32 ++++++++++++++----- rdma/res.c | 34 +++++++++++++++++++- rdma/res.h | 84 ++++++++++++++++++++++++++++++++----------------- rdma/utils.c | 20 ++++++++++++ 9 files changed, 239 insertions(+), 73 deletions(-) diff --git a/rdma/rdma.h b/rdma/rdma.h index d2559e7c..e86c7f21 100644 --- a/rdma/rdma.h +++ b/rdma/rdma.h @@ -30,13 +30,20 @@ #define MAX_NUMBER_OF_FILTERS 64 struct filters { const char *name; - bool is_number; + uint8_t is_number:1; + uint8_t is_doit:1; }; struct filter_entry { struct list_head list; char *key; char *value; + /* + * This field menas that we can try to issue .doit calback + * on value above. This value can be converted to integer + * with simple atoi(). Otherwise "is_doit" will be false. + */ + uint8_t is_doit:1; }; struct dev_map { @@ -101,6 +108,7 @@ struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index); /* * Filter manipulation */ +bool rd_doit_index(struct rd *rd, uint32_t *idx); int rd_build_filter(struct rd *rd, const struct filters valid_filters[]); bool rd_check_is_filtered(struct rd *rd, const char *key, uint32_t val); bool rd_check_is_string_filtered(struct rd *rd, const char *key, const char *val); diff --git a/rdma/res-cmid.c b/rdma/res-cmid.c index 22d99a8b..0b61e433 100644 --- a/rdma/res-cmid.c +++ b/rdma/res-cmid.c @@ -107,11 +107,9 @@ static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port) } return 0; } - static int res_cm_id_line(struct rd *rd, const char *name, int idx, - struct nlattr *nla_entry) + struct nlattr **nla_line) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; char src_addr_str[INET6_ADDRSTRLEN]; char dst_addr_str[INET6_ADDRSTRLEN]; uint16_t src_port, dst_port; @@ -120,11 +118,6 @@ static int res_cm_id_line(struct rd *rd, const char *name, int idx, uint32_t lqpn = 0, ps; uint32_t cm_idn = 0; char *comm = NULL; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; if (!nla_line[RDMA_NLDEV_ATTR_RES_STATE] || !nla_line[RDMA_NLDEV_ATTR_RES_PS] || @@ -225,6 +218,23 @@ out: if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) return MNL_CB_OK; } +int res_cm_id_idx_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct rd *rd = data; + const char *name; + int idx; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME]) + return MNL_CB_ERROR; + + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + + return res_cm_id_line(rd, name, idx, tb); +} + int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; @@ -244,8 +254,13 @@ int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) nla_table = tb[RDMA_NLDEV_ATTR_RES_CM_ID]; mnl_attr_for_each_nested(nla_entry, nla_table) { - ret = res_cm_id_line(rd, name, idx, nla_entry); + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + + ret = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (ret != MNL_CB_OK) + break; + ret = res_cm_id_line(rd, name, idx, nla_line); if (ret != MNL_CB_OK) break; } diff --git a/rdma/res-cq.c b/rdma/res-cq.c index cea4f6bd..c14637e6 100644 --- a/rdma/res-cq.c +++ b/rdma/res-cq.c @@ -31,9 +31,8 @@ static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx, struct nlattr *attr) } static int res_cq_line(struct rd *rd, const char *name, int idx, - struct nlattr *nla_entry) + struct nlattr **nla_line) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; char *comm = NULL; uint32_t pid = 0; uint8_t poll_ctx = 0; @@ -41,11 +40,6 @@ static int res_cq_line(struct rd *rd, const char *name, int idx, uint32_t cqn = 0; uint64_t users; uint32_t cqe; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; if (!nla_line[RDMA_NLDEV_ATTR_RES_CQE] || !nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || @@ -80,7 +74,6 @@ static int res_cq_line(struct rd *rd, const char *name, int idx, cqn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQN]); if (rd_check_is_filtered(rd, "cqn", cqn)) goto out; - if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) ctxn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); if (rd_check_is_filtered(rd, "ctxn", ctxn)) @@ -112,6 +105,23 @@ out: if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) return MNL_CB_OK; } +int res_cq_idx_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct rd *rd = data; + const char *name; + uint32_t idx; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME]) + return MNL_CB_ERROR; + + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + + return res_cq_line(rd, name, idx, tb); +} + int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; @@ -131,7 +141,13 @@ int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) nla_table = tb[RDMA_NLDEV_ATTR_RES_CQ]; mnl_attr_for_each_nested(nla_entry, nla_table) { - ret = res_cq_line(rd, name, idx, nla_entry); + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + + ret = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (ret != MNL_CB_OK) + break; + + ret = res_cq_line(rd, name, idx, nla_line); if (ret != MNL_CB_OK) break; diff --git a/rdma/res-mr.c b/rdma/res-mr.c index 82e6d150..d42e8d81 100644 --- a/rdma/res-mr.c +++ b/rdma/res-mr.c @@ -8,20 +8,14 @@ #include static int res_mr_line(struct rd *rd, const char *name, int idx, - struct nlattr *nla_entry) + struct nlattr **nla_line) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; uint32_t rkey = 0, lkey = 0; uint64_t iova = 0, mrlen; char *comm = NULL; uint32_t pdn = 0; uint32_t mrn = 0; uint32_t pid = 0; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; if (!nla_line[RDMA_NLDEV_ATTR_RES_MRLEN] || (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && @@ -84,6 +78,24 @@ out: free(comm); return MNL_CB_OK; } + +int res_mr_idx_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct rd *rd = data; + const char *name; + uint32_t idx; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME]) + return MNL_CB_ERROR; + + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + + return res_mr_line(rd, name, idx, tb); +} + int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; @@ -103,8 +115,13 @@ int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) nla_table = tb[RDMA_NLDEV_ATTR_RES_MR]; mnl_attr_for_each_nested(nla_entry, nla_table) { - ret = res_mr_line(rd, name, idx, nla_entry); + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + + ret = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (ret != MNL_CB_OK) + break; + ret = res_mr_line(rd, name, idx, nla_line); if (ret != MNL_CB_OK) break; } diff --git a/rdma/res-pd.c b/rdma/res-pd.c index e8c042dc..956d4d9f 100644 --- a/rdma/res-pd.c +++ b/rdma/res-pd.c @@ -8,20 +8,14 @@ #include static int res_pd_line(struct rd *rd, const char *name, int idx, - struct nlattr *nla_entry) + struct nlattr **nla_line) { uint32_t local_dma_lkey = 0, unsafe_global_rkey = 0; - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; char *comm = NULL; uint32_t ctxn = 0; uint32_t pid = 0; uint32_t pdn = 0; uint64_t users; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; if (!nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && @@ -88,6 +82,23 @@ out: if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) return MNL_CB_OK; } +int res_pd_idx_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct rd *rd = data; + const char *name; + uint32_t idx; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME]) + return MNL_CB_ERROR; + + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + + return res_pd_line(rd, name, idx, tb); +} + int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; @@ -107,8 +118,13 @@ int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) nla_table = tb[RDMA_NLDEV_ATTR_RES_PD]; mnl_attr_for_each_nested(nla_entry, nla_table) { - ret = res_pd_line(rd, name, idx, nla_entry); + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + + ret = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (ret != MNL_CB_OK) + break; + ret = res_pd_line(rd, name, idx, nla_line); if (ret != MNL_CB_OK) break; } diff --git a/rdma/res-qp.c b/rdma/res-qp.c index 5d5ef27b..ac9976fc 100644 --- a/rdma/res-qp.c +++ b/rdma/res-qp.c @@ -79,19 +79,13 @@ static void print_pathmig(struct rd *rd, uint32_t val, struct nlattr **nla_line) } static int res_qp_line(struct rd *rd, const char *name, int idx, - struct nlattr *nla_entry) + struct nlattr **nla_line) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn; uint8_t type, state, path_mig_state = 0; uint32_t port = 0, pid = 0; uint32_t pdn = 0; char *comm = NULL; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN] || !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] || @@ -199,6 +193,23 @@ out: return MNL_CB_OK; } +int res_qp_idx_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; + struct rd *rd = data; + const char *name; + uint32_t idx; + + mnl_attr_parse(nlh, 0, rd_attr_cb, tb); + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME]) + return MNL_CB_ERROR; + + name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); + idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + + return res_qp_line(rd, name, idx, tb); +} + int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; @@ -218,8 +229,13 @@ int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) nla_table = tb[RDMA_NLDEV_ATTR_RES_QP]; mnl_attr_for_each_nested(nla_entry, nla_table) { - ret = res_qp_line(rd, name, idx, nla_entry); + struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; + + ret = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); + if (ret != MNL_CB_OK) + break; + ret = res_qp_line(rd, name, idx, nla_line); if (ret != MNL_CB_OK) break; } diff --git a/rdma/res.c b/rdma/res.c index 564af9b4..ef863f14 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -54,6 +54,11 @@ static int res_print_summary(struct rd *rd, struct nlattr **tb) return 0; } +static int res_no_args_idx_parse_cb(const struct nlmsghdr *nlh, void *data) +{ + return MNL_CB_OK; +} + static int res_no_args_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; @@ -83,6 +88,33 @@ static int res_no_args_parse_cb(const struct nlmsghdr *nlh, void *data) return MNL_CB_OK; } +int _res_send_idx_msg(struct rd *rd, uint32_t command, mnl_cb_t callback, + uint32_t idx, uint32_t id) +{ + uint32_t flags = NLM_F_REQUEST | NLM_F_ACK; + uint32_t seq; + int ret; + + rd_prepare_msg(rd, command, &seq, flags); + mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); + if (rd->port_idx) + mnl_attr_put_u32(rd->nlh, + RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx); + + mnl_attr_put_u32(rd->nlh, id, idx); + + ret = rd_send_msg(rd); + if (ret) + return ret; + + if (rd->json_output) + jsonw_start_object(rd->jw); + ret = rd_recv_msg(rd, callback, rd, seq); + if (rd->json_output) + jsonw_end_object(rd->jw); + return ret; +} + int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback) { uint32_t flags = NLM_F_REQUEST | NLM_F_ACK; @@ -214,7 +246,7 @@ void res_print_uint(struct rd *rd, const char *name, uint64_t val, pr_out("%s %" PRIu64 " ", name, val); } -RES_FUNC(res_no_args, RDMA_NLDEV_CMD_RES_GET, NULL, true); +RES_FUNC(res_no_args, RDMA_NLDEV_CMD_RES_GET, NULL, true, 0); static int res_show(struct rd *rd) { diff --git a/rdma/res.h b/rdma/res.h index 575e1192..b4a7e552 100644 --- a/rdma/res.h +++ b/rdma/res.h @@ -9,31 +9,52 @@ #include "rdma.h" int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback); +int _res_send_idx_msg(struct rd *rd, uint32_t command, mnl_cb_t callback, + uint32_t idx, uint32_t id); + int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data); +int res_pd_idx_parse_cb(const struct nlmsghdr *nlh, void *data); int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data); +int res_mr_idx_parse_cb(const struct nlmsghdr *nlh, void *data); int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data); +int res_cq_idx_parse_cb(const struct nlmsghdr *nlh, void *data); int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data); +int res_cm_id_idx_parse_cb(const struct nlmsghdr *nlh, void *data); int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data); +int res_qp_idx_parse_cb(const struct nlmsghdr *nlh, void *data); -#define RES_FUNC(name, command, valid_filters, strict_port) \ - static inline int _##name(struct rd *rd)\ - { \ - return _res_send_msg(rd, command, name##_parse_cb); \ - } \ - static inline int name(struct rd *rd) \ - {\ - int ret = rd_build_filter(rd, valid_filters); \ - if (ret) \ - return ret; \ - if ((uintptr_t)valid_filters != (uintptr_t)NULL) { \ - ret = rd_set_arg_to_devname(rd); \ - if (ret) \ - return ret;\ - } \ - if (strict_port) \ - return rd_exec_dev(rd, _##name); \ - else \ - return rd_exec_link(rd, _##name, strict_port); \ +#define RES_FUNC(name, command, valid_filters, strict_port, id) \ + static inline int _##name(struct rd *rd) \ + { \ + uint32_t idx; \ + int ret; \ + if (id) { \ + ret = rd_doit_index(rd, &idx); \ + if (ret) { \ + ret = _res_send_idx_msg(rd, command, \ + name##_idx_parse_cb, \ + idx, id); \ + if (!ret) \ + return ret; \ + /* Fallback for old systems without .doit callbacks */ \ + } \ + } \ + return _res_send_msg(rd, command, name##_parse_cb); \ + } \ + static inline int name(struct rd *rd) \ + { \ + int ret = rd_build_filter(rd, valid_filters); \ + if (ret) \ + return ret; \ + if ((uintptr_t)valid_filters != (uintptr_t)NULL) { \ + ret = rd_set_arg_to_devname(rd); \ + if (ret) \ + return ret; \ + } \ + if (strict_port) \ + return rd_exec_dev(rd, _##name); \ + else \ + return rd_exec_link(rd, _##name, strict_port); \ } static const @@ -42,11 +63,12 @@ struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "users", .is_number = true }, { .name = "pid", .is_number = true }, { .name = "ctxn", .is_number = true }, - { .name = "pdn", .is_number = true }, + { .name = "pdn", .is_number = true, .is_doit = true }, { .name = "ctxn", .is_number = true } }; -RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true); +RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true, + RDMA_NLDEV_ATTR_RES_PDN); static const struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = { @@ -55,11 +77,12 @@ struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "lkey", .is_number = true }, { .name = "mrlen", .is_number = true }, { .name = "pid", .is_number = true }, - { .name = "mrn", .is_number = true }, + { .name = "mrn", .is_number = true, .is_doit = true }, { .name = "pdn", .is_number = true } }; -RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true); +RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true, + RDMA_NLDEV_ATTR_RES_MRN); static const struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = { @@ -67,11 +90,12 @@ struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "users", .is_number = true }, { .name = "poll-ctx", .is_number = false }, { .name = "pid", .is_number = true }, - { .name = "cqn", .is_number = true }, + { .name = "cqn", .is_number = true, .is_doit = true }, { .name = "ctxn", .is_number = true } }; -RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true); +RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true, + RDMA_NLDEV_ATTR_RES_CQN); static const struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = { @@ -87,15 +111,16 @@ struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "src-port", .is_number = true }, { .name = "dst-addr", .is_number = false }, { .name = "dst-port", .is_number = true }, - { .name = "cm-idn", .is_number = true } + { .name = "cm-idn", .is_number = true, .is_doit = true } }; -RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false); +RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false, + RDMA_NLDEV_ATTR_RES_CM_IDN); static const struct filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "link", .is_number = false }, - { .name = "lqpn", .is_number = true }, + { .name = "lqpn", .is_number = true, .is_doit = true }, { .name = "rqpn", .is_number = true }, { .name = "pid", .is_number = true }, { .name = "sq-psn", .is_number = true }, @@ -106,7 +131,8 @@ filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "pdn", .is_number = true }, }; -RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false); +RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false, + RDMA_NLDEV_ATTR_RES_LQPN); char *get_task_name(uint32_t pid); void print_dev(struct rd *rd, uint32_t idx, const char *name); diff --git a/rdma/utils.c b/rdma/utils.c index bce052d5..cff5297d 100644 --- a/rdma/utils.c +++ b/rdma/utils.c @@ -121,6 +121,7 @@ static int add_filter(struct rd *rd, char *key, char *value, struct filter_entry *fe; bool key_found = false; int idx = 0; + char *endp; int ret; fe = calloc(1, sizeof(*fe)); @@ -163,6 +164,11 @@ static int add_filter(struct rd *rd, char *key, char *value, goto err_alloc; } + errno = 0; + strtol(fe->value, &endp, 10); + if (valid_filters[idx].is_doit && !errno && *endp == '\0') + fe->is_doit = true; + for (idx = 0; idx < strlen(fe->value); idx++) fe->value[idx] = tolower(fe->value[idx]); @@ -177,6 +183,20 @@ err: return ret; } +bool rd_doit_index(struct rd *rd, uint32_t *idx) +{ + struct filter_entry *fe; + + list_for_each_entry(fe, &rd->filter_list, list) { + if (fe->is_doit) { + *idx = atoi(fe->value); + return true; + } + } + + return false; +} + int rd_build_filter(struct rd *rd, const struct filters valid_filters[]) { int ret = 0; From patchwork Tue Jan 22 18:31:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 1029454 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="e2mOhds1"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43kcTx2Rybz9s3q for ; Wed, 23 Jan 2019 05:32:37 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727160AbfAVSce (ORCPT ); Tue, 22 Jan 2019 13:32:34 -0500 Received: from mail.kernel.org ([198.145.29.99]:55212 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727131AbfAVScd (ORCPT ); Tue, 22 Jan 2019 13:32:33 -0500 Received: from localhost (unknown [77.138.135.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 0EF37217D6; Tue, 22 Jan 2019 18:32:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548181951; bh=Bm4HIsGxMKFHdmVhgB4mjqc5RBryd7pnuRxeT0BqGFQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=e2mOhds1xtSIM4jSRyNPidOy90xPOxJpLOeEiLp5cb/NtpGDS06pyaSTvMQMhDivh 2IDDn+s28SDfD5sHoiTNG2loIJ1RQDsjvjmVre7k/W09WdXYFTDnKEBxmNiav9Y4NF tT8BlqfgDccwN9eTTXvE7Kknc8kOg0iHD/hfUnRo= From: Leon Romanovsky To: David Ahern Cc: Leon Romanovsky , netdev , RDMA mailing list , Stephen Hemminger Subject: [PATCH iproute2-next 19/19] rdma: Provide and reuse filter functions Date: Tue, 22 Jan 2019 20:31:25 +0200 Message-Id: <20190122183125.15920-20-leon@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190122183125.15920-1-leon@kernel.org> References: <20190122183125.15920-1-leon@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Leon Romanovsky Globally replace all filter function in safer variants of those is_filterred functions, which take into account the availability/lack of netlink attributes. Such conversion allowed to fix a number of places in the code, where the previous implementation didn't honor filter requests if netlink attribute wasn't present. Signed-off-by: Leon Romanovsky --- rdma/rdma.h | 7 +++--- rdma/res-cmid.c | 57 +++++++++++++++++++++++++++---------------------- rdma/res-cq.c | 22 +++++++++++-------- rdma/res-mr.c | 12 +++++++---- rdma/res-pd.c | 12 +++++++---- rdma/res-qp.c | 53 ++++++++++++++++++++++----------------------- rdma/utils.c | 26 ++++++++++++++++++---- 7 files changed, 112 insertions(+), 77 deletions(-) diff --git a/rdma/rdma.h b/rdma/rdma.h index e86c7f21..1022e9a2 100644 --- a/rdma/rdma.h +++ b/rdma/rdma.h @@ -110,9 +110,10 @@ struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index); */ bool rd_doit_index(struct rd *rd, uint32_t *idx); int rd_build_filter(struct rd *rd, const struct filters valid_filters[]); -bool rd_check_is_filtered(struct rd *rd, const char *key, uint32_t val); -bool rd_check_is_string_filtered(struct rd *rd, const char *key, const char *val); -bool rd_check_is_key_exist(struct rd *rd, const char *key); +bool rd_is_filtered_attr(struct rd *rd, const char *key, uint32_t val, + struct nlattr *attr); +bool rd_is_string_filtered_attr(struct rd *rd, const char *key, const char *val, + struct nlattr *attr); /* * Netlink */ diff --git a/rdma/res-cmid.c b/rdma/res-cmid.c index 0b61e433..0b830088 100644 --- a/rdma/res-cmid.c +++ b/rdma/res-cmid.c @@ -132,57 +132,64 @@ static int res_cm_id_line(struct rd *rd, const char *name, int idx, if (port && port != rd->port_idx) goto out; - if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) { + if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); - if (rd_check_is_filtered(rd, "lqpn", lqpn)) - goto out; - } - if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) { + + if (rd_is_filtered_attr(rd, "lqpn", lqpn, + nla_line[RDMA_NLDEV_ATTR_RES_LQPN])) + goto out; + + if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]); - if (rd_check_is_string_filtered(rd, "qp-type", - qp_types_to_str(type))) - goto out; - } + if (rd_is_string_filtered_attr(rd, "qp-type", qp_types_to_str(type), + nla_line[RDMA_NLDEV_ATTR_RES_TYPE])) + goto out; ps = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PS]); - if (rd_check_is_string_filtered(rd, "ps", cm_id_ps_to_str(ps))) + if (rd_is_string_filtered_attr(rd, "ps", cm_id_ps_to_str(ps), + nla_line[RDMA_NLDEV_ATTR_RES_PS])) goto out; state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]); - if (rd_check_is_string_filtered(rd, "state", cm_id_state_to_str(state))) + if (rd_is_string_filtered_attr(rd, "state", cm_id_state_to_str(state), + nla_line[RDMA_NLDEV_ATTR_RES_STATE])) goto out; - if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) { + if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR], src_addr_str, &src_port)) goto out; - if (rd_check_is_string_filtered(rd, "src-addr", src_addr_str)) - goto out; - if (rd_check_is_filtered(rd, "src-port", src_port)) - goto out; - } + if (rd_is_string_filtered_attr(rd, "src-addr", src_addr_str, + nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR])) + goto out; + if (rd_is_filtered_attr(rd, "src-port", src_port, + nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR])) + goto out; - if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) { + if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR], dst_addr_str, &dst_port)) goto out; - if (rd_check_is_string_filtered(rd, "dst-addr", dst_addr_str)) - goto out; - if (rd_check_is_filtered(rd, "dst-port", dst_port)) - goto out; - } + if (rd_is_string_filtered_attr(rd, "dst-addr", dst_addr_str, + nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR])) + goto out; + if (rd_is_filtered_attr(rd, "dst-port", dst_port, + nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR])) + goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); comm = get_task_name(pid); } - if (rd_check_is_filtered(rd, "pid", pid)) + if (rd_is_filtered_attr(rd, "pid", pid, + nla_line[RDMA_NLDEV_ATTR_RES_PID])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) cm_idn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]); - if (rd_check_is_filtered(rd, "cm-idn", cm_idn)) + if (rd_is_filtered_attr(rd, "cm-idn", cm_idn, + nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) { diff --git a/rdma/res-cq.c b/rdma/res-cq.c index c14637e6..5afb97c5 100644 --- a/rdma/res-cq.c +++ b/rdma/res-cq.c @@ -51,32 +51,36 @@ static int res_cq_line(struct rd *rd, const char *name, int idx, cqe = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQE]); users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); - if (rd_check_is_filtered(rd, "users", users)) + if (rd_is_filtered_attr(rd, "users", users, + nla_line[RDMA_NLDEV_ATTR_RES_USECNT])) goto out; - if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) { + if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) poll_ctx = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]); - if (rd_check_is_string_filtered(rd, "poll-ctx", - poll_ctx_to_str(poll_ctx))) - goto out; - } + if (rd_is_string_filtered_attr(rd, "poll-ctx", + poll_ctx_to_str(poll_ctx), + nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX])) + goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); comm = get_task_name(pid); } - if (rd_check_is_filtered(rd, "pid", pid)) + if (rd_is_filtered_attr(rd, "pid", pid, + nla_line[RDMA_NLDEV_ATTR_RES_PID])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_CQN]) cqn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQN]); - if (rd_check_is_filtered(rd, "cqn", cqn)) + if (rd_is_filtered_attr(rd, "cqn", cqn, + nla_line[RDMA_NLDEV_ATTR_RES_CQN])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) ctxn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); - if (rd_check_is_filtered(rd, "ctxn", ctxn)) + if (rd_is_filtered_attr(rd, "ctxn", ctxn, + nla_line[RDMA_NLDEV_ATTR_RES_CTXN])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) diff --git a/rdma/res-mr.c b/rdma/res-mr.c index d42e8d81..f4a24dc1 100644 --- a/rdma/res-mr.c +++ b/rdma/res-mr.c @@ -31,7 +31,8 @@ static int res_mr_line(struct rd *rd, const char *name, int idx, iova = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_IOVA]); mrlen = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]); - if (rd_check_is_filtered(rd, "mrlen", mrlen)) + if (rd_is_filtered_attr(rd, "mrlen", mrlen, + nla_line[RDMA_NLDEV_ATTR_RES_MRLEN])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { @@ -39,17 +40,20 @@ static int res_mr_line(struct rd *rd, const char *name, int idx, comm = get_task_name(pid); } - if (rd_check_is_filtered(rd, "pid", pid)) + if (rd_is_filtered_attr(rd, "pid", pid, + nla_line[RDMA_NLDEV_ATTR_RES_PID])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_MRN]) mrn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_MRN]); - if (rd_check_is_filtered(rd, "mrn", mrn)) + if (rd_is_filtered_attr(rd, "mrn", mrn, + nla_line[RDMA_NLDEV_ATTR_RES_MRN])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) pdn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - if (rd_check_is_filtered(rd, "pdn", pdn)) + if (rd_is_filtered_attr(rd, "pdn", pdn, + nla_line[RDMA_NLDEV_ATTR_RES_PDN])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) diff --git a/rdma/res-pd.c b/rdma/res-pd.c index 956d4d9f..07c836e8 100644 --- a/rdma/res-pd.c +++ b/rdma/res-pd.c @@ -28,7 +28,8 @@ static int res_pd_line(struct rd *rd, const char *name, int idx, nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]); users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); - if (rd_check_is_filtered(rd, "users", users)) + if (rd_is_filtered_attr(rd, "users", users, + nla_line[RDMA_NLDEV_ATTR_RES_USECNT])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) @@ -40,18 +41,21 @@ static int res_pd_line(struct rd *rd, const char *name, int idx, comm = get_task_name(pid); } - if (rd_check_is_filtered(rd, "pid", pid)) + if (rd_is_filtered_attr(rd, "pid", pid, + nla_line[RDMA_NLDEV_ATTR_RES_PID])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) ctxn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); - if (rd_check_is_filtered(rd, "ctxn", ctxn)) + if (rd_is_filtered_attr(rd, "ctxn", ctxn, + nla_line[RDMA_NLDEV_ATTR_RES_CTXN])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) pdn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - if (rd_check_is_filtered(rd, "pdn", pdn)) + if (rd_is_filtered_attr(rd, "pdn", pdn, + nla_line[RDMA_NLDEV_ATTR_RES_PDN])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) diff --git a/rdma/res-qp.c b/rdma/res-qp.c index ac9976fc..954e465d 100644 --- a/rdma/res-qp.c +++ b/rdma/res-qp.c @@ -103,53 +103,49 @@ static int res_qp_line(struct rd *rd, const char *name, int idx, goto out; lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); - if (rd_check_is_filtered(rd, "lqpn", lqpn)) + if (rd_is_filtered_attr(rd, "lqpn", lqpn, + nla_line[RDMA_NLDEV_ATTR_RES_LQPN])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) pdn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - if (rd_check_is_filtered(rd, "pdn", pdn)) + if (rd_is_filtered_attr(rd, "pdn", pdn, + nla_line[RDMA_NLDEV_ATTR_RES_PDN])) goto out; - if (nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) { + if (nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) rqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQPN]); - if (rd_check_is_filtered(rd, "rqpn", rqpn)) - goto out; - } else { - if (rd_check_is_key_exist(rd, "rqpn")) - goto out; - } + if (rd_is_filtered_attr(rd, "rqpn", rqpn, + nla_line[RDMA_NLDEV_ATTR_RES_RQPN])) + goto out; - if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) { + if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) rq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]); - if (rd_check_is_filtered(rd, "rq-psn", rq_psn)) - goto out; - } else { - if (rd_check_is_key_exist(rd, "rq-psn")) - goto out; - } + if (rd_is_filtered_attr(rd, "rq-psn", rq_psn, + nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN])) + goto out; sq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]); - if (rd_check_is_filtered(rd, "sq-psn", sq_psn)) + if (rd_is_filtered_attr(rd, "sq-psn", sq_psn, + nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN])) goto out; - if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) { + if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) path_mig_state = mnl_attr_get_u8( nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]); - if (rd_check_is_string_filtered(rd, "path-mig-state", - path_mig_to_str(path_mig_state))) - goto out; - } else { - if (rd_check_is_key_exist(rd, "path-mig-state")) - goto out; - } + if (rd_is_string_filtered_attr( + rd, "path-mig-state", path_mig_to_str(path_mig_state), + nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE])) + goto out; type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]); - if (rd_check_is_string_filtered(rd, "type", qp_types_to_str(type))) + if (rd_is_string_filtered_attr(rd, "type", qp_types_to_str(type), + nla_line[RDMA_NLDEV_ATTR_RES_TYPE])) goto out; state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]); - if (rd_check_is_string_filtered(rd, "state", qp_states_to_str(state))) + if (rd_is_string_filtered_attr(rd, "state", qp_states_to_str(state), + nla_line[RDMA_NLDEV_ATTR_RES_STATE])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { @@ -157,7 +153,8 @@ static int res_qp_line(struct rd *rd, const char *name, int idx, comm = get_task_name(pid); } - if (rd_check_is_filtered(rd, "pid", pid)) + if (rd_is_filtered_attr(rd, "pid", pid, + nla_line[RDMA_NLDEV_ATTR_RES_PID])) goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) diff --git a/rdma/utils.c b/rdma/utils.c index cff5297d..6bc14cd5 100644 --- a/rdma/utils.c +++ b/rdma/utils.c @@ -233,7 +233,7 @@ out: return ret; } -bool rd_check_is_key_exist(struct rd *rd, const char *key) +static bool rd_check_is_key_exist(struct rd *rd, const char *key) { struct filter_entry *fe; @@ -249,8 +249,8 @@ bool rd_check_is_key_exist(struct rd *rd, const char *key) * Check if string entry is filtered: * * key doesn't exist -> user didn't request -> not filtered */ -bool rd_check_is_string_filtered(struct rd *rd, - const char *key, const char *val) +static bool rd_check_is_string_filtered(struct rd *rd, const char *key, + const char *val) { bool key_is_filtered = false; struct filter_entry *fe; @@ -300,7 +300,7 @@ out: * Check if key is filtered: * key doesn't exist -> user didn't request -> not filtered */ -bool rd_check_is_filtered(struct rd *rd, const char *key, uint32_t val) +static bool rd_check_is_filtered(struct rd *rd, const char *key, uint32_t val) { bool key_is_filtered = false; struct filter_entry *fe; @@ -349,6 +349,24 @@ out: return key_is_filtered; } +bool rd_is_filtered_attr(struct rd *rd, const char *key, uint32_t val, + struct nlattr *attr) +{ + if (!attr) + return rd_check_is_key_exist(rd, key); + + return rd_check_is_filtered(rd, key, val); +} + +bool rd_is_string_filtered_attr(struct rd *rd, const char *key, const char *val, + struct nlattr *attr) +{ + if (!attr) + rd_check_is_key_exist(rd, key); + + return rd_check_is_string_filtered(rd, key, val); +} + static void filters_cleanup(struct rd *rd) { struct filter_entry *fe, *tmp;