mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: mingo@elte.hu, laijs@cn.fujitsu.com, dipankar@in.ibm.com,
	akpm@linux-foundation.org, mathieu.desnoyers@polymtl.ca,
	josh@joshtriplett.org, niv@us.ibm.com, tglx@linutronix.de,
	peterz@infradead.org, rostedt@goodmis.org,
	Valdis.Kletnieks@vt.edu, dhowells@redhat.com,
	eric.dumazet@gmail.com, darren@dvhart.com,
	"Paul E. McKenney" <paul.mckenney@linaro.org>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Subject: [PATCH RFC tip/core/rcu 14/14] rcu: Add boosting to TREE_PREEMPT_RCU tracing
Date: Tue, 22 Feb 2011 17:39:43 -0800	[thread overview]
Message-ID: <1298425183-21265-14-git-send-email-paulmck@linux.vnet.ibm.com> (raw)
In-Reply-To: <20110223013917.GA20996@linux.vnet.ibm.com>

From: Paul E. McKenney <paul.mckenney@linaro.org>

Includes total number of tasks boosted, number boosted on behalf of each
of normal and expedited grace periods, and statistics on attempts to
initiate boosting that failed for various reasons.

Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
---
 kernel/rcutree.h        |   19 +++++++++++
 kernel/rcutree_plugin.h |   37 ++++++++++++++++++++-
 kernel/rcutree_trace.c  |   82 +++++++++++++++++++++++++++++++++++++++++++---
 3 files changed, 130 insertions(+), 8 deletions(-)

