aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMichael Wang <wangyun@linux.vnet.ibm.com>2012-09-20 08:51:05 +0800
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2012-11-08 11:50:16 -0800
commitd29200efa2ad7a1dc516a1048faf98dcc01b9fef (patch)
tree479df2431123bf27309da8f88ff3774ef931486c /kernel
parent878eda72e24d11e463a25b1dc7097a8d953f17cb (diff)
rcu: Optimize the 'rcudata.csv' for RCU trace
This patch implements the new 'rcudata.csv' interface under each rsp directory, by using the 'CPU units sequence reading', thus avoiding loss of tracing data. Signed-off-by: Michael Wang <wangyun@linux.vnet.ibm.com> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/rcutree_trace.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/kernel/rcutree_trace.c b/kernel/rcutree_trace.c
index a11522f62c7..e387a642632 100644
--- a/kernel/rcutree_trace.c
+++ b/kernel/rcutree_trace.c
@@ -267,6 +267,43 @@ static const struct file_operations rcudata_csv_fops = {
.release = single_release,
};
+static int new_show_rcudata_csv(struct seq_file *m, void *v)
+{
+ struct rcu_data *rdp = (struct rcu_data *)v;
+ if (cpumask_first(cpu_possible_mask) == rdp->cpu) {
+ seq_puts(m, "\"CPU\",\"Online?\",\"c\",\"g\",\"pq\",\"pq\",");
+ seq_puts(m, "\"dt\",\"dt nesting\",\"dt NMI nesting\",\"df\",");
+ seq_puts(m, "\"of\",\"qll\",\"ql\",\"qs\"");
+#ifdef CONFIG_RCU_BOOST
+ seq_puts(m, "\"kt\",\"ktl\"");
+#endif /* #ifdef CONFIG_RCU_BOOST */
+ seq_puts(m, ",\"b\",\"ci\",\"co\",\"ca\"\n");
+ }
+
+ print_one_rcu_data_csv(m, rdp);
+ return 0;
+}
+
+static const struct seq_operations new_rcudate_csv_op = {
+ .start = r_start,
+ .next = r_next,
+ .stop = r_stop,
+ .show = new_show_rcudata_csv,
+};
+
+static int new_rcudata_csv_open(struct inode *inode, struct file *file)
+{
+ return r_open(inode, file, &new_rcudate_csv_op);
+}
+
+static const struct file_operations new_rcudata_csv_fops = {
+ .owner = THIS_MODULE,
+ .open = new_rcudata_csv_open,
+ .read = seq_read,
+ .llseek = no_llseek,
+ .release = seq_release,
+};
+
#ifdef CONFIG_RCU_BOOST
static void print_one_rcu_node_boost(struct seq_file *m, struct rcu_node *rnp)
@@ -519,6 +556,11 @@ static int __init rcutree_trace_init(void)
rspdir, rsp, &new_rcudata_fops);
if (!retval)
goto free_out;
+
+ retval = debugfs_create_file("rcudata.csv", 0444,
+ rspdir, rsp, &new_rcudata_csv_fops);
+ if (!retval)
+ goto free_out;
}
retval = debugfs_create_file("rcubarrier", 0444, rcudir,