Don't want /proc/net/fib_trie and /proc/net/fib_triestat to become
permanent kernel space ABI issues, so move to the safer confines of debugfs.

Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]>

---
 net/ipv4/Kconfig    |    9 ++-
 net/ipv4/fib_trie.c |  127 +++++++++++++++++++++++++++++++++-------------------
 2 files changed, 86 insertions(+), 50 deletions(-)

--- a/net/ipv4/Kconfig  2008-02-13 10:58:51.000000000 -0800
+++ b/net/ipv4/Kconfig  2008-02-13 10:59:06.000000000 -0800
@@ -85,11 +85,12 @@ endchoice
 config IP_FIB_HASH
        def_bool ASK_IP_FIB_HASH || !IP_ADVANCED_ROUTER
 
-config IP_FIB_TRIE_STATS
-       bool "FIB TRIE statistics"
-       depends on IP_FIB_TRIE
+config IP_FIB_TRIE_DEBUG
+       bool "FIB TRIE debugging information"
+       depends on IP_FIB_TRIE && DEBUG_FS
        ---help---
-         Keep track of statistics on structure of FIB TRIE table.
+         Provides interface for looking at internal structure, and
+         statistics on for the  FIB TRIE table.
          Useful for testing and measuring TRIE performance.
 
 config IP_MULTIPLE_TABLES
--- a/net/ipv4/fib_trie.c       2008-02-13 10:58:51.000000000 -0800
+++ b/net/ipv4/fib_trie.c       2008-02-13 11:33:43.000000000 -0800
@@ -68,6 +68,7 @@
 #include <linux/netdevice.h>
 #include <linux/if_arp.h>
 #include <linux/proc_fs.h>
+#include <linux/debugfs.h>
 #include <linux/rcupdate.h>
 #include <linux/skbuff.h>
 #include <linux/netlink.h>
@@ -126,7 +127,8 @@ struct tnode {
        struct node *child[0];
 };
 
