Re: [PATCH iproute2 V1 3/6] rdma: Add device capability parsing

2017-06-27 Thread Leon Romanovsky
On Tue, Jun 27, 2017 at 04:04:49PM -0700, Stephen Hemminger wrote:
> On Tue, 27 Jun 2017 17:39:17 +0300
> Leon Romanovsky  wrote:
>
> > +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

2017-06-27 Thread Stephen Hemminger
On Tue, 27 Jun 2017 17:39:17 +0300
Leon Romanovsky  wrote:

> +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

2017-06-27 Thread Leon Romanovsky
From: Leon Romanovsky 

Add 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) {
+