diff options
author | Mike Marciniszyn <mike.marciniszyn@intel.com> | 2013-06-15 17:07:09 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2013-06-21 20:19:51 -0400 |
commit | 17db3a92c144a0f8a81c52e94b7110bc86b5067f (patch) | |
tree | 3c5a13b1820b2bfd34eaac578d0a8c62987c1277 /drivers/infiniband | |
parent | ddb8876589702a9396d15d9d4075e6388d0600cf (diff) |
IB/qib: Add per-context stats interface
This patch adds a debugfs stats interface for per kernel contexts
packet counts.
The code uses the opcode stats count and eliminates the counter in the
context.
Reviewed-by: Dean Luick <dean.luick@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/qib/qib_debugfs.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/qib/qib_debugfs.c b/drivers/infiniband/hw/qib/qib_debugfs.c index 47d01164cc91..a4e6ee154f19 100644 --- a/drivers/infiniband/hw/qib/qib_debugfs.c +++ b/drivers/infiniband/hw/qib/qib_debugfs.c | |||
@@ -126,6 +126,68 @@ static int _opcode_stats_seq_show(struct seq_file *s, void *v) | |||
126 | 126 | ||
127 | DEBUGFS_FILE(opcode_stats) | 127 | DEBUGFS_FILE(opcode_stats) |
128 | 128 | ||
129 | static void *_ctx_stats_seq_start(struct seq_file *s, loff_t *pos) | ||
130 | { | ||
131 | struct qib_ibdev *ibd = (struct qib_ibdev *)s->private; | ||
132 | struct qib_devdata *dd = dd_from_dev(ibd); | ||
133 | |||
134 | if (!*pos) | ||
135 | return SEQ_START_TOKEN; | ||
136 | if (*pos >= dd->first_user_ctxt) | ||
137 | return NULL; | ||
138 | return pos; | ||
139 | } | ||
140 | |||
141 | static void *_ctx_stats_seq_next(struct seq_file *s, void *v, loff_t *pos) | ||
142 | { | ||
143 | struct qib_ibdev *ibd = (struct qib_ibdev *)s->private; | ||
144 | struct qib_devdata *dd = dd_from_dev(ibd); | ||
145 | |||
146 | if (v == SEQ_START_TOKEN) | ||
147 | return pos; | ||
148 | |||
149 | ++*pos; | ||
150 | if (*pos >= dd->first_user_ctxt) | ||
151 | return NULL; | ||
152 | return pos; | ||
153 | } | ||
154 | |||
155 | static void _ctx_stats_seq_stop(struct seq_file *s, void *v) | ||
156 | { | ||
157 | /* nothing allocated */ | ||
158 | } | ||
159 | |||
160 | static int _ctx_stats_seq_show(struct seq_file *s, void *v) | ||
161 | { | ||
162 | loff_t *spos; | ||
163 | loff_t i, j; | ||
164 | u64 n_packets = 0; | ||
165 | struct qib_ibdev *ibd = (struct qib_ibdev *)s->private; | ||
166 | struct qib_devdata *dd = dd_from_dev(ibd); | ||
167 | |||
168 | if (v == SEQ_START_TOKEN) { | ||
169 | seq_puts(s, "Ctx:npkts\n"); | ||
170 | return 0; | ||
171 | } | ||
172 | |||
173 | spos = v; | ||
174 | i = *spos; | ||
175 | |||
176 | if (!dd->rcd[i]) | ||
177 | return SEQ_SKIP; | ||
178 | |||
179 | for (j = 0; j < ARRAY_SIZE(dd->rcd[i]->opstats->stats); j++) | ||
180 | n_packets += dd->rcd[i]->opstats->stats[j].n_packets; | ||
181 | |||
182 | if (!n_packets) | ||
183 | return SEQ_SKIP; | ||
184 | |||
185 | seq_printf(s, " %llu:%llu\n", i, n_packets); | ||
186 | return 0; | ||
187 | } | ||
188 | |||
189 | DEBUGFS_FILE(ctx_stats) | ||
190 | |||
129 | void qib_dbg_ibdev_init(struct qib_ibdev *ibd) | 191 | void qib_dbg_ibdev_init(struct qib_ibdev *ibd) |
130 | { | 192 | { |
131 | char name[10]; | 193 | char name[10]; |
@@ -137,6 +199,7 @@ void qib_dbg_ibdev_init(struct qib_ibdev *ibd) | |||
137 | return; | 199 | return; |
138 | } | 200 | } |
139 | DEBUGFS_FILE_CREATE(opcode_stats); | 201 | DEBUGFS_FILE_CREATE(opcode_stats); |
202 | DEBUGFS_FILE_CREATE(ctx_stats); | ||
140 | return; | 203 | return; |
141 | } | 204 | } |
142 | 205 | ||