[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210716054113.1244529-1-senozhatsky@chromium.org>
Date: Fri, 16 Jul 2021 14:41:13 +0900
From: Sergey Senozhatsky <senozhatsky@...omium.org>
To: "Paul E. McKenney" <paulmck@...nel.org>,
Steven Rostedt <rostedt@...dmis.org>,
Mathieu Desnoyers <mathieu.desnoyers@...icios.com>,
Lai Jiangshan <jiangshanlai@...il.com>,
Joel Fernandes <joel@...lfernandes.org>
Cc: Suleiman Souhlal <suleiman@...gle.com>, rcu@...r.kernel.org,
linux-kernel@...r.kernel.org,
Sergey Senozhatsky <senozhatsky@...omium.org>
Subject: [RFC PATCH] rcu: call kvm_check_and_clear_guest_paused unconditionally
Do not call kvm_check_and_clear_guest_paused() only from the
stall branch (which requires an active grace period in the
first place), but instead handle PVCLOCK_GUEST_STOPPED as
early as possible.
pvclock_touch_watchdogs() touches various watchdogs, which
have different timeouts, so the earlier we handle stopped
VCPU the better (lockup watchdog does the same).
Signed-off-by: Sergey Senozhatsky <senozhatsky@...omium.org>
---
diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h
index 677ee3d8671b..5dd6ea2ead0c 100644
--- a/kernel/rcu/tree_stall.h
+++ b/kernel/rcu/tree_stall.h
@@ -657,6 +657,13 @@ static void check_cpu_stall(struct rcu_data *rdp)
unsigned long js;
struct rcu_node *rnp;
+ /*
+ * If a virtual machine is stopped by the host it can look to
+ * the watchdog like an RCU stall. Check to see if the host
+ * stopped the vm.
+ */
+ kvm_check_and_clear_guest_paused();
+
lockdep_assert_irqs_disabled();
if ((rcu_stall_is_suppressed() && !READ_ONCE(rcu_kick_kthreads)) ||
!rcu_gp_in_progress())
@@ -699,14 +706,6 @@ static void check_cpu_stall(struct rcu_data *rdp)
(READ_ONCE(rnp->qsmask) & rdp->grpmask) &&
cmpxchg(&rcu_state.jiffies_stall, js, jn) == js) {
- /*
- * If a virtual machine is stopped by the host it can look to
- * the watchdog like an RCU stall. Check to see if the host
- * stopped the vm.
- */
- if (kvm_check_and_clear_guest_paused())
- return;
-
/* We haven't checked in, so go dump stack. */
print_cpu_stall(gps);
if (READ_ONCE(rcu_cpu_stall_ftrace_dump))
@@ -717,14 +716,6 @@ static void check_cpu_stall(struct rcu_data *rdp)
ULONG_CMP_GE(j, js + RCU_STALL_RAT_DELAY) &&
cmpxchg(&rcu_state.jiffies_stall, js, jn) == js) {
- /*
- * If a virtual machine is stopped by the host it can look to
- * the watchdog like an RCU stall. Check to see if the host
- * stopped the vm.
- */
- if (kvm_check_and_clear_guest_paused())
- return;
-
/* They had a few time units to dump stack, so complain. */
print_other_cpu_stall(gs2, gps);
if (READ_ONCE(rcu_cpu_stall_ftrace_dump))
--
2.32.0.402.g57bb445576-goog
Powered by blists - more mailing lists