Message ID | 20180102093725.6172-2-leon@kernel.org |
---|---|
State | Changes Requested, archived |
Delegated to: | David Ahern |
Headers | show |
Series | RDMA resource tracking | expand |
a couple of nits On 1/2/18 2:37 AM, Leon Romanovsky wrote: > diff --git a/rdma/utils.c b/rdma/utils.c > index 7b2001e2..7c920a5c 100644 > --- a/rdma/utils.c > +++ b/rdma/utils.c > @@ -10,6 +10,7 @@ > */ > > #include "rdma.h" > +#include <ctype.h> > > static int rd_argc(struct rd *rd) > { > @@ -50,13 +51,43 @@ bool rd_no_arg(struct rd *rd) > return rd_argc(rd) == 0; > } > > -uint32_t get_port_from_argv(struct rd *rd) > +/* > + * Possible input:output > + * dev/port | first port | is_dump_all > + * mlx5_1 | 0 | true > + * mlx5_1/ | 0 | true > + * mlx5_1/0 | 0 | false > + * mlx5_1/1 | 1 | false > + * mlx5_1/- | 0 | false > + * > + * In strict mode, /- will return error. > + */ > +static int get_port_from_argv(struct rd *rd, uint32_t *port, > + bool *is_dump_all, bool strict_port) > { > char *slash; > > + *port = 0; > + *is_dump_all = true; > + > slash = strchr(rd_argv(rd), '/'); > /* if no port found, return 0 */ > - return slash ? atoi(slash + 1) : 0; > + if (slash) { ++slash here would alleviate the need for all of the +1's. > + if (*(slash + 1) == '-') { > + if (strict_port) > + return -EINVAL; > + *is_dump_all = false; > + return 0; > + } > + > + if (isdigit(*(slash + 1))) { > + *is_dump_all = false; > + *port = atoi(slash + 1); > + } > + if (!*port && strlen(slash + 1)) > + return -EINVAL; > + } > + return 0; > } > > static struct dev_map *dev_map_alloc(const char *dev_name) > @@ -152,7 +183,7 @@ void rd_free(struct rd *rd) > dev_map_cleanup(rd); > } > > -int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd)) > +int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port) > { > struct dev_map *dev_map; > uint32_t port; > @@ -163,7 +194,8 @@ int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd)) > if (rd_no_arg(rd)) { > list_for_each_entry(dev_map, &rd->dev_map_list, list) { > rd->dev_idx = dev_map->idx; > - for (port = 1; port < dev_map->num_ports + 1; port++) { > + port = (strict_port) ? 1 : 0; > + for (; port < dev_map->num_ports + 1; port++) { > rd->port_idx = port; > ret = cb(rd); > if (ret) > @@ -172,21 +204,22 @@ int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd)) > } > > } else { > + bool is_dump_all; > dev_map = dev_map_lookup(rd, true); newline between declarations and code. > - port = get_port_from_argv(rd); > - if (!dev_map || port > dev_map->num_ports) { > + ret = get_port_from_argv(rd, &port, &is_dump_all, strict_port); > + if (!dev_map || port > dev_map->num_ports || (!port && ret)) { > pr_err("Wrong device name\n"); > ret = -ENOENT; > goto out; > } > rd_arg_inc(rd); > rd->dev_idx = dev_map->idx; > - rd->port_idx = port ? : 1; > + rd->port_idx = port; > for (; rd->port_idx < dev_map->num_ports + 1; rd->port_idx++) { > ret = cb(rd); > if (ret) > goto out; > - if (port) > + if (!is_dump_all) > /* > * We got request to show link for devname > * with port index. >
diff --git a/rdma/link.c b/rdma/link.c index 676cb21d..66bcd50e 100644 --- a/rdma/link.c +++ b/rdma/link.c @@ -285,7 +285,7 @@ static int link_one_show(struct rd *rd) static int link_show(struct rd *rd) { - return rd_exec_link(rd, link_one_show); + return rd_exec_link(rd, link_one_show, true); } int cmd_link(struct rd *rd) diff --git a/rdma/rdma.h b/rdma/rdma.h index 8d53d3a0..cbd9aa89 100644 --- a/rdma/rdma.h +++ b/rdma/rdma.h @@ -64,7 +64,6 @@ bool rd_no_arg(struct rd *rd); void rd_arg_inc(struct rd *rd); char *rd_argv(struct rd *rd); -uint32_t get_port_from_argv(struct rd *rd); /* * Commands interface @@ -73,7 +72,7 @@ int cmd_dev(struct rd *rd); int cmd_link(struct rd *rd); int rd_exec_cmd(struct rd *rd, const struct rd_cmd *c, const char *str); int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd)); -int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd)); +int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port); void rd_free(struct rd *rd); /* diff --git a/rdma/utils.c b/rdma/utils.c index 7b2001e2..7c920a5c 100644 --- a/rdma/utils.c +++ b/rdma/utils.c @@ -10,6 +10,7 @@ */ #include "rdma.h" +#include <ctype.h> static int rd_argc(struct rd *rd) { @@ -50,13 +51,43 @@ bool rd_no_arg(struct rd *rd) return rd_argc(rd) == 0; } -uint32_t get_port_from_argv(struct rd *rd) +/* + * Possible input:output + * dev/port | first port | is_dump_all + * mlx5_1 | 0 | true + * mlx5_1/ | 0 | true + * mlx5_1/0 | 0 | false + * mlx5_1/1 | 1 | false + * mlx5_1/- | 0 | false + * + * In strict mode, /- will return error. + */ +static int get_port_from_argv(struct rd *rd, uint32_t *port, + bool *is_dump_all, bool strict_port) { char *slash; + *port = 0; + *is_dump_all = true; + slash = strchr(rd_argv(rd), '/'); /* if no port found, return 0 */ - return slash ? atoi(slash + 1) : 0; + if (slash) { + if (*(slash + 1) == '-') { + if (strict_port) + return -EINVAL; + *is_dump_all = false; + return 0; + } + + if (isdigit(*(slash + 1))) { + *is_dump_all = false; + *port = atoi(slash + 1); + } + if (!*port && strlen(slash + 1)) + return -EINVAL; + } + return 0; } static struct dev_map *dev_map_alloc(const char *dev_name) @@ -152,7 +183,7 @@ void rd_free(struct rd *rd) dev_map_cleanup(rd); } -int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd)) +int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port) { struct dev_map *dev_map; uint32_t port; @@ -163,7 +194,8 @@ int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd)) if (rd_no_arg(rd)) { list_for_each_entry(dev_map, &rd->dev_map_list, list) { rd->dev_idx = dev_map->idx; - for (port = 1; port < dev_map->num_ports + 1; port++) { + port = (strict_port) ? 1 : 0; + for (; port < dev_map->num_ports + 1; port++) { rd->port_idx = port; ret = cb(rd); if (ret) @@ -172,21 +204,22 @@ int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd)) } } else { + bool is_dump_all; dev_map = dev_map_lookup(rd, true); - port = get_port_from_argv(rd); - if (!dev_map || port > dev_map->num_ports) { + ret = get_port_from_argv(rd, &port, &is_dump_all, strict_port); + if (!dev_map || port > dev_map->num_ports || (!port && ret)) { pr_err("Wrong device name\n"); ret = -ENOENT; goto out; } rd_arg_inc(rd); rd->dev_idx = dev_map->idx; - rd->port_idx = port ? : 1; + rd->port_idx = port; for (; rd->port_idx < dev_map->num_ports + 1; rd->port_idx++) { ret = cb(rd); if (ret) goto out; - if (port) + if (!is_dump_all) /* * We got request to show link for devname * with port index.