diff --git a/kernel/rcutree.h b/kernel/rcutree.h
index 4c820a8..292fed7 100644
--- a/kernel/rcutree.h
+++ b/kernel/rcutree.h
@@ -152,6 +152,25 @@ struct rcu_node {
 	wait_queue_head_t boost_wq;
 				/* Wait queue on which to park the boost */
 				/*  kthread. */
+	unsigned long n_tasks_boosted;
+				/* Total number of tasks boosted. */
+	unsigned long n_exp_boosts;
+				/* Number of tasks boosted for expedited GP. */
+	unsigned long n_normal_boosts;
+				/* Number of tasks boosted for normal GP. */
+	unsigned long n_balk_blkd_tasks;
+				/* Refused to boost: no blocked tasks. */
+	unsigned long n_balk_exp_gp_tasks;
+				/* Refused to boost: nothing blocking GP. */
+	unsigned long n_balk_boost_tasks;
+				/* Refused to boost: already boosting. */
+	unsigned long n_balk_notblocked;
+				/* Refused to boost: RCU RS CS still running. */
+	unsigned long n_balk_notyet;
+				/* Refused to boost: not yet time. */
+	unsigned long n_balk_nos;
+				/* Refused to boost: not sure why, though. */
+				/*  This can happen due to race conditions. */
 #endif /* #ifdef CONFIG_RCU_BOOST */
 	struct task_struct *node_kthread_task;
 				/* kthread that takes care of this rcu_node */
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h
index 1242949..381f117 100644
--- a/kernel/rcutree_plugin.h
+++ b/kernel/rcutree_plugin.h
@@ -1071,6 +1071,33 @@ static void __init __rcu_init_preempt(void)
 
 #include "rtmutex_common.h"
 
+#ifdef CONFIG_RCU_TRACE
+
+static void rcu_initiate_boost_trace(struct rcu_node *rnp)
+{
+	if (list_empty(&rnp->blkd_tasks))
+		rnp->n_balk_blkd_tasks++;
+	else if (rnp->exp_tasks == NULL && rnp->gp_tasks == NULL)
+		rnp->n_balk_exp_gp_tasks++;
+	else if (rnp->gp_tasks != NULL && rnp->boost_tasks != NULL)
+		rnp->n_balk_boost_tasks++;
+	else if (rnp->gp_tasks != NULL && rnp->qsmask != 0)
+		rnp->n_balk_notblocked++;
+	else if (rnp->gp_tasks != NULL &&
+		 ULONG_CMP_GE(jiffies, rnp->boost_time))
+		rnp->n_balk_notyet++;
+	else
+		rnp->n_balk_nos++;
+}
+
+#else /* #ifdef CONFIG_RCU_TRACE */
+
+static void rcu_initiate_boost_trace(struct rcu_node *rnp)
+{
+}
+
+#endif /* #else #ifdef CONFIG_RCU_TRACE */
+
 /*
  * Carry out RCU priority boosting on the task indicated by ->exp_tasks
  * or ->boost_tasks, advancing the pointer to the next task in the
@@ -1106,10 +1133,14 @@ static int rcu_boost(struct rcu_node *rnp)
 	 * expedited grace period must boost all blocked tasks, including
 	 * those blocking the pre-existing normal grace period.
 	 */
-	if (rnp->exp_tasks != NULL)
+	if (rnp->exp_tasks != NULL) {
 		tb = rnp->exp_tasks;
-	else
+		rnp->n_exp_boosts++;
+	} else {
 		tb = rnp->boost_tasks;
+		rnp->n_normal_boosts++;
+	}
+	rnp->n_tasks_boosted++;
 
 	/*
 	 * We boost task t by manufacturing an rt_mutex that appears to
@@ -1209,6 +1240,8 @@ static void rcu_initiate_boost(struct rcu_node *rnp)
 		t = rnp->boost_kthread_task;
 		if (t != NULL)
 			wake_up_process(t);
+	} else {
+		rcu_initiate_boost_trace(rnp);
 	}
 }
 
diff --git a/kernel/rcutree_trace.c b/kernel/rcutree_trace.c
index 1cedf94..5a1554c 100644
--- a/kernel/rcutree_trace.c
+++ b/kernel/rcutree_trace.c
@@ -157,6 +157,72 @@ static const struct file_operations rcudata_csv_fops = {
 	.release = single_release,
 };
 
+#ifdef CONFIG_RCU_BOOST
+
+static void print_one_rcu_node_boost(struct seq_file *m, struct rcu_node *rnp)
+{
+	seq_printf(m,  "%d:%d tasks=%c%c%c%c ntb=%lu neb=%lu nnb=%lu "
+		   "j=%04x bt=%04x\n",
+		   rnp->grplo, rnp->grphi,
+		   "T."[list_empty(&rnp->blkd_tasks)],
+		   "N."[!rnp->gp_tasks],
+		   "E."[!rnp->exp_tasks],
+		   "B."[!rnp->boost_tasks],
+		   rnp->n_tasks_boosted, rnp->n_exp_boosts,
+		   rnp->n_normal_boosts,
+		   (int)(jiffies & 0xffff),
+		   (int)(rnp->boost_time & 0xffff));
+	seq_printf(m, "%s: nt=%lu egt=%lu bt=%lu nb=%lu ny=%lu nos=%lu\n",
+		   "     balk",
+		   rnp->n_balk_blkd_tasks,
+		   rnp->n_balk_exp_gp_tasks,
+		   rnp->n_balk_boost_tasks,
+		   rnp->n_balk_notblocked,
+		   rnp->n_balk_notyet,
+		   rnp->n_balk_nos);
+}
+
+static int show_rcu_node_boost(struct seq_file *m, void *unused)
+{
+	struct rcu_node *rnp;
+
+	rcu_for_each_leaf_node(rcu_preempt_state, rnp)
+		print_one_rcu_node_boost(m, rnp);
+	return 0;
+}
+
+static int rcu_node_boost_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, show_rcu_node_boost, NULL);
+}
+
+static const struct file_operations rcu_node_boost_fops = {
+	.owner = THIS_MODULE,
+	.open = rcu_node_boost_open,
+	.read = seq_read,
+	.llseek = seq_lseek,
+	.release = single_release,
+};
+
+/*
+ * Create the rcuboost debugfs entry.  Note that the return value
+ * is the standard zero for success, non-zero for failure.
+ */
+static int rcu_boost_trace_create_file(struct dentry *rcudir)
+{
+	return IS_ERR_VALUE(debugfs_create_file("rcuboost", 0444, rcudir, NULL,
+						&rcu_node_boost_fops));
+}
+
+#else /* #ifdef CONFIG_RCU_BOOST */
+
+static int rcu_boost_trace_create_file(struct dentry *rcudir)
+{
+	return 0;  /* There cannot be an error if we didn't create it! */
+}
+
+#endif /* #else #ifdef CONFIG_RCU_BOOST */
+
 static void print_one_rcu_state(struct seq_file *m, struct rcu_state *rsp)
 {
 	unsigned long gpnum;
@@ -302,31 +368,35 @@ static int __init rcutree_trace_init(void)
 	struct dentry *retval;
 
 	rcudir = debugfs_create_dir("rcu", NULL);
-	if (!rcudir)
+	if (IS_ERR_VALUE(rcudir))
 		goto free_out;
 
 	retval = debugfs_create_file("rcudata", 0444, rcudir,
 						NULL, &rcudata_fops);
-	if (!retval)
+	if (IS_ERR_VALUE(retval))
 		goto free_out;
 
 	retval = debugfs_create_file("rcudata.csv", 0444, rcudir,
 						NULL, &rcudata_csv_fops);
-	if (!retval)
+	if (IS_ERR_VALUE(retval))
+		goto free_out;
+
+	retval = rcu_boost_trace_create_file(rcudir);
+	if (retval)
 		goto free_out;
 
 	retval = debugfs_create_file("rcugp", 0444, rcudir, NULL, &rcugp_fops);
-	if (!retval)
+	if (IS_ERR_VALUE(retval))
 		goto free_out;
 
 	retval = debugfs_create_file("rcuhier", 0444, rcudir,
 						NULL, &rcuhier_fops);
-	if (!retval)
+	if (IS_ERR_VALUE(retval))
 		goto free_out;
 
 	retval = debugfs_create_file("rcu_pending", 0444, rcudir,
 						NULL, &rcu_pending_fops);
-	if (!retval)
+	if (IS_ERR_VALUE(retval))
 		goto free_out;
 	return 0;
 free_out:
-- 
1.7.3.2


  parent reply	other threads:[~2011-02-23  1:39 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-23  1:39 [PATCH tip/core/rcu 0/14] Preview of RCU patches for 2.6.39 Paul E. McKenney
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 01/11] rcu: call __rcu_read_unlock() in exit_rcu for tiny RCU Paul E. McKenney
2011-02-25  8:29   ` Lai Jiangshan
2011-02-25 19:40     ` Paul E. McKenney
2011-03-24  3:45       ` Lai Jiangshan
2011-03-24 13:07         ` Paul E. McKenney
2011-03-25  2:30           ` Paul E. McKenney
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 02/11] rcutorture: Get rid of duplicate sched.h include Paul E. McKenney
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 03/11] rcu: add documentation saying which RCU flavor to choose Paul E. McKenney
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 04/11] rcupdate: remove dead code Paul E. McKenney
2011-02-23 14:36   ` Mathieu Desnoyers
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 05/11] rcu: add comment saying why DEBUG_OBJECTS_RCU_HEAD depends on PREEMPT Paul E. McKenney
2011-02-23  3:23   ` Steven Rostedt
2011-02-23 13:59     ` Mathieu Desnoyers
     [not found]     ` <BLU0-SMTP615CB0BE0A2623EF62925096DB0@phx.gbl>
2011-02-23 14:11       ` Steven Rostedt
2011-02-23 14:37         ` Mathieu Desnoyers
2011-02-23 14:55       ` Steven Rostedt
2011-02-23 15:02         ` Mathieu Desnoyers
2011-02-23 15:13         ` [PATCH] debug rcu head support !PREEMPT config Mathieu Desnoyers
     [not found]         ` <BLU0-SMTP1519908E0ACAEE1384F71896DB0@phx.gbl>
2011-02-23 15:27           ` Steven Rostedt
2011-02-23 15:37             ` Mathieu Desnoyers
     [not found]             ` <BLU0-SMTP42770DC9BDE561B962274096DB0@phx.gbl>
2011-02-23 18:31               ` Paul E. McKenney
2011-02-23 18:40                 ` Mathieu Desnoyers
     [not found]         ` <BLU0-SMTP900C4ABCF4001FBCB1594696DB0@phx.gbl>
2011-02-23 17:49           ` Paul E. McKenney
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 06/11] smp: Document transitivity for memory barriers Paul E. McKenney
2011-02-23  3:29   ` Steven Rostedt
2011-02-23  6:21     ` Lai Jiangshan
2011-02-23 15:14       ` Paul E. McKenney
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 07/11] rcu: Remove conditional compilation for RCU CPU stall warnings Paul E. McKenney
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 08/11] rcu: Decrease memory-barrier usage based on semi-formal proof Paul E. McKenney
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 09/11] rcu: merge TREE_PREEPT_RCU blocked_tasks[] lists Paul E. McKenney
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 10/11] rcu: Update documentation to reflect blocked_tasks[] merge Paul E. McKenney
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 11/11] rcu: move TREE_RCU from softirq to kthread Paul E. McKenney
2011-02-23  2:44   ` Frederic Weisbecker
2011-02-23 15:11     ` Paul E. McKenney
2011-02-23  3:09   ` Frederic Weisbecker
2011-02-23 15:12     ` Paul E. McKenney
2011-02-23 14:02   ` Mathieu Desnoyers
     [not found]   ` <BLU0-SMTP211F39903EDACD9B7E025C96DB0@phx.gbl>
2011-02-23 14:42     ` Steven Rostedt
2011-02-23 16:16   ` Frederic Weisbecker
2011-02-23 16:41     ` Steven Rostedt
2011-02-23 17:03       ` Mathieu Desnoyers
2011-02-23 17:14       ` Frederic Weisbecker
     [not found]       ` <BLU0-SMTP5642728A153E83B94895F896DB0@phx.gbl>
2011-02-23 17:30         ` Frederic Weisbecker
     [not found]       ` <BLU0-SMTP65F733B8D1D704C7EA1F8796DB0@phx.gbl>
2011-02-23 17:34         ` Christoph Lameter
2011-02-23 18:17           ` Steven Rostedt
2011-02-23 18:29             ` Christoph Lameter
2011-02-23 18:32               ` Steven Rostedt
2011-02-23 19:19                 ` Christoph Lameter
2011-02-23 19:23                   ` Peter Zijlstra
2011-02-23 19:35                     ` Steven Rostedt
2011-02-23 19:40                     ` Christoph Lameter
2011-02-23 20:15                     ` Paul E. McKenney
2011-02-23 19:16               ` Paul E. McKenney
2011-02-23 19:24                 ` Christoph Lameter
2011-02-23 20:45                   ` Paul E. McKenney
2011-02-23 18:38             ` Mathieu Desnoyers
2011-02-23 18:27           ` Mathieu Desnoyers
2011-02-23 19:10           ` Paul E. McKenney
2011-02-23 19:22             ` Christoph Lameter
2011-02-23 19:39               ` Paul E. McKenney
2011-02-23 16:50   ` Frederic Weisbecker
2011-02-23 19:06     ` Paul E. McKenney
2011-02-23 19:13       ` Frederic Weisbecker
2011-02-23 20:41         ` Paul E. McKenney
     [not found]   ` <BLU0-SMTP57EE20F30B92B8763FD2FE96DB0@phx.gbl>
2011-02-23 18:52     ` Paul E. McKenney
2011-02-25  8:17   ` Lai Jiangshan
2011-02-25 20:32     ` Paul E. McKenney
2011-02-28  3:29       ` Lai Jiangshan
2011-02-28  9:47         ` Peter Zijlstra
2011-03-01  0:13           ` Paul E. McKenney
2011-03-01 14:38             ` Peter Zijlstra
2011-03-02  0:07               ` Paul E. McKenney
2011-03-02 22:41                 ` Paul E. McKenney
2011-02-28 23:51         ` Paul E. McKenney
2011-03-02  1:52           ` Lai Jiangshan
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 12/14] rcu: priority boosting for TREE_PREEMPT_RCU Paul E. McKenney
2011-02-23  1:39 ` [PATCH RFC tip/core/rcu 13/14] rcu: eliminate unused boosting statistics Paul E. McKenney
2011-02-23  1:39 ` Paul E. McKenney [this message]
2011-02-23  3:07   ` [PATCH RFC tip/core/rcu 14/14] rcu: Add boosting to TREE_PREEMPT_RCU tracing Lai Jiangshan
2011-02-23 16:31     ` Paul E. McKenney

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=1298425183-21265-14-git-send-email-paulmck@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=Valdis.Kletnieks@vt.edu \
    --cc=akpm@linux-foundation.org \
    --cc=darren@dvhart.com \
    --cc=dhowells@redhat.com \
    --cc=dipankar@in.ibm.com \
    --cc=eric.dumazet@gmail.com \
    --cc=josh@joshtriplett.org \
    --cc=laijs@cn.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@polymtl.ca \
    --cc=mingo@elte.hu \
    --cc=niv@us.ibm.com \
    --cc=paul.mckenney@linaro.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    /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

all inboxes | Powered by JetHome®