From: Stephen Hemminger <shemminger@vyatta.com>
To: David Miller <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Subject: [PATCH 1/3] fib_trie: move statistics to debugfs
Date: Wed, 13 Feb 2008 11:58:06 -0800 [thread overview]
Message-ID: <20080213195929.781366896@vyatta.com> (raw)
In-Reply-To: 20080213195805.493794050@vyatta.com
[-- Attachment #1: fib-trie-debugfs.patch --]
[-- Type: text/plain, Size: 7952 bytes --]
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 <shemminger@vyatta.com>
---
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 <shemminger@vyatta.com>
next prev parent reply other threads:[~2008-02-13 20:02 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-13 19:58 [PATCH 0/3] fib_trie: update (redo) Stephen Hemminger
2008-02-13 19:58 ` Stephen Hemminger [this message]
2008-02-18 6:26 ` [PATCH 1/3] fib_trie: move statistics to debugfs David Miller
2008-02-18 16:49 ` Stephen Hemminger
2008-02-13 19:58 ` [PATCH 2/3] fib_trie: improve output format for /proc/net/fib_trie Stephen Hemminger
2008-02-13 19:58 ` [PATCH 3/3] fib_trie: print statistics for multiple tables Stephen Hemminger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080213195929.781366896@vyatta.com \
--to=shemminger@vyatta.com \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).