mac80211: add queue debugfs file
authorJohannes Berg <johannes@sipsolutions.net>
Sun, 14 Jun 2009 15:37:39 +0000 (17:37 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 15 Jun 2009 19:05:57 +0000 (15:05 -0400)
I suspect that some driver bugs can cause queues to be
stopped while they shouldn't be, but it's hard to find
out whether that is the case or not without having any
visible information about the queues. This adds a file
to debugfs that allows us to see the queues' statuses.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/debugfs.c
net/mac80211/ieee80211_i.h

index 11c72311f35b559a7ddcc55e63b002071fffe2d2..6c439cd5ccea8b88e08f2bda65254b0170ba1004 100644 (file)
@@ -163,6 +163,29 @@ static const struct file_operations noack_ops = {
        .open = mac80211_open_file_generic
 };
 
+static ssize_t queues_read(struct file *file, char __user *user_buf,
+                          size_t count, loff_t *ppos)
+{
+       struct ieee80211_local *local = file->private_data;
+       unsigned long flags;
+       char buf[IEEE80211_MAX_QUEUES * 20];
+       int q, res = 0;
+
+       spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
+       for (q = 0; q < local->hw.queues; q++)
+               res += sprintf(buf + res, "%02d: %#.8lx/%d\n", q,
+                               local->queue_stop_reasons[q],
+                               __netif_subqueue_stopped(local->mdev, q));
+       spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
+
+       return simple_read_from_buffer(user_buf, count, ppos, buf, res);
+}
+
+static const struct file_operations queues_ops = {
+       .read = queues_read,
+       .open = mac80211_open_file_generic
+};
+
 /* statistics stuff */
 
 #define DEBUGFS_STATS_FILE(name, buflen, fmt, value...)                        \
@@ -298,6 +321,7 @@ void debugfs_hw_add(struct ieee80211_local *local)
        DEBUGFS_ADD(total_ps_buffered);
        DEBUGFS_ADD(wep_iv);
        DEBUGFS_ADD(tsf);
+       DEBUGFS_ADD(queues);
        DEBUGFS_ADD_MODE(reset, 0200);
        DEBUGFS_ADD(noack);
 
@@ -350,6 +374,7 @@ void debugfs_hw_del(struct ieee80211_local *local)
        DEBUGFS_DEL(total_ps_buffered);
        DEBUGFS_DEL(wep_iv);
        DEBUGFS_DEL(tsf);
+       DEBUGFS_DEL(queues);
        DEBUGFS_DEL(reset);
        DEBUGFS_DEL(noack);
 
index 4dbc289641962a1fddad9a520ed9d069a7bc00e6..f41fe1f1430cf5d7a5a768e3fef9e1b8ef124fab 100644 (file)
@@ -783,6 +783,7 @@ struct ieee80211_local {
                struct dentry *total_ps_buffered;
                struct dentry *wep_iv;
                struct dentry *tsf;
+               struct dentry *queues;
                struct dentry *reset;
                struct dentry *noack;
                struct dentry *statistics;