IB/qib: Add per-context stats interface
authorMike Marciniszyn <mike.marciniszyn@intel.com>
Sat, 15 Jun 2013 21:07:09 +0000 (17:07 -0400)
committerRoland Dreier <roland@purestorage.com>
Sat, 22 Jun 2013 00:19:51 +0000 (17:19 -0700)
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>
drivers/infiniband/hw/qib/qib_debugfs.c

index 47d01164cc914a7aaf41d28e4ae1eb1ac2c909f8..a4e6ee154f194b8388e1a34dfaaab011cfb768cd 100644 (file)
@@ -126,6 +126,68 @@ static int _opcode_stats_seq_show(struct seq_file *s, void *v)
 
 DEBUGFS_FILE(opcode_stats)
 
 
 DEBUGFS_FILE(opcode_stats)
 
+static void *_ctx_stats_seq_start(struct seq_file *s, loff_t *pos)
+{
+       struct qib_ibdev *ibd = (struct qib_ibdev *)s->private;
+       struct qib_devdata *dd = dd_from_dev(ibd);
+
+       if (!*pos)
+               return SEQ_START_TOKEN;
+       if (*pos >= dd->first_user_ctxt)
+               return NULL;
+       return pos;
+}
+
+static void *_ctx_stats_seq_next(struct seq_file *s, void *v, loff_t *pos)
+{
+       struct qib_ibdev *ibd = (struct qib_ibdev *)s->private;
+       struct qib_devdata *dd = dd_from_dev(ibd);
+
+       if (v == SEQ_START_TOKEN)
+               return pos;
+
+       ++*pos;
+       if (*pos >= dd->first_user_ctxt)
+               return NULL;
+       return pos;
+}
+
+static void _ctx_stats_seq_stop(struct seq_file *s, void *v)
+{
+       /* nothing allocated */
+}
+
+static int _ctx_stats_seq_show(struct seq_file *s, void *v)
+{
+       loff_t *spos;
+       loff_t i, j;
+       u64 n_packets = 0;
+       struct qib_ibdev *ibd = (struct qib_ibdev *)s->private;
+       struct qib_devdata *dd = dd_from_dev(ibd);
+
+       if (v == SEQ_START_TOKEN) {
+               seq_puts(s, "Ctx:npkts\n");
+               return 0;
+       }
+
+       spos = v;
+       i = *spos;
+
+       if (!dd->rcd[i])
+               return SEQ_SKIP;
+
+       for (j = 0; j < ARRAY_SIZE(dd->rcd[i]->opstats->stats); j++)
+               n_packets += dd->rcd[i]->opstats->stats[j].n_packets;
+
+       if (!n_packets)
+               return SEQ_SKIP;
+
+       seq_printf(s, "  %llu:%llu\n", i, n_packets);
+       return 0;
+}
+
+DEBUGFS_FILE(ctx_stats)
+
 void qib_dbg_ibdev_init(struct qib_ibdev *ibd)
 {
        char name[10];
 void qib_dbg_ibdev_init(struct qib_ibdev *ibd)
 {
        char name[10];
@@ -137,6 +199,7 @@ void qib_dbg_ibdev_init(struct qib_ibdev *ibd)
                return;
        }
        DEBUGFS_FILE_CREATE(opcode_stats);
                return;
        }
        DEBUGFS_FILE_CREATE(opcode_stats);
+       DEBUGFS_FILE_CREATE(ctx_stats);
        return;
 }
 
        return;
 }