2023-07-24 03:43:33

by Leizhen (ThunderTown)

[permalink] [raw]
Subject: [PATCH v2 1/1] rcu: Simplify check_cpu_stall()

From: Zhen Lei <[email protected]>

The code and comments of self detected and other detected are the same
except the output function. Combine the same parts to avoid duplication.

Signed-off-by: Zhen Lei <[email protected]>
---
kernel/rcu/tree_stall.h | 42 +++++++++++++++--------------------------
1 file changed, 15 insertions(+), 27 deletions(-)

diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h
index cc884cd49e026a3..b45d7e49944cdd7 100644
--- a/kernel/rcu/tree_stall.h
+++ b/kernel/rcu/tree_stall.h
@@ -711,7 +711,7 @@ static void print_cpu_stall(unsigned long gps)

static void check_cpu_stall(struct rcu_data *rdp)
{
- bool didstall = false;
+ bool self_detected;
unsigned long gs1;
unsigned long gs2;
unsigned long gps;
@@ -758,10 +758,10 @@ static void check_cpu_stall(struct rcu_data *rdp)
return; /* No stall or GP completed since entering function. */
rnp = rdp->mynode;
jn = jiffies + ULONG_MAX / 2;
+ self_detected = READ_ONCE(rnp->qsmask) & rdp->grpmask;
if (rcu_gp_in_progress() &&
- (READ_ONCE(rnp->qsmask) & rdp->grpmask) &&
+ (self_detected || 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
@@ -770,33 +770,21 @@ static void check_cpu_stall(struct rcu_data *rdp)
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))
- rcu_ftrace_dump(DUMP_ALL);
- didstall = true;
-
- } else if (rcu_gp_in_progress() &&
- 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;
+ if (self_detected) {
+ /* We haven't checked in, so go dump stack. */
+ print_cpu_stall(gps);
+ } else {
+ /* They had a few time units to dump stack, so complain. */
+ print_other_cpu_stall(gs2, gps);
+ }

- /* 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))
rcu_ftrace_dump(DUMP_ALL);
- didstall = true;
- }
- if (didstall && READ_ONCE(rcu_state.jiffies_stall) == jn) {
- jn = jiffies + 3 * rcu_jiffies_till_stall_check() + 3;
- WRITE_ONCE(rcu_state.jiffies_stall, jn);
+
+ if (READ_ONCE(rcu_state.jiffies_stall) == jn) {
+ jn = jiffies + 3 * rcu_jiffies_till_stall_check() + 3;
+ WRITE_ONCE(rcu_state.jiffies_stall, jn);
+ }
}
}

--
2.25.1



2023-07-24 20:56:22

by Paul E. McKenney

[permalink] [raw]
Subject: Re: [PATCH v2 1/1] rcu: Simplify check_cpu_stall()

On Mon, Jul 24, 2023 at 10:26:51AM +0800, [email protected] wrote:
> From: Zhen Lei <[email protected]>
>
> The code and comments of self detected and other detected are the same
> except the output function. Combine the same parts to avoid duplication.
>
> Signed-off-by: Zhen Lei <[email protected]>

Queued and pushed, thank you!!!

Thanx, Paul

> ---
> kernel/rcu/tree_stall.h | 42 +++++++++++++++--------------------------
> 1 file changed, 15 insertions(+), 27 deletions(-)
>
> diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h
> index cc884cd49e026a3..b45d7e49944cdd7 100644
> --- a/kernel/rcu/tree_stall.h
> +++ b/kernel/rcu/tree_stall.h
> @@ -711,7 +711,7 @@ static void print_cpu_stall(unsigned long gps)
>
> static void check_cpu_stall(struct rcu_data *rdp)
> {
> - bool didstall = false;
> + bool self_detected;
> unsigned long gs1;
> unsigned long gs2;
> unsigned long gps;
> @@ -758,10 +758,10 @@ static void check_cpu_stall(struct rcu_data *rdp)
> return; /* No stall or GP completed since entering function. */
> rnp = rdp->mynode;
> jn = jiffies + ULONG_MAX / 2;
> + self_detected = READ_ONCE(rnp->qsmask) & rdp->grpmask;
> if (rcu_gp_in_progress() &&
> - (READ_ONCE(rnp->qsmask) & rdp->grpmask) &&
> + (self_detected || 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
> @@ -770,33 +770,21 @@ static void check_cpu_stall(struct rcu_data *rdp)
> 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))
> - rcu_ftrace_dump(DUMP_ALL);
> - didstall = true;
> -
> - } else if (rcu_gp_in_progress() &&
> - 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;
> + if (self_detected) {
> + /* We haven't checked in, so go dump stack. */
> + print_cpu_stall(gps);
> + } else {
> + /* They had a few time units to dump stack, so complain. */
> + print_other_cpu_stall(gs2, gps);
> + }
>
> - /* 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))
> rcu_ftrace_dump(DUMP_ALL);
> - didstall = true;
> - }
> - if (didstall && READ_ONCE(rcu_state.jiffies_stall) == jn) {
> - jn = jiffies + 3 * rcu_jiffies_till_stall_check() + 3;
> - WRITE_ONCE(rcu_state.jiffies_stall, jn);
> +
> + if (READ_ONCE(rcu_state.jiffies_stall) == jn) {
> + jn = jiffies + 3 * rcu_jiffies_till_stall_check() + 3;
> + WRITE_ONCE(rcu_state.jiffies_stall, jn);
> + }
> }
> }
>
> --
> 2.25.1
>