]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/ofed/management/infiniband-diags/scripts/ibswportwatch.pl
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / ofed / management / infiniband-diags / scripts / ibswportwatch.pl
1 #!/usr/bin/perl
2 #
3 # Copyright (c) 2008 Voltaire, Inc. All rights reserved.
4 # Copyright (c) 2006 The Regents of the University of California.
5 #
6 # Produced at Lawrence Livermore National Laboratory.
7 # Written by Ira Weiny <weiny2@llnl.gov>.
8 #
9 # This software is available to you under a choice of one of two
10 # licenses.  You may choose to be licensed under the terms of the GNU
11 # General Public License (GPL) Version 2, available from the file
12 # COPYING in the main directory of this source tree, or the
13 # OpenIB.org BSD license below:
14 #
15 #     Redistribution and use in source and binary forms, with or
16 #     without modification, are permitted provided that the following
17 #     conditions are met:
18 #
19 #      - Redistributions of source code must retain the above
20 #        copyright notice, this list of conditions and the following
21 #        disclaimer.
22 #
23 #      - Redistributions in binary form must reproduce the above
24 #        copyright notice, this list of conditions and the following
25 #        disclaimer in the documentation and/or other materials
26 #        provided with the distribution.
27 #
28 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
31 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
32 # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
33 # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
34 # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
35 # SOFTWARE.
36 #
37
38 use strict;
39
40 use Getopt::Std;
41 use IBswcountlimits;
42
43 my $sw_addr = "";
44 my $sw_port = "";
45 my $verbose = undef;
46
47 # =========================================================================
48 #
49 sub print_verbose
50 {
51         if ($verbose) {
52                 print $_[0];
53         }
54 }
55
56 # =========================================================================
57 #
58 sub print_all_counts
59 {
60         if (!$verbose) { return; }
61
62         print "   Counter\t\t\tNew ==> Old\n";
63         foreach my $cnt (@IBswcountlimits::counters) {
64                 print
65 "   $cnt\t\t\t$IBswcountlimits::new_counts{$cnt} ==> $IBswcountlimits::cur_counts{$cnt}\n";
66         }
67 }
68
69 # =========================================================================
70 #
71 sub usage_and_exit
72 {
73         my $prog = $_[0];
74         print
75           "Usage: $prog [-p <pause_time> -b -v -n <cycles> -G] <guid|lid> <port>\n";
76         print "   Attempt to diagnose a problem on a port\n";
77         print
78 "   Run this on a link while a job is running which utilizes that link.\n";
79         print
80 "   -p <pause_time> define the ammount of time between counter polls (default $IBswcountlimits::pause_time)\n";
81         print "   -v Be verbose\n";
82         print "   -n <cycles> run n cycles then exit (default -1 == forever)\n";
83         print "   -G Address provided is a GUID\n";
84         print "   -b report bytes/second packets/second\n";
85         exit 2;
86 }
87
88 # =========================================================================
89 #
90 sub clear_counters
91 {
92         # clear the counters
93         foreach my $count (@IBswcountlimits::counters) {
94                 $IBswcountlimits::cur_counts{$count} = 0;
95                 $IBswcountlimits::new_counts{$count} = 0;
96         }
97 }
98
99 # =========================================================================
100 #
101 sub mv_counts
102 {
103         foreach my $count (@IBswcountlimits::counters) {
104                 $IBswcountlimits::cur_counts{$count} =
105                   $IBswcountlimits::new_counts{$count};
106         }
107 }
108
109 # =========================================================================
110 # use perfquery to get the counters.
111 my $GUID = "";
112
113 sub get_new_counts
114 {
115         my $addr = $_[0];
116         my $port = $_[1];
117         mv_counts;
118         ensure_cache_dir;
119         if (
120                 system(
121 "perfquery $GUID $addr $port > $IBswcountlimits::cache_dir/perfquery.out"
122                 )
123           )
124         {
125                 die "perfquery failed : \"perfquery $GUID $addr $port\"\n";
126         }
127         open PERF_QUERY, "<$IBswcountlimits::cache_dir/perfquery.out"
128           or die "cannot read '$IBswcountlimits::cache_dir/perfquery.out': $!\n";
129         while (my $line = <PERF_QUERY>) {
130                 foreach my $count (@IBswcountlimits::counters) {
131                         if ($line =~ /^$count:\.+(\d+)/) {
132                                 $IBswcountlimits::new_counts{$count} = $1;
133                         }
134                 }
135         }
136         close PERF_QUERY;
137 }
138
139 my $cycle = -1;    # forever
140
141 my $bytes_per_second = undef;
142 my $argv0            = `basename $0`;
143 chomp $argv0;
144 if (!getopts("hbvp:n:G"))        { usage_and_exit $argv0; }
145 if (defined $Getopt::Std::opt_h) { usage_and_exit $argv0; }
146 if (defined $Getopt::Std::opt_p) {
147         $IBswcountlimits::pause_time = $Getopt::Std::opt_p;
148 }
149 if (defined $Getopt::Std::opt_v) { $verbose          = $Getopt::Std::opt_v; }
150 if (defined $Getopt::Std::opt_n) { $cycle            = $Getopt::Std::opt_n; }
151 if (defined $Getopt::Std::opt_G) { $GUID             = "-G"; }
152 if (defined $Getopt::Std::opt_b) { $bytes_per_second = $Getopt::Std::opt_b; }
153
154 my $sw_addr = $ARGV[0];
155 my $sw_port = $ARGV[1];
156
157 sub main
158 {
159         clear_counters;
160         get_new_counts($sw_addr, $sw_port);
161         while ($cycle != 0) {
162                 print "Checking counts...\n";
163                 sleep($IBswcountlimits::pause_time);
164                 get_new_counts($sw_addr, $sw_port);
165                 check_counter_rates;
166                 if ($bytes_per_second) {
167                         print_data_rates;
168                 }
169                 print_all_counts;
170                 if ($cycle != -1) { $cycle = $cycle - 1; }
171         }
172 }
173 main;
174