From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: riel@redhat.com
Cc: linux-kernel@vger.kernel.org
Subject: Re: Untested patch to recheck idle state for expedited grace periods
Date: Tue, 11 Oct 2016 09:15:40 -0700 [thread overview]
Message-ID: <20161011161540.GA32060@linux.vnet.ibm.com> (raw)
In-Reply-To: <20161011132849.GA21962@linux.vnet.ibm.com>
On Tue, Oct 11, 2016 at 06:28:49AM -0700, Paul E. McKenney wrote:
> Hello, Rik,
>
> And it turns out that I did not in fact do the recheck at IPI time.
> The (untested) patch below is an alleged fix. Thoughts?
And it passes modest rcutorture testing, for whatever that might be
worth.
Thanx, Paul
> ------------------------------------------------------------------------
>
> commit e53e0b3e7b3c783962f9461bcb9aa8bc3e3a8688
> Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> Date: Tue Oct 11 06:09:59 2016 -0700
>
> rcu: Make expedited grace periods recheck dyntick idle state
>
> Expedited grace periods check dyntick-idle state, and avoid sending
> IPIs to idle CPUs, including those running guest OSes, and, on NOHZ_FULL
> kernels, nohz_full CPUs. However, the kernel has been observed checking
> a CPU while it was non-idle, but sending the IPI after it has gone
> idle. This commit therefore rechecks idle state immediately before
> sending the IPI, refraining from IPIing CPUs that have since gone idle.
>
> Reported-by: Rik van Riel <riel@redhat.com>
> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
>
> diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h
> index e99a5234d9ed..fe98dd24adf8 100644
> --- a/kernel/rcu/tree.h
> +++ b/kernel/rcu/tree.h
> @@ -404,6 +404,7 @@ struct rcu_data {
> atomic_long_t exp_workdone1; /* # done by others #1. */
> atomic_long_t exp_workdone2; /* # done by others #2. */
> atomic_long_t exp_workdone3; /* # done by others #3. */
> + int exp_dynticks_snap; /* Double-check need for IPI. */
>
> /* 7) Callback offloading. */
> #ifdef CONFIG_RCU_NOCB_CPU
> diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h
> index 24343eb87b58..d3053e99fdb6 100644
> --- a/kernel/rcu/tree_exp.h
> +++ b/kernel/rcu/tree_exp.h
> @@ -358,8 +358,10 @@ static void sync_rcu_exp_select_cpus(struct rcu_state *rsp,
> struct rcu_data *rdp = per_cpu_ptr(rsp->rda, cpu);
> struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu);
>
> + rdp->exp_dynticks_snap =
> + atomic_add_return(0, &rdtp->dynticks);
> if (raw_smp_processor_id() == cpu ||
> - !(atomic_add_return(0, &rdtp->dynticks) & 0x1) ||
> + !(rdp->exp_dynticks_snap & 0x1) ||
> !(rnp->qsmaskinitnext & rdp->grpmask))
> mask_ofl_test |= rdp->grpmask;
> }
> @@ -377,9 +379,17 @@ static void sync_rcu_exp_select_cpus(struct rcu_state *rsp,
> /* IPI the remaining CPUs for expedited quiescent state. */
> for_each_leaf_node_possible_cpu(rnp, cpu) {
> unsigned long mask = leaf_node_cpu_bit(rnp, cpu);
> + struct rcu_data *rdp = per_cpu_ptr(rsp->rda, cpu);
> + struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu);
> +
> if (!(mask_ofl_ipi & mask))
> continue;
> retry_ipi:
> + if (atomic_add_return(0, &rdtp->dynticks) !=
> + rdp->exp_dynticks_snap) {
> + mask_ofl_test |= mask;
> + continue;
> + }
> ret = smp_call_function_single(cpu, func, rsp, 0);
> if (!ret) {
> mask_ofl_ipi &= ~mask;
next prev parent reply other threads:[~2016-10-11 16:15 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-11 13:28 Untested patch to recheck idle state for expedited grace periods Paul E. McKenney
2016-10-11 16:15 ` Paul E. McKenney [this message]
2016-10-25 17:39 ` 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=20161011161540.GA32060@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=riel@redhat.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.