26 #include <linux/types.h>
27 #include <linux/kernel.h>
33 #include <linux/sched.h>
35 #include <linux/bitops.h>
36 #include <linux/module.h>
46 #define RCU_TREE_NONCORE
68 .open = rcubarrier_open,
74 #ifdef CONFIG_RCU_BOOST
76 static char convert_kthread_status(
unsigned int kthread_status)
80 return "SRWOY"[kthread_status];
109 #ifdef CONFIG_RCU_BOOST
112 convert_kthread_status(
per_cpu(rcu_cpu_kthread_status,
114 per_cpu(rcu_cpu_kthread_loops, rdp->
cpu) & 0xffff);
141 .open = rcudata_open,
147 static void print_one_rcu_data_csv(
struct seq_file *m,
struct rcu_data *rdp)
159 rdp->
dynticks->dynticks_nmi_nesting,
170 #ifdef CONFIG_RCU_BOOST
173 convert_kthread_status(
per_cpu(rcu_cpu_kthread_status,
181 static int show_rcudata_csv(
struct seq_file *m,
void *unused)
186 seq_puts(m,
"\"CPU\",\"Online?\",\"c\",\"g\",\"pq\",\"pq\",");
187 seq_puts(m,
"\"dt\",\"dt nesting\",\"dt NMI nesting\",\"df\",");
188 seq_puts(m,
"\"of\",\"qll\",\"ql\",\"qs\"");
189 #ifdef CONFIG_RCU_BOOST
192 seq_puts(m,
",\"b\",\"ci\",\"co\",\"ca\"\n");
208 .open = rcudata_csv_open,
214 #ifdef CONFIG_RCU_BOOST
216 static void print_one_rcu_node_boost(
struct seq_file *m,
struct rcu_node *rnp)
218 seq_printf(m,
"%d:%d tasks=%c%c%c%c kt=%c ntb=%lu neb=%lu nnb=%lu ",
223 "B."[!rnp->boost_tasks],
224 convert_kthread_status(rnp->boost_kthread_status),
225 rnp->n_tasks_boosted, rnp->n_exp_boosts,
226 rnp->n_normal_boosts);
228 (
int)(jiffies & 0xffff),
229 (
int)(rnp->boost_time & 0xffff));
230 seq_printf(m,
" balk: nt=%lu egt=%lu bt=%lu nb=%lu ny=%lu nos=%lu\n",
231 rnp->n_balk_blkd_tasks,
232 rnp->n_balk_exp_gp_tasks,
233 rnp->n_balk_boost_tasks,
234 rnp->n_balk_notblocked,
239 static int show_rcu_node_boost(
struct seq_file *m,
void *unused)
244 print_one_rcu_node_boost(m, rnp);
255 .open = rcu_node_boost_open,
264 static int rcu_boost_trace_create_file(
struct dentry *rcudir)
267 &rcu_node_boost_fops);
272 static int rcu_boost_trace_create_file(
struct dentry *rcudir)
286 seq_printf(m,
"%s: c=%lu g=%lu s=%d jfq=%ld j=%x ",
289 (
int)(jiffies & 0xffff));
290 seq_printf(m,
"nfqs=%lu/nfqsng=%lu(%lu) fqlh=%lu oqlen=%ld/%ld\n",
294 for (rnp = &rsp->
node[0]; rnp - &rsp->
node[0] < rcu_num_nodes; rnp++) {
295 if (rnp->
level != level) {
309 static int show_rcuhier(
struct seq_file *m,
void *unused)
314 print_one_rcu_state(m, rsp);
325 .open = rcuhier_open,
349 seq_printf(m,
"%s: completed=%ld gpnum=%lu age=%ld max=%ld\n",
350 rsp->
name, completed, gpnum, gpage, gpmax);
353 static int show_rcugp(
struct seq_file *m,
void *unused)
358 show_one_rcugp(m, rsp);
381 seq_printf(m,
"qsp=%ld rpq=%ld cbr=%ld cng=%ld ",
392 static int show_rcu_pending(
struct seq_file *m,
void *unused)
403 print_one_rcu_pending(m, rdp);
416 .open = rcu_pending_open,
422 static int show_rcutorture(
struct seq_file *m,
void *unused)
424 seq_printf(m,
"rcutorture test sequence: %lu %s\n",
427 seq_printf(m,
"rcutorture update version number: %lu\n",
439 .open = rcutorture_open,
445 static struct dentry *rcudir;
447 static int __init rcutree_trace_init(
void)
456 NULL, &rcubarrier_fops);
461 NULL, &rcudata_fops);
466 NULL, &rcudata_csv_fops);
470 if (rcu_boost_trace_create_file(rcudir))
478 NULL, &rcuhier_fops);
483 NULL, &rcu_pending_fops);
488 NULL, &rcutorture_fops);
497 static void __exit rcutree_trace_cleanup(
void)