Re: [PATCH iproute2 V1 3/6] rdma: Add device capability parsing
On Tue, Jun 27, 2017 at 04:04:49PM -0700, Stephen Hemminger wrote: > On Tue, 27 Jun 2017 17:39:17 +0300 > Leon Romanovskywrote: > > > +static const char *dev_caps[64] = { > > + "RESIZE_MAX_WR", > > + "BAD_PKEY_CNTR", > > + "BAD_QKEY_CNTR", > > + "RAW_MULTI", > > + "AUTO_PATH_MIG", > > + "CHANGE_PHY_PORT", > > + "UD_AV_PORT_ENFORCE", > > + "CURR_QP_STATE_MOD", > > + "SHUTDOWN_PORT", > > + "INIT_TYPE", > > + "PORT_ACTIVE_EVENT", > > + "SYS_IMAGE_GUID", > > + "RC_RNR_NAK_GEN", > > + "SRQ_RESIZE", > > + "N_NOTIFY_CQ", > > + "LOCAL_DMA_LKEY", > > + "RESERVED", > > + "MEM_WINDOW", > > + "UD_IP_CSUM", > > + "UD_TSO", > > + "XRC", > > + "MEM_MGT_EXTENSIONS", > > + "BLOCK_MULTICAST_LOOPBACK", > > + "MEM_WINDOW_TYPE_2A", > > + "MEM_WINDOW_TYPE_2B", > > + "RC_IP_CSUM", > > + "RAW_IP_CSUM", > > + "CROSS_CHANNEL", > > + "MANAGED_FLOW_STEERING", > > + "SIGNATURE_HANDOVER", > > + "ON_DEMAND_PAGING", > > + "SG_GAPS_REG", > > + "VIRTUAL_FUNCTION", > > + "RAW_SCATTER_FCS", > > + "RDMA_NETDEV_OPA_VNIC", > > +}; > > Please use array initializer so that header and capabilities don't get > different values. > Are the bit values in some rdma header file? It is enum ib_device_cap_flags copied from include/rdma/ib_verbs.h. These enum ib_device_cap_flags and enum ib_port_cap_flags are not exposed to the user (include/uapi/rdma/*) and I'm planning to move them there in next cycle. Thanks signature.asc Description: PGP signature
Re: [PATCH iproute2 V1 3/6] rdma: Add device capability parsing
On Tue, 27 Jun 2017 17:39:17 +0300 Leon Romanovskywrote: > +static const char *dev_caps[64] = { > + "RESIZE_MAX_WR", > + "BAD_PKEY_CNTR", > + "BAD_QKEY_CNTR", > + "RAW_MULTI", > + "AUTO_PATH_MIG", > + "CHANGE_PHY_PORT", > + "UD_AV_PORT_ENFORCE", > + "CURR_QP_STATE_MOD", > + "SHUTDOWN_PORT", > + "INIT_TYPE", > + "PORT_ACTIVE_EVENT", > + "SYS_IMAGE_GUID", > + "RC_RNR_NAK_GEN", > + "SRQ_RESIZE", > + "N_NOTIFY_CQ", > + "LOCAL_DMA_LKEY", > + "RESERVED", > + "MEM_WINDOW", > + "UD_IP_CSUM", > + "UD_TSO", > + "XRC", > + "MEM_MGT_EXTENSIONS", > + "BLOCK_MULTICAST_LOOPBACK", > + "MEM_WINDOW_TYPE_2A", > + "MEM_WINDOW_TYPE_2B", > + "RC_IP_CSUM", > + "RAW_IP_CSUM", > + "CROSS_CHANNEL", > + "MANAGED_FLOW_STEERING", > + "SIGNATURE_HANDOVER", > + "ON_DEMAND_PAGING", > + "SG_GAPS_REG", > + "VIRTUAL_FUNCTION", > + "RAW_SCATTER_FCS", > + "RDMA_NETDEV_OPA_VNIC", > +}; Please use array initializer so that header and capabilities don't get different values. Are the bit values in some rdma header file?
[PATCH iproute2 V1 3/6] rdma: Add device capability parsing
From: Leon RomanovskyAdd parsing interface for the device capability flags $ rdma dev show 1: mlx5_0: caps: 2: mlx5_1: caps: 3: mlx5_2: caps: 4: mlx5_3: caps: 5: mlx5_4: caps: root@mtr-leonro:~# $ rdma dev show mlx5_4 5: mlx5_4: caps: Signed-off-by: Leon Romanovsky --- rdma/dev.c | 99 +++- rdma/rdma.h | 3 ++ rdma/utils.c | 2 +- 3 files changed, 95 insertions(+), 9 deletions(-) diff --git a/rdma/dev.c b/rdma/dev.c index d4809d63..76f4af88 100644 --- a/rdma/dev.c +++ b/rdma/dev.c @@ -17,28 +17,111 @@ static int dev_help(struct rdma *rd) return 0; } -static void dev_one_show(const struct dev_map *dev_map) +static const char *dev_caps[64] = { + "RESIZE_MAX_WR", + "BAD_PKEY_CNTR", + "BAD_QKEY_CNTR", + "RAW_MULTI", + "AUTO_PATH_MIG", + "CHANGE_PHY_PORT", + "UD_AV_PORT_ENFORCE", + "CURR_QP_STATE_MOD", + "SHUTDOWN_PORT", + "INIT_TYPE", + "PORT_ACTIVE_EVENT", + "SYS_IMAGE_GUID", + "RC_RNR_NAK_GEN", + "SRQ_RESIZE", + "N_NOTIFY_CQ", + "LOCAL_DMA_LKEY", + "RESERVED", + "MEM_WINDOW", + "UD_IP_CSUM", + "UD_TSO", + "XRC", + "MEM_MGT_EXTENSIONS", + "BLOCK_MULTICAST_LOOPBACK", + "MEM_WINDOW_TYPE_2A", + "MEM_WINDOW_TYPE_2B", + "RC_IP_CSUM", + "RAW_IP_CSUM", + "CROSS_CHANNEL", + "MANAGED_FLOW_STEERING", + "SIGNATURE_HANDOVER", + "ON_DEMAND_PAGING", + "SG_GAPS_REG", + "VIRTUAL_FUNCTION", + "RAW_SCATTER_FCS", + "RDMA_NETDEV_OPA_VNIC", +}; + +static int dev_print_caps(struct rdma *rd) { - pr_out("%u: %s:\n", dev_map->idx, dev_map->dev_name); + struct dev_map *dev_map = rd->dev_map_curr; + uint64_t caps = dev_map->caps; + bool found = false; + uint32_t idx; + + pr_out("caps: <"); + for (idx = 0; idx < 64; idx++) { + if (caps & 0x1) { + pr_out("%s", dev_caps[idx]?dev_caps[idx]:"UNKNONW"); + if (caps >> 0x1) + pr_out(", "); + found = true; + } + caps >>= 0x1; + } + if(!found) + pr_out("NONE"); + + pr_out(">\n"); + return 0; +} + +static int dev_no_args(struct rdma *rd) +{ + struct dev_map *dev_map = rd->dev_map_curr; + + pr_out("%u: %s: \n", dev_map->idx, dev_map->dev_name); + return dev_print_caps(rd); +} + +static int dev_one_show(struct rdma *rd) +{ + const struct rdma_cmd cmds[] = { + { NULL, dev_no_args}, + { 0 } + }; + + return rdma_exec_cmd(rd, cmds, "parameter"); + } static int dev_show(struct rdma *rd) { struct dev_map *dev_map; + int ret = 0; if (rd_no_arg(rd)) { - list_for_each_entry(dev_map, >dev_map_list, list) - dev_one_show(dev_map); + list_for_each_entry(dev_map, >dev_map_list, list) { + rd->dev_map_curr = dev_map; + ret = dev_one_show(rd); + if (ret) + return ret; + } + } else { - dev_map = dev_map_lookup(rd, false); - if (!dev_map) { +