diff options
| author | Mike Marciniszyn <mike.marciniszyn@intel.com> | 2013-06-15 17:07:14 -0400 |
|---|---|---|
| committer | Roland Dreier <roland@purestorage.com> | 2013-06-21 20:19:52 -0400 |
| commit | 1dd173b01f52c7a197cab20563d5f4967472a852 (patch) | |
| tree | fa7194bc8024ff795bc38ec692e36dd2d5d279b6 | |
| parent | 17db3a92c144a0f8a81c52e94b7110bc86b5067f (diff) | |
IB/qib: Add qp_stats debug file
This adds a seq_file iterator for reporting the QP hash table when the
qp_stats file is read.
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>
| -rw-r--r-- | drivers/infiniband/hw/qib/qib_debugfs.c | 54 | ||||
| -rw-r--r-- | drivers/infiniband/hw/qib/qib_qp.c | 94 | ||||
| -rw-r--r-- | drivers/infiniband/hw/qib/qib_verbs.h | 14 |
3 files changed, 161 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/qib/qib_debugfs.c b/drivers/infiniband/hw/qib/qib_debugfs.c index a4e6ee154f19..799a0c3bffc4 100644 --- a/drivers/infiniband/hw/qib/qib_debugfs.c +++ b/drivers/infiniband/hw/qib/qib_debugfs.c | |||
| @@ -188,6 +188,59 @@ static int _ctx_stats_seq_show(struct seq_file *s, void *v) | |||
| 188 | 188 | ||
| 189 | DEBUGFS_FILE(ctx_stats) | 189 | DEBUGFS_FILE(ctx_stats) |
| 190 | 190 | ||
| 191 | static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos) | ||
| 192 | { | ||
| 193 | struct qib_qp_iter *iter; | ||
| 194 | loff_t n = *pos; | ||
| 195 | |||
| 196 | iter = qib_qp_iter_init(s->private); | ||
| 197 | if (!iter) | ||
| 198 | return NULL; | ||
| 199 | |||
| 200 | while (n--) { | ||
| 201 | if (qib_qp_iter_next(iter)) { | ||
| 202 | kfree(iter); | ||
| 203 | return NULL; | ||
| 204 | } | ||
| 205 | } | ||
| 206 | |||
| 207 | return iter; | ||
| 208 | } | ||
| 209 | |||
| 210 | static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, | ||
| 211 | loff_t *pos) | ||
| 212 | { | ||
| 213 | struct qib_qp_iter *iter = iter_ptr; | ||
| 214 | |||
| 215 | (*pos)++; | ||
| 216 | |||
| 217 | if (qib_qp_iter_next(iter)) { | ||
| 218 | kfree(iter); | ||
| 219 | return NULL; | ||
| 220 | } | ||
| 221 | |||
| 222 | return iter; | ||
| 223 | } | ||
| 224 | |||
| 225 | static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr) | ||
| 226 | { | ||
| 227 | /* nothing for now */ | ||
| 228 | } | ||
| 229 | |||
| 230 | static int _qp_stats_seq_show(struct seq_file *s, void *iter_ptr) | ||
| 231 | { | ||
| 232 | struct qib_qp_iter *iter = iter_ptr; | ||
| 233 | |||
| 234 | if (!iter) | ||
| 235 | return 0; | ||
| 236 | |||
| 237 | qib_qp_iter_print(s, iter); | ||
| 238 | |||
| 239 | return 0; | ||
| 240 | } | ||
| 241 | |||
| 242 | DEBUGFS_FILE(qp_stats) | ||
| 243 | |||
| 191 | void qib_dbg_ibdev_init(struct qib_ibdev *ibd) | 244 | void qib_dbg_ibdev_init(struct qib_ibdev *ibd) |
| 192 | { | 245 | { |
| 193 | char name[10]; | 246 | char name[10]; |
| @@ -200,6 +253,7 @@ void qib_dbg_ibdev_init(struct qib_ibdev *ibd) | |||
| 200 | } | 253 | } |
| 201 | DEBUGFS_FILE_CREATE(opcode_stats); | 254 | DEBUGFS_FILE_CREATE(opcode_stats); |
| 202 | DEBUGFS_FILE_CREATE(ctx_stats); | 255 | DEBUGFS_FILE_CREATE(ctx_stats); |
| 256 | DEBUGFS_FILE_CREATE(qp_stats); | ||
| 203 | return; | 257 | return; |
| 204 | } | 258 | } |
| 205 | 259 | ||
diff --git a/drivers/infiniband/hw/qib/qib_qp.c b/drivers/infiniband/hw/qib/qib_qp.c index c1f573a331c7..3cca55b51e54 100644 --- a/drivers/infiniband/hw/qib/qib_qp.c +++ b/drivers/infiniband/hw/qib/qib_qp.c | |||
| @@ -35,6 +35,9 @@ | |||
| 35 | #include <linux/err.h> | 35 | #include <linux/err.h> |
| 36 | #include <linux/vmalloc.h> | 36 | #include <linux/vmalloc.h> |
| 37 | #include <linux/jhash.h> | 37 | #include <linux/jhash.h> |
| 38 | #ifdef CONFIG_DEBUG_FS | ||
| 39 | #include <linux/seq_file.h> | ||
| 40 | #endif | ||
| 38 | 41 | ||
| 39 | #include "qib.h" | 42 | #include "qib.h" |
| 40 | 43 | ||
| @@ -1287,3 +1290,94 @@ void qib_get_credit(struct qib_qp *qp, u32 aeth) | |||
| 1287 | } | 1290 | } |
| 1288 | } | 1291 | } |
| 1289 | } | 1292 | } |
| 1293 | |||
| 1294 | #ifdef CONFIG_DEBUG_FS | ||
| 1295 | |||
| 1296 | struct qib_qp_iter { | ||
| 1297 | struct qib_ibdev *dev; | ||
| 1298 | struct qib_qp *qp; | ||
| 1299 | int n; | ||
| 1300 | }; | ||
| 1301 | |||
| 1302 | struct qib_qp_iter *qib_qp_iter_init(struct qib_ibdev *dev) | ||
| 1303 | { | ||
| 1304 | struct qib_qp_iter *iter; | ||
| 1305 | |||
| 1306 | iter = kzalloc(sizeof(*iter), GFP_KERNEL); | ||
| 1307 | if (!iter) | ||
| 1308 | return NULL; | ||
| 1309 | |||
| 1310 | iter->dev = dev; | ||
| 1311 | if (qib_qp_iter_next(iter)) { | ||
| 1312 | kfree(iter); | ||
| 1313 | return NULL; | ||
| 1314 | } | ||
| 1315 | |||
| 1316 | return iter; | ||
| 1317 | } | ||
| 1318 | |||
| 1319 | int qib_qp_iter_next(struct qib_qp_iter *iter) | ||
| 1320 | { | ||
| 1321 | struct qib_ibdev *dev = iter->dev; | ||
| 1322 | int n = iter->n; | ||
| 1323 | int ret = 1; | ||
| 1324 | struct qib_qp *pqp = iter->qp; | ||
| 1325 | struct qib_qp *qp; | ||
| 1326 | |||
| 1327 | rcu_read_lock(); | ||
| 1328 | for (; n < dev->qp_table_size; n++) { | ||
| 1329 | if (pqp) | ||
| 1330 | qp = rcu_dereference(pqp->next); | ||
| 1331 | else | ||
| 1332 | qp = rcu_dereference(dev->qp_table[n]); | ||
| 1333 | pqp = qp; | ||
| 1334 | if (qp) { | ||
| 1335 | if (iter->qp) | ||
| 1336 | atomic_dec(&iter->qp->refcount); | ||
| 1337 | atomic_inc(&qp->refcount); | ||
| 1338 | rcu_read_unlock(); | ||
| 1339 | iter->qp = qp; | ||
| 1340 | iter->n = n; | ||
| 1341 | return 0; | ||
| 1342 | } | ||
| 1343 | } | ||
| 1344 | rcu_read_unlock(); | ||
| 1345 | if (iter->qp) | ||
| 1346 | atomic_dec(&iter->qp->refcount); | ||
| 1347 | return ret; | ||
| 1348 | } | ||
| 1349 | |||
| 1350 | static const char * const qp_type_str[] = { | ||
| 1351 | "SMI", "GSI", "RC", "UC", "UD", | ||
| 1352 | }; | ||
| 1353 | |||
| 1354 | void qib_qp_iter_print(struct seq_file *s, struct qib_qp_iter *iter) | ||
| 1355 | { | ||
| 1356 | struct qib_swqe *wqe; | ||
| 1357 | struct qib_qp *qp = iter->qp; | ||
| 1358 | |||
| 1359 | wqe = get_swqe_ptr(qp, qp->s_last); | ||
| 1360 | seq_printf(s, | ||
| 1361 | "N %d QP%u %s %u %u %u f=%x %u %u %u %u %u PSN %x %x %x %x %x (%u %u %u %u %u %u) QP%u LID %x\n", | ||
| 1362 | iter->n, | ||
| 1363 | qp->ibqp.qp_num, | ||
| 1364 | qp_type_str[qp->ibqp.qp_type], | ||
| 1365 | qp->state, | ||
| 1366 | wqe->wr.opcode, | ||
| 1367 | qp->s_hdrwords, | ||
| 1368 | qp->s_flags, | ||
| 1369 | atomic_read(&qp->s_dma_busy), | ||
| 1370 | !list_empty(&qp->iowait), | ||
| 1371 | qp->timeout, | ||
| 1372 | wqe->ssn, | ||
| 1373 | qp->s_lsn, | ||
| 1374 | qp->s_last_psn, | ||
| 1375 | qp->s_psn, qp->s_next_psn, | ||
| 1376 | qp->s_sending_psn, qp->s_sending_hpsn, | ||
| 1377 | qp->s_last, qp->s_acked, qp->s_cur, | ||
| 1378 | qp->s_tail, qp->s_head, qp->s_size, | ||
| 1379 | qp->remote_qpn, | ||
| 1380 | qp->remote_ah_attr.dlid); | ||
| 1381 | } | ||
| 1382 | |||
| 1383 | #endif | ||
diff --git a/drivers/infiniband/hw/qib/qib_verbs.h b/drivers/infiniband/hw/qib/qib_verbs.h index 4a22a85b9f03..012e2c7575ad 100644 --- a/drivers/infiniband/hw/qib/qib_verbs.h +++ b/drivers/infiniband/hw/qib/qib_verbs.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2012 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2012, 2013 Intel Corporation. All rights reserved. |
| 3 | * Copyright (c) 2006 - 2012 QLogic Corporation. All rights reserved. | 3 | * Copyright (c) 2006 - 2012 QLogic Corporation. All rights reserved. |
| 4 | * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. | 4 | * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. |
| 5 | * | 5 | * |
| @@ -917,6 +917,18 @@ void qib_init_qpn_table(struct qib_devdata *dd, struct qib_qpn_table *qpt); | |||
| 917 | 917 | ||
| 918 | void qib_free_qpn_table(struct qib_qpn_table *qpt); | 918 | void qib_free_qpn_table(struct qib_qpn_table *qpt); |
| 919 | 919 | ||
| 920 | #ifdef CONFIG_DEBUG_FS | ||
| 921 | |||
| 922 | struct qib_qp_iter; | ||
| 923 | |||
| 924 | struct qib_qp_iter *qib_qp_iter_init(struct qib_ibdev *dev); | ||
| 925 | |||
| 926 | int qib_qp_iter_next(struct qib_qp_iter *iter); | ||
| 927 | |||
| 928 | void qib_qp_iter_print(struct seq_file *s, struct qib_qp_iter *iter); | ||
| 929 | |||
| 930 | #endif | ||
| 931 | |||
| 920 | void qib_get_credit(struct qib_qp *qp, u32 aeth); | 932 | void qib_get_credit(struct qib_qp *qp, u32 aeth); |
| 921 | 933 | ||
| 922 | unsigned qib_pkt_delay(u32 plen, u8 snd_mult, u8 rcv_mult); | 934 | unsigned qib_pkt_delay(u32 plen, u8 snd_mult, u8 rcv_mult); |
