On Thu, 13 Sep 2012 16:13:05 -0700
Albert Chu <ch...@llnl.gov> wrote:

> Allow user to select multiple ports via comma or range input.  May
> be particularly useful for gathering aggregate performance counters
> for groups of ports, such as all the uplinks or downlinks from a
> switch.
> 
> Signed-off-by: Albert Chu <ch...@llnl.gov>

Thanks applied,
Ira

> ---
>  doc/rst/perfquery.8.in.rst |   19 ++++++++++----
>  src/perfquery.c            |   57 +++++++++++++++++++++++++++++++++++++++++--
>  2 files changed, 68 insertions(+), 8 deletions(-)
> 
> diff --git a/doc/rst/perfquery.8.in.rst b/doc/rst/perfquery.8.in.rst
> index 359c94e..5e3d709 100644
> --- a/doc/rst/perfquery.8.in.rst
> +++ b/doc/rst/perfquery.8.in.rst
> @@ -14,7 +14,7 @@ query InfiniBand port counters on a single port
>  SYNOPSIS
>  ========
>  
> -perfquery [options] [<lid|guid> [[port] [reset_mask]]]
> +perfquery [options] [<lid|guid> [[port(s)] [reset_mask]]]
>  
>  DESCRIPTION
>  ===========
> @@ -32,6 +32,9 @@ octets divided by 4 rather than just octets.
>  
>  Note: Inputting a port of 255 indicates an operation be performed on all 
> ports.
>  
> +Note: For PortCounters, ExtendedCounters, and resets, multiple ports can be
> +specified by either a comma separated list or a port range.  See examples 
> below.
> +
>  
>  OPTIONS
>  =======
> @@ -98,15 +101,16 @@ OPTIONS
>       show port samples control.
>  
>  **-a, --all_ports**
> -     show aggregated counters for all ports of the destination lid or reset
> -     all counters for all ports.  If the destination lid does not support
> +     show aggregated counters for all ports of the destination lid, reset
> +     all counters for all ports, or if multiple ports are specified, 
> aggregate
> +     the counters of the specified ports.  If the destination lid does not 
> support
>       the AllPortSelect flag, all ports will be iterated through to emulate
>       AllPortSelect behavior.
>  
>  **-l, --loop_ports**
>       If all ports are selected by the user (either through the **-a** option
> -     or port 255) iterate through each port rather than doing than aggregate
> -     operation.
> +     or port 255) or multiple ports are specified iterate through each port 
> rather
> +     than doing than aggregate operation.
>  
>  **-r, --reset_after_read**
>       reset counters after read
> @@ -158,6 +162,7 @@ EXAMPLES
>  ========
>  
>  ::
> +
>       perfquery                # read local port performance counters
>       perfquery 32 1           # read performance counters from lid 32, port 1
>       perfquery -x 32 1        # read extended performance counters from lid 
> 32, port 1
> @@ -169,6 +174,10 @@ EXAMPLES
>       perfquery -R -a 32       # reset performance counters of all ports
>       perfquery -R 32 2 0x0fff # reset only error counters of port 2
>       perfquery -R 32 2 0xf000 # reset only non-error counters of port 2
> +     perfquery -a 32 1-10     # read performance counters from lid 32, port 
> 1-10, aggregate output
> +     perfquery -l 32 1-10     # read performance counters from lid 32, port 
> 1-10, output each port
> +     perfquery -a 32 1,4,8    # read performance counters from lid 32, port 
> 1, 4, and 8, aggregate output
> +     perfquery -l 32 1,4,8    # read performance counters from lid 32, port 
> 1, 4, and 8, output each port
>  
>  AUTHOR
>  ======
> diff --git a/src/perfquery.c b/src/perfquery.c
> index 32dd98f..27ec4f7 100644
> --- a/src/perfquery.c
> +++ b/src/perfquery.c
> @@ -94,6 +94,7 @@ struct perf_count perf_count =
>  struct perf_count_ext perf_count_ext = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
>  
>  #define ALL_PORTS 0xFF
> +#define MAX_PORTS 255
>  
>  /* Notes: IB semantics is to cap counters if count has exceeded limits.
>   * Therefore we must check for overflows and cap the counters if necessary.
> @@ -371,6 +372,8 @@ static int reset, reset_only, all_ports, loop_ports, 
> port, extended, xmt_sl,
>      rcv_sl, xmt_disc, rcv_err, extended_speeds, smpl_ctl, oprcvcounters, 
> flowctlcounters,
>      vloppackets, vlopdata, vlxmitflowctlerrors, vlxmitcounters, swportvlcong,
>      rcvcc, slrcvfecn, slrcvbecn, xmitcc, vlxmittimecc;
> +static int ports[MAX_PORTS];
> +static int ports_count;
>  
>  static void common_func(ib_portid_t * portid, int port_num, int mask,
>                       unsigned query, unsigned reset,
> @@ -666,6 +669,7 @@ int main(int argc, char **argv)
>       uint8_t data[IB_SMP_DATA_SIZE] = { 0 };
>       int start_port = 1;
>       int enhancedport0;
> +     char *tmpstr;
>       int i;
>  
>       const struct ibdiag_opt opts[] = {
> @@ -694,7 +698,7 @@ int main(int argc, char **argv)
>               {"Reset_only", 'R', 0, NULL, "only reset counters"},
>               {0}
>       };
> -     char usage_args[] = " [<lid|guid> [[port] [reset_mask]]]";
> +     char usage_args[] = " [<lid|guid> [[port(s)] [reset_mask]]]";
>       const char *usage_examples[] = {
>               "\t\t# read local port's performance counters",
>               "32 1\t\t# read performance counters from lid 32, port 1",
> @@ -707,6 +711,10 @@ int main(int argc, char **argv)
>               "-R -a 32\t# reset performance counters of all ports",
>               "-R 32 2 0x0fff\t# reset only error counters of port 2",
>               "-R 32 2 0xf000\t# reset only non-error counters of port 2",
> +             "-a 32 1-10\t# read performance counters from lid 32, port 
> 1-10, aggregate output",
> +             "-l 32 1-10\t# read performance counters from lid 32, port 
> 1-10, output each port",
> +             "-a 32 1,4,8\t# read performance counters from lid 32, port 1, 
> 4, and 8, aggregate output",
> +             "-l 32 1,4,8\t# read performance counters from lid 32, port 1, 
> 4, and 8, output each port",
>               NULL,
>       };
>  
> @@ -716,8 +724,35 @@ int main(int argc, char **argv)
>       argc -= optind;
>       argv += optind;
>  
> -     if (argc > 1)
> -             port = strtoul(argv[1], 0, 0);
> +     if (argc > 1) {
> +             if (strchr(argv[1], ',')) {
> +                     tmpstr = strtok(argv[1], ",");
> +                     while (tmpstr) {
> +                             ports[ports_count++] = strtoul(tmpstr, 0, 0);
> +                             tmpstr = strtok(NULL, ",");
> +                     }
> +                     port = ports[0];
> +             }
> +             else if ((tmpstr = strchr(argv[1], '-'))) {
> +                     int pmin, pmax;
> +
> +                     *tmpstr = '\0';
> +                     tmpstr++;
> +
> +                     pmin = strtoul(argv[1], 0, 0);
> +                     pmax = strtoul(tmpstr, 0, 0);
> +
> +                     if (pmin >= pmax)
> +                             IBERROR("max port must be greater than min port 
> in range");
> +
> +                     while (pmin <= pmax)
> +                             ports[ports_count++] = pmin++;
> +
> +                     port = ports[0];
> +             }
> +             else
> +                     port = strtoul(argv[1], 0, 0);
> +     }
>       if (argc > 2) {
>               ext_mask = strtoull(argv[2], 0, 0);
>               mask = ext_mask;
> @@ -882,6 +917,19 @@ int main(int argc, char **argv)
>                               output_aggregate_perfcounters_ext(&portid,
>                                                                 cap_mask);
>               }
> +     } else if (ports_count > 1) {
> +             for (i = 0; i < ports_count; i++)
> +                     dump_perfcounters(extended, ibd_timeout, cap_mask,
> +                                       &portid, ports[i],
> +                                       (all_ports && !loop_ports));
> +             if (all_ports && !loop_ports) {
> +                     if (extended != 1)
> +                             output_aggregate_perfcounters(&portid,
> +                                                           cap_mask);
> +                     else
> +                             output_aggregate_perfcounters_ext(&portid,
> +                                                               cap_mask);
> +             }
>       } else
>               dump_perfcounters(extended, ibd_timeout, cap_mask, &portid,
>                                 port, 0);
> @@ -896,6 +944,9 @@ do_reset:
>       if (all_ports_loop || (loop_ports && (all_ports || port == ALL_PORTS))) 
> {
>               for (i = start_port; i <= num_ports; i++)
>                       reset_counters(extended, ibd_timeout, mask, &portid, i);
> +     } else if (ports_count > 1) {
> +             for (i = 0; i < ports_count; i++)
> +                     reset_counters(extended, ibd_timeout, mask, &portid, 
> ports[i]);
>       } else
>               reset_counters(extended, ibd_timeout, mask, &portid, port);
>  
> -- 
> 1.7.1
> 
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


-- 
Ira Weiny
Member of Technical Staff
Lawrence Livermore National Lab
925-423-8008
wei...@llnl.gov
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to