-#ifdef CONFIG_IP_FIB_TRIE_STATS
+#ifdef CONFIG_IP_FIB_TRIE_DEBUG
+
 struct trie_use_stats {
        unsigned int gets;
        unsigned int backtrack;
@@ -135,7 +137,6 @@ struct trie_use_stats {
        unsigned int null_node_hit;
        unsigned int resize_node_skipped;
 };
-#endif
 
 struct trie_stat {
        unsigned int totdepth;
@@ -146,10 +147,11 @@ struct trie_stat {
        unsigned int prefixes;
        unsigned int nodesizes[MAX_STAT_DEPTH];
 };
+#endif
 
 struct trie {
        struct node *trie;
-#ifdef CONFIG_IP_FIB_TRIE_STATS
+#ifdef CONFIG_IP_FIB_TRIE_DEBUG
        struct trie_use_stats stats;
 #endif
 };
@@ -588,7 +590,7 @@ static struct node *resize(struct trie *
 
                if (IS_ERR(tn)) {
                        tn = old_tn;
-#ifdef CONFIG_IP_FIB_TRIE_STATS
+#ifdef CONFIG_IP_FIB_TRIE_DEBUG
                        t->stats.resize_node_skipped++;
 #endif
                        break;
@@ -631,7 +633,7 @@ static struct node *resize(struct trie *
                tn = halve(t, tn);
                if (IS_ERR(tn)) {
                        tn = old_tn;
-#ifdef CONFIG_IP_FIB_TRIE_STATS
+#ifdef CONFIG_IP_FIB_TRIE_DEBUG
                        t->stats.resize_node_skipped++;
 #endif
                        break;
@@ -1341,7 +1343,7 @@ static int check_leaf(struct trie *t, st
                err = fib_semantic_match(&li->falh, flp, res,
                                         htonl(l->key), mask, plen);
 
-#ifdef CONFIG_IP_FIB_TRIE_STATS
+#ifdef CONFIG_IP_FIB_TRIE_DEBUG
                if (err <= 0)
                        t->stats.semantic_match_passed++;
                else
@@ -1376,7 +1378,7 @@ static int fn_trie_lookup(struct fib_tab
        if (!n)
                goto failed;
 
-#ifdef CONFIG_IP_FIB_TRIE_STATS
+#ifdef CONFIG_IP_FIB_TRIE_DEBUG
        t->stats.gets++;
 #endif
 
@@ -1403,7 +1405,7 @@ static int fn_trie_lookup(struct fib_tab
                n = tnode_get_child(pn, cindex);
 
                if (n == NULL) {
-#ifdef CONFIG_IP_FIB_TRIE_STATS
+#ifdef CONFIG_IP_FIB_TRIE_DEBUG
                        t->stats.null_node_hit++;
 #endif
                        goto backtrace;
@@ -1546,7 +1548,7 @@ backtrace:
                        pn = parent;
                        chopped_off = 0;
 
-#ifdef CONFIG_IP_FIB_TRIE_STATS
+#ifdef CONFIG_IP_FIB_TRIE_DEBUG
                        t->stats.backtrack++;
 #endif
                        goto backtrace;
@@ -2022,7 +2024,8 @@ struct fib_table *fib_hash_table(u32 id)
        return tb;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_IP_FIB_TRIE_DEBUG
+
 /* Depth first Trie walk iterator */
 struct fib_trie_iter {
        struct seq_net_private p;
@@ -2147,7 +2150,7 @@ static void trie_collect_stats(struct tr
 }
 
 /*
- *     This outputs /proc/net/fib_triestats
+ *     This outputs debugfs/fib/triestats
  */
 static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat)
 {
@@ -2189,7 +2192,6 @@ static void trie_show_stats(struct seq_f
        seq_printf(seq, "Total size: %u  kB\n", (bytes + 1023) / 1024);
 }
 
-#ifdef CONFIG_IP_FIB_TRIE_STATS
 static void trie_show_usage(struct seq_file *seq,
                            const struct trie_use_stats *stats)
 {
@@ -2204,7 +2206,7 @@ static void trie_show_usage(struct seq_f
        seq_printf(seq, "skipped node resize = %u\n\n",
                   stats->resize_node_skipped);
 }
-#endif /*  CONFIG_IP_FIB_TRIE_STATS */
+
 
 static void fib_trie_show(struct seq_file *seq, const char *name,
                          struct trie *trie)
@@ -2214,9 +2216,7 @@ static void fib_trie_show(struct seq_fil
        trie_collect_stats(trie, &stat);
        seq_printf(seq, "%s:\n", name);
        trie_show_stats(seq, &stat);
-#ifdef CONFIG_IP_FIB_TRIE_STATS
        trie_show_usage(seq, &trie->stats);
-#endif
 }
 
 static int fib_triestat_seq_show(struct seq_file *seq, void *v)
@@ -2242,18 +2242,12 @@ static int fib_triestat_seq_show(struct 
 
 static int fib_triestat_seq_open(struct inode *inode, struct file *file)
 {
-       int err;
-       struct net *net;
+       struct net *net = maybe_get_net((struct net *)inode->i_private);
 
-       net = get_proc_net(inode);
-       if (net == NULL)
+       if (!net)
                return -ENXIO;
-       err = single_open(file, fib_triestat_seq_show, net);
-       if (err < 0) {
-               put_net(net);
-               return err;
-       }
-       return 0;
+
+       return single_open(file, fib_triestat_seq_show, net);
 }
 
 static int fib_triestat_seq_release(struct inode *ino, struct file *f)
@@ -2447,8 +2441,19 @@ static const struct seq_operations fib_t
 
 static int fib_trie_seq_open(struct inode *inode, struct file *file)
 {
-       return seq_open_net(inode, file, &fib_trie_seq_ops,
-                           sizeof(struct fib_trie_iter));
+       struct net *net = maybe_get_net((struct net *)inode->i_private);
+       struct fib_trie_iter *iter;
+
+       if (!net)
+               return -ENXIO;
+
+       iter = __seq_open_private(file, &fib_trie_seq_ops, sizeof(*iter));
+       if (!iter) {
+               put_net(net);
+               return -ENOMEM;
+       }
+       iter->p.net = net;
+       return 0;
 }
 
 static const struct file_operations fib_trie_fops = {
@@ -2459,6 +2464,51 @@ static const struct file_operations fib_
        .release = seq_release_net,
 };
 
+
+static struct dentry *fib_debug, *trie_debug, *triestat_debug;
+
+static void __net_init trie_debug_init(struct net *net)
+{
+       fib_debug = debugfs_create_dir("fib", NULL);
+       if (!fib_debug || IS_ERR(fib_debug))
+               goto out1;
+
+       trie_debug = debugfs_create_file("trie", S_IRUGO, fib_debug,
+                                        net, &fib_trie_fops);
+       if (!trie_debug || IS_ERR(trie_debug))
+               goto out2;
+
+       triestat_debug = debugfs_create_file("triestat", S_IRUGO, fib_debug,
+                                            net, &fib_triestat_fops);
+       if (!triestat_debug || IS_ERR(triestat_debug))
+               goto out3;
+
+       hold_net(net);
+       return;
+out3:
+       debugfs_remove(trie_debug);
+out2:
+       debugfs_remove(fib_debug);
+out1:
+       fib_debug = NULL;
+}
+
+static void __net_exit trie_debug_exit(struct net *net)
+{
+       if (!fib_debug)
+               return;
+
+       debugfs_remove(trie_debug);
+       debugfs_remove(triestat_debug);
+       debugfs_remove(fib_debug);
+       put_net(net);
+}
+#else
+#define trie_debug_init(n)
+#define trie_debug_exit(n)
+#endif
+
+#ifdef CONFIG_PROC_FS
 struct fib_route_iter {
        struct seq_net_private p;
        struct trie *main_trie;
@@ -2632,34 +2682,19 @@ static const struct file_operations fib_
        .llseek = seq_lseek,
        .release = seq_release_net,
 };
+#endif /* CONFIG_PROC_FS */
 
 int __net_init fib_proc_init(struct net *net)
 {
-       if (!proc_net_fops_create(net, "fib_trie", S_IRUGO, &fib_trie_fops))
-               goto out1;
-
-       if (!proc_net_fops_create(net, "fib_triestat", S_IRUGO,
-                                 &fib_triestat_fops))
-               goto out2;
-
        if (!proc_net_fops_create(net, "route", S_IRUGO, &fib_route_fops))
-               goto out3;
+               return -ENOMEM;
 
+       trie_debug_init(net);
        return 0;
-
-out3:
-       proc_net_remove(net, "fib_triestat");
-out2:
-       proc_net_remove(net, "fib_trie");
-out1:
-       return -ENOMEM;
 }
 
 void __net_exit fib_proc_exit(struct net *net)
 {
-       proc_net_remove(net, "fib_trie");
-       proc_net_remove(net, "fib_triestat");
        proc_net_remove(net, "route");
+       trie_debug_exit(net);
 }
-
-#endif /* CONFIG_PROC_FS */

-- 
Stephen Hemminger <[EMAIL PROTECTED]>

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to