From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758476AbbIDMLo (ORCPT ); Fri, 4 Sep 2015 08:11:44 -0400 Received: from mx2.suse.de ([195.135.220.15]:33426 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752966AbbIDMLm (ORCPT ); Fri, 4 Sep 2015 08:11:42 -0400 From: Petr Mladek To: "Paul E. McKenney" , Josh Triplett Cc: Steven Rostedt , Mathieu Desnoyers , Lai Jiangshan , Jiri Kosina , linux-kernel@vger.kernel.org, Petr Mladek Subject: [PATCH 1/2] rcu: Show the real fqs_state Date: Fri, 4 Sep 2015 14:11:29 +0200 Message-Id: <1441368690-32345-2-git-send-email-pmladek@suse.com> X-Mailer: git-send-email 1.8.5.6 In-Reply-To: <1441368690-32345-1-git-send-email-pmladek@suse.com> References: <1441368690-32345-1-git-send-email-pmladek@suse.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The value of "fqs_state" in struct rcu_state is always RCU_GP_IDLE. The real state is stored in a local variable in rcu_gp_kthread(). It is modified by rcu_gp_fqs() via parameter and return value. But the actual value is never stored to rsp->fqs_state. The result is that print_one_rcu_state() does not show the real state. This code has been added 3 years ago by the commit 4cdfc175c25c89ee ("rcu: Move quiescent-state forcing into kthread"). I guess that it was an overlook or optimization. Anyway, the value seems to be manipulated only by the thread, except for shoving the status. I do not see any risk in updating it directly in the struct. Signed-off-by: Petr Mladek --- kernel/rcu/tree.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 9f75f25cc5d9..54af8d5f9f7b 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -1927,16 +1927,15 @@ static bool rcu_gp_fqs_check_wake(struct rcu_state *rsp, int *gfp) /* * Do one round of quiescent-state forcing. */ -static int rcu_gp_fqs(struct rcu_state *rsp, int fqs_state_in) +static void rcu_gp_fqs(struct rcu_state *rsp) { - int fqs_state = fqs_state_in; bool isidle = false; unsigned long maxj; struct rcu_node *rnp = rcu_get_root(rsp); WRITE_ONCE(rsp->gp_activity, jiffies); rsp->n_force_qs++; - if (fqs_state == RCU_SAVE_DYNTICK) { + if (rsp->fqs_state == RCU_SAVE_DYNTICK) { /* Collect dyntick-idle snapshots. */ if (is_sysidle_rcu_state(rsp)) { isidle = true; @@ -1945,7 +1944,7 @@ static int rcu_gp_fqs(struct rcu_state *rsp, int fqs_state_in) force_qs_rnp(rsp, dyntick_save_progress_counter, &isidle, &maxj); rcu_sysidle_report_gp(rsp, isidle, maxj); - fqs_state = RCU_FORCE_QS; + rsp->fqs_state = RCU_FORCE_QS; } else { /* Handle dyntick-idle and offline CPUs. */ isidle = true; @@ -1959,7 +1958,6 @@ static int rcu_gp_fqs(struct rcu_state *rsp, int fqs_state_in) READ_ONCE(rsp->gp_flags) & ~RCU_GP_FLAG_FQS); raw_spin_unlock_irq(&rnp->lock); } - return fqs_state; } /* @@ -2041,7 +2039,6 @@ static void rcu_gp_cleanup(struct rcu_state *rsp) */ static int __noreturn rcu_gp_kthread(void *arg) { - int fqs_state; int gf; unsigned long j; int ret; @@ -2073,7 +2070,7 @@ static int __noreturn rcu_gp_kthread(void *arg) } /* Handle quiescent-state forcing. */ - fqs_state = RCU_SAVE_DYNTICK; + rsp->fqs_state = RCU_SAVE_DYNTICK; j = jiffies_till_first_fqs; if (j > HZ) { j = HZ; @@ -2101,7 +2098,7 @@ static int __noreturn rcu_gp_kthread(void *arg) trace_rcu_grace_period(rsp->name, READ_ONCE(rsp->gpnum), TPS("fqsstart")); - fqs_state = rcu_gp_fqs(rsp, fqs_state); + rcu_gp_fqs(rsp); trace_rcu_grace_period(rsp->name, READ_ONCE(rsp->gpnum), TPS("fqsend")); -- 1.8.5.6