|
Message-ID: <20190712233206.GZ26519@linux.ibm.com> Date: Fri, 12 Jul 2019 16:32:06 -0700 From: "Paul E. McKenney" <paulmck@...ux.ibm.com> To: Joel Fernandes <joel@...lfernandes.org> Cc: linux-kernel@...r.kernel.org, Oleg Nesterov <oleg@...hat.com>, Alexey Kuznetsov <kuznet@....inr.ac.ru>, Bjorn Helgaas <bhelgaas@...gle.com>, Borislav Petkov <bp@...en8.de>, c0d1n61at3@...il.com, "David S. Miller" <davem@...emloft.net>, edumazet@...gle.com, Greg Kroah-Hartman <gregkh@...uxfoundation.org>, Hideaki YOSHIFUJI <yoshfuji@...ux-ipv6.org>, "H. Peter Anvin" <hpa@...or.com>, Ingo Molnar <mingo@...hat.com>, Jonathan Corbet <corbet@....net>, Josh Triplett <josh@...htriplett.org>, keescook@...omium.org, kernel-hardening@...ts.openwall.com, kernel-team@...roid.com, Lai Jiangshan <jiangshanlai@...il.com>, Len Brown <lenb@...nel.org>, linux-acpi@...r.kernel.org, linux-doc@...r.kernel.org, linux-pci@...r.kernel.org, linux-pm@...r.kernel.org, Mathieu Desnoyers <mathieu.desnoyers@...icios.com>, neilb@...e.com, netdev@...r.kernel.org, Pavel Machek <pavel@....cz>, peterz@...radead.org, "Rafael J. Wysocki" <rjw@...ysocki.net>, Rasmus Villemoes <rasmus.villemoes@...vas.dk>, rcu@...r.kernel.org, Steven Rostedt <rostedt@...dmis.org>, Tejun Heo <tj@...nel.org>, Thomas Gleixner <tglx@...utronix.de>, will@...nel.org, "maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT)" <x86@...nel.org> Subject: Re: [PATCH v2 3/9] rcu/sync: Remove custom check for reader-section On Fri, Jul 12, 2019 at 05:35:59PM -0400, Joel Fernandes wrote: > On Fri, Jul 12, 2019 at 01:00:18PM -0400, Joel Fernandes (Google) wrote: > > The rcu/sync code was doing its own check whether we are in a reader > > section. With RCU consolidating flavors and the generic helper added in > > this series, this is no longer need. We can just use the generic helper > > and it results in a nice cleanup. > > > > Cc: Oleg Nesterov <oleg@...hat.com> > > Signed-off-by: Joel Fernandes (Google) <joel@...lfernandes.org> > > Hi Oleg, > Slightly unrelated to the patch, > I tried hard to understand this comment below in percpu_down_read() but no dice. > > I do understand how rcu sync and percpu rwsem works, however the comment > below didn't make much sense to me. For one, there's no readers_fast anymore > so I did not follow what readers_fast means. Could the comment be updated to > reflect latest changes? > Also could you help understand how is a writer not able to change > sem->state and count the per-cpu read counters at the same time as the > comment tries to say? > > /* > * We are in an RCU-sched read-side critical section, so the writer > * cannot both change sem->state from readers_fast and start checking > * counters while we are here. So if we see !sem->state, we know that > * the writer won't be checking until we're past the preempt_enable() > * and that once the synchronize_rcu() is done, the writer will see > * anything we did within this RCU-sched read-size critical section. > */ > > Also, > I guess we could get rid of all of the gp_ops struct stuff now that since all > the callbacks are the same now. I will post that as a follow-up patch to this > series. Hello, Joel, Oleg has a set of patches updating this code that just hit mainline this week. These patches get rid of the code that previously handled RCU's multiple flavors. Or are you looking at current mainline and me just missing your point? Thanx, Paul > thanks! > > - Joel > > > > --- > > Please note: Only build and boot tested this particular patch so far. > > > > include/linux/rcu_sync.h | 5 ++--- > > kernel/rcu/sync.c | 22 ---------------------- > > 2 files changed, 2 insertions(+), 25 deletions(-) > > > > diff --git a/include/linux/rcu_sync.h b/include/linux/rcu_sync.h > > index 6fc53a1345b3..c954f1efc919 100644 > > --- a/include/linux/rcu_sync.h > > +++ b/include/linux/rcu_sync.h > > @@ -39,9 +39,8 @@ extern void rcu_sync_lockdep_assert(struct rcu_sync *); > > */ > > static inline bool rcu_sync_is_idle(struct rcu_sync *rsp) > > { > > -#ifdef CONFIG_PROVE_RCU > > - rcu_sync_lockdep_assert(rsp); > > -#endif > > + RCU_LOCKDEP_WARN(!rcu_read_lock_any_held(), > > + "suspicious rcu_sync_is_idle() usage"); > > return !rsp->gp_state; /* GP_IDLE */ > > } > > > > diff --git a/kernel/rcu/sync.c b/kernel/rcu/sync.c > > index a8304d90573f..535e02601f56 100644 > > --- a/kernel/rcu/sync.c > > +++ b/kernel/rcu/sync.c > > @@ -10,37 +10,25 @@ > > #include <linux/rcu_sync.h> > > #include <linux/sched.h> > > > > -#ifdef CONFIG_PROVE_RCU > > -#define __INIT_HELD(func) .held = func, > > -#else > > -#define __INIT_HELD(func) > > -#endif > > - > > static const struct { > > void (*sync)(void); > > void (*call)(struct rcu_head *, void (*)(struct rcu_head *)); > > void (*wait)(void); > > -#ifdef CONFIG_PROVE_RCU > > - int (*held)(void); > > -#endif > > } gp_ops[] = { > > [RCU_SYNC] = { > > .sync = synchronize_rcu, > > .call = call_rcu, > > .wait = rcu_barrier, > > - __INIT_HELD(rcu_read_lock_held) > > }, > > [RCU_SCHED_SYNC] = { > > .sync = synchronize_rcu, > > .call = call_rcu, > > .wait = rcu_barrier, > > - __INIT_HELD(rcu_read_lock_sched_held) > > }, > > [RCU_BH_SYNC] = { > > .sync = synchronize_rcu, > > .call = call_rcu, > > .wait = rcu_barrier, > > - __INIT_HELD(rcu_read_lock_bh_held) > > }, > > }; > > > > @@ -49,16 +37,6 @@ enum { CB_IDLE = 0, CB_PENDING, CB_REPLAY }; > > > > #define rss_lock gp_wait.lock > > > > -#ifdef CONFIG_PROVE_RCU > > -void rcu_sync_lockdep_assert(struct rcu_sync *rsp) > > -{ > > - RCU_LOCKDEP_WARN(!gp_ops[rsp->gp_type].held(), > > - "suspicious rcu_sync_is_idle() usage"); > > -} > > - > > -EXPORT_SYMBOL_GPL(rcu_sync_lockdep_assert); > > -#endif > > - > > /** > > * rcu_sync_init() - Initialize an rcu_sync structure > > * @rsp: Pointer to rcu_sync structure to be initialized > > -- > > 2.22.0.510.g264f2c817a-goog > > >
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.