From patchwork Tue Jun 27 14:39:16 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 9811949 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id AB34B603D7 for ; Tue, 27 Jun 2017 14:40:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9F16F20007 for ; Tue, 27 Jun 2017 14:40:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9236D286C4; Tue, 27 Jun 2017 14:40:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EC08A20007 for ; Tue, 27 Jun 2017 14:40:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751619AbdF0OkR (ORCPT ); Tue, 27 Jun 2017 10:40:17 -0400 Received: from mail.kernel.org ([198.145.29.99]:39790 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751630AbdF0Ojl (ORCPT ); Tue, 27 Jun 2017 10:39:41 -0400 Received: from localhost (unknown [213.57.247.46]) (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 2A31622B61; Tue, 27 Jun 2017 14:39:28 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2A31622B61 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=leon@kernel.org From: Leon Romanovsky To: Stephen Hemminger Cc: Leon Romanovsky , Doug Ledford , Ariel Almog , Dennis Dalessandro , Jason Gunthorpe , Linux RDMA , Linux Netdev Subject: [PATCH iproute2 V1 2/6] rdma: Add dev object Date: Tue, 27 Jun 2017 17:39:16 +0300 Message-Id: <20170627143920.28020-3-leon@kernel.org> X-Mailer: git-send-email 2.13.1 In-Reply-To: <20170627143920.28020-1-leon@kernel.org> References: <20170627143920.28020-1-leon@kernel.org> Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Leon Romanovsky Device (dev) object represents struct ib_device to user space. The supported commands are show, set and help, but it doesn't print anything except device name at this stage. The downstream patches will fill this object with subcommands. Print all devices: # rdma dev 1: mlx5_0: 2: mlx5_1: 3: mlx5_2: Print specific device: # rdma dev show mlx5_1 2: mlx5_1: Signed-off-by: Leon Romanovsky --- rdma/Makefile | 2 +- rdma/dev.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ rdma/rdma.c | 3 ++- rdma/rdma.h | 6 ++++++ rdma/utils.c | 39 ++++++++++++++++++++++++++++++++++----- 5 files changed, 98 insertions(+), 7 deletions(-) create mode 100644 rdma/dev.c diff --git a/rdma/Makefile b/rdma/Makefile index 64da2142..123d7ac5 100644 --- a/rdma/Makefile +++ b/rdma/Makefile @@ -2,7 +2,7 @@ include ../Config ifeq ($(HAVE_MNL),y) -RDMA_OBJ = rdma.o utils.o +RDMA_OBJ = rdma.o utils.o dev.o TARGETS=rdma CFLAGS += $(shell $(PKG_CONFIG) libmnl --cflags) diff --git a/rdma/dev.c b/rdma/dev.c new file mode 100644 index 00000000..d4809d63 --- /dev/null +++ b/rdma/dev.c @@ -0,0 +1,55 @@ +/* + * 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 + */ + +#include "rdma.h" + +static int dev_help(struct rdma *rd) +{ + pr_out("Usage: %s dev show [DEV]\n", rd->filename); + return 0; +} + +static void dev_one_show(const struct dev_map *dev_map) +{ + pr_out("%u: %s:\n", dev_map->idx, dev_map->dev_name); +} + +static int dev_show(struct rdma *rd) +{ + struct dev_map *dev_map; + + if (rd_no_arg(rd)) { + list_for_each_entry(dev_map, &rd->dev_map_list, list) + dev_one_show(dev_map); + } + else { + dev_map = dev_map_lookup(rd, false); + if (!dev_map) { + pr_err("Wrong device name\n"); + return -ENOENT; + } + dev_one_show(dev_map); + } + return 0; +} + +int cmd_dev(struct rdma *rd) +{ + const struct rdma_cmd cmds[] = { + { NULL, dev_show }, + { "show", dev_show }, + { "list", dev_show }, + { "help", dev_help }, + { 0 } + }; + + return rdma_exec_cmd(rd, cmds, "dev command"); +} diff --git a/rdma/rdma.c b/rdma/rdma.c index 9c754da3..f904532c 100644 --- a/rdma/rdma.c +++ b/rdma/rdma.c @@ -18,7 +18,7 @@ static void help(char *name) { pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n" - "where OBJECT := { help }\n" + "where OBJECT := { dev | help }\n" " OPTIONS := { -V[ersion] }\n", name); } @@ -33,6 +33,7 @@ static int rd_cmd(struct rdma *rd) const struct rdma_cmd cmds[] = { { NULL, cmd_help }, { "help", cmd_help }, + { "dev", cmd_dev }, { 0 } }; diff --git a/rdma/rdma.h b/rdma/rdma.h index 9841aebf..f5e104ec 100644 --- a/rdma/rdma.h +++ b/rdma/rdma.h @@ -58,12 +58,18 @@ bool rd_no_arg(struct rdma *rd); bool rd_argv_match(struct rdma *rd, const char *pattern); void rd_arg_inc(struct rdma *rd); +/* + * Commands interface + */ +int cmd_dev(struct rdma *rd); int rdma_exec_cmd(struct rdma *rd, const struct rdma_cmd *c, const char *str); /* * Device manipulation */ void rdma_free_devmap(struct rdma *rd); +struct dev_map *dev_map_lookup(struct rdma *rd, bool allow_port_index); +struct dev_map *_dev_map_lookup(struct rdma *rd, const char *dev_name); /* * Netlink diff --git a/rdma/utils.c b/rdma/utils.c index 96278a4c..4d29eced 100644 --- a/rdma/utils.c +++ b/rdma/utils.c @@ -128,8 +128,10 @@ static int port_map_alloc(struct dev_map *dev_map, uint32_t num_ports) } static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = { + [RDMA_NLDEV_ATTR_DEV_INDEX] = MNL_TYPE_U32, [RDMA_NLDEV_ATTR_DEV_NAME] = MNL_TYPE_NUL_STRING, [RDMA_NLDEV_ATTR_PORT_INDEX] = MNL_TYPE_U32, + [RDMA_NLDEV_ATTR_CAP_FLAGS] = MNL_TYPE_U64, }; int rd_attr_cb(const struct nlattr *attr, void *data) @@ -156,10 +158,9 @@ int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data) struct rdma *rd = data; const char *dev_name; uint32_t num_ports; - static int i = 1; mnl_attr_parse(nlh, 0, rd_attr_cb, tb); - if (!tb[RDMA_NLDEV_ATTR_DEV_NAME]) + if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME]) return MNL_CB_ERROR; if (!tb[RDMA_NLDEV_ATTR_PORT_INDEX]) { pr_err("This tool doesn't support switches yet\n"); @@ -167,18 +168,18 @@ int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data) } dev_name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); - num_ports = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]); - dev_map = dev_map_alloc(dev_name); if (!dev_map) /* The main function will cleanup the allocations */ return MNL_CB_ERROR; list_add_tail(&dev_map->list, &rd->dev_map_list); - dev_map->idx = i++; + num_ports = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]); if (port_map_alloc(dev_map, num_ports)) return MNL_CB_ERROR; dev_map->num_ports = num_ports; + dev_map->idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); + dev_map->caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]); return MNL_CB_OK; } @@ -268,3 +269,31 @@ int rdma_recv_msg(struct rdma *rd, mnl_cb_t callback, void *data, unsigned int s mnl_socket_close(rd->nl); return ret; } + +struct dev_map *_dev_map_lookup(struct rdma *rd, const char *dev_name) +{ + struct dev_map *dev_map; + + list_for_each_entry(dev_map, &rd->dev_map_list, list) + if (strcmp(dev_name, dev_map->dev_name) == 0) + return dev_map; + + return NULL; +} +struct dev_map *dev_map_lookup(struct rdma *rd, bool allow_port_index) +{ + struct dev_map *dev_map; + char *dev_name; + char *slash; + + dev_name = strdup(rd_argv(rd)); + if (allow_port_index) { + slash = strrchr(dev_name, '/'); + if (slash) + *slash = '\0'; + } + + dev_map = _dev_map_lookup(rd, dev_name); + free(dev_name); + return dev_map; +}