From: Josh Triplett <josh@joshtriplett.org>
To: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: linux-kernel@vger.kernel.org, mingo@elte.hu,
laijs@cn.fujitsu.com, dipankar@in.ibm.com,
akpm@linux-foundation.org, mathieu.desnoyers@polymtl.ca,
niv@us.ibm.com, tglx@linutronix.de, peterz@infradead.org,
rostedt@goodmis.org, Valdis.Kletnieks@vt.edu,
dhowells@redhat.com, eric.dumazet@gmail.com, darren@dvhart.com,
fweisbec@gmail.com, patches@linaro.org
Subject: Re: [PATCH tip/core/rcu 13/14] rcu: Split RCU core processing out of __call_rcu()
Date: Fri, 15 Jun 2012 14:25:27 -0700 [thread overview]
Message-ID: <20120615212527.GQ31184@leaf> (raw)
In-Reply-To: <1339791195-26389-13-git-send-email-paulmck@linux.vnet.ibm.com>
On Fri, Jun 15, 2012 at 01:13:14PM -0700, Paul E. McKenney wrote:
> From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
>
> The __call_rcu() function is a bit overweight, so this commit splits
> it into actual enqueuing of and accounting for the callback (__call_rcu())
> and associated RCU-core processing (__call_rcu_core()).
>
> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
> kernel/rcutree.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++-----
> 1 files changed, 49 insertions(+), 6 deletions(-)
>
> diff --git a/kernel/rcutree.c b/kernel/rcutree.c
> index 9419ebf..6940a81 100644
> --- a/kernel/rcutree.c
> +++ b/kernel/rcutree.c
> @@ -1858,9 +1858,11 @@ static void invoke_rcu_core(void)
> raise_softirq(RCU_SOFTIRQ);
> }
>
> -static void
> -__call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu),
> - struct rcu_state *rsp, bool lazy)
> +/*
> + * Handle any core-RCU processing required by a call_rcu() invocation.
> + */
> +static void __call_rcu_core(struct rcu_state *rsp, struct rcu_data *rdp,
> + struct rcu_head *head, unsigned long flags)
> {
> unsigned long flags;
> struct rcu_data *rdp;
> @@ -1905,10 +1907,8 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu),
> invoke_rcu_core();
>
> /* If interrupts were disabled or CPU offline, don't invoke RCU core. */
> - if (irqs_disabled_flags(flags) || cpu_is_offline(smp_processor_id())) {
> - local_irq_restore(flags);
> + if (irqs_disabled_flags(flags) || cpu_is_offline(smp_processor_id()))
> return;
> - }
>
> /*
> * Force the grace period if too many callbacks or too long waiting.
> @@ -1941,6 +1941,49 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu),
> }
> } else if (ULONG_CMP_LT(ACCESS_ONCE(rsp->jiffies_force_qs), jiffies))
> force_quiescent_state(rsp, 1);
> +}
> +
> +static void
> +__call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu),
> + struct rcu_state *rsp, bool lazy)
> +{
> + unsigned long flags;
> + struct rcu_data *rdp;
> +
> + WARN_ON_ONCE((unsigned long)head & 0x3); /* Misaligned rcu_head! */
> + debug_rcu_head_queue(head);
> + head->func = func;
> + head->next = NULL;
> +
> + smp_mb(); /* Ensure RCU update seen before callback registry. */
> +
> + /*
> + * Opportunistically note grace-period endings and beginnings.
> + * Note that we might see a beginning right after we see an
> + * end, but never vice versa, since this CPU has to pass through
> + * a quiescent state betweentimes.
> + */
> + local_irq_save(flags);
> + rdp = this_cpu_ptr(rsp->rda);
> +
> + /* Add the callback to our list. */
> + ACCESS_ONCE(rdp->qlen)++;
> + if (lazy)
> + rdp->qlen_lazy++;
> + else
> + rcu_idle_count_callbacks_posted();
> + smp_mb(); /* Count before adding callback for rcu_barrier(). */
> + *rdp->nxttail[RCU_NEXT_TAIL] = head;
> + rdp->nxttail[RCU_NEXT_TAIL] = &head->next;
> +
> + if (__is_kfree_rcu_offset((unsigned long)func))
> + trace_rcu_kfree_callback(rsp->name, head, (unsigned long)func,
> + rdp->qlen_lazy, rdp->qlen);
> + else
> + trace_rcu_callback(rsp->name, head, rdp->qlen_lazy, rdp->qlen);
> +
> + /* Go handle any RCU core processing required. */
> + __call_rcu_core(rsp, rdp, head, flags);
> local_irq_restore(flags);
> }
>
> --
> 1.7.8
>
next prev parent reply other threads:[~2012-06-15 21:25 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-15 20:12 [PATCH tip/core/rcu 0/14] Fixups for 3.6 Paul E. McKenney
2012-06-15 20:13 ` [PATCH tip/core/rcu 01/14] rcu: Fix detection of abruptly-ending stall Paul E. McKenney
2012-06-15 20:13 ` [PATCH tip/core/rcu 02/14] rcu: Consolidate duplicate callback-list initialization Paul E. McKenney
2012-06-15 20:42 ` Josh Triplett
2012-06-15 20:13 ` [PATCH tip/core/rcu 03/14] rcu: Add ACCESS_ONCE() to ->qlen accesses Paul E. McKenney
2012-06-15 20:45 ` Josh Triplett
2012-06-15 22:24 ` Paul E. McKenney
2012-06-15 20:13 ` [PATCH tip/core/rcu 04/14] rcu: Add a gcc-style structure initializer for RCU pointers Paul E. McKenney
2012-06-15 20:48 ` Josh Triplett
2012-06-15 21:22 ` Paul E. McKenney
2012-06-15 21:50 ` Josh Triplett
2012-06-15 22:47 ` Paul E. McKenney
2012-06-15 20:13 ` [PATCH tip/core/rcu 05/14] rcu: Use new INIT_RCU_POINTER for gcc-style initializations Paul E. McKenney
2012-06-15 20:13 ` [PATCH tip/core/rcu 06/14] rcu: Remove return value from RCU_INIT_POINTER() Paul E. McKenney
2012-06-15 20:50 ` Josh Triplett
2012-06-15 20:13 ` [PATCH tip/core/rcu 07/14] key: Remove extraneous parentheses from rcu_assign_keypointer() Paul E. McKenney
2012-06-15 20:50 ` Josh Triplett
2012-06-15 20:13 ` [PATCH tip/core/rcu 08/14] rcu: Remove return value from rcu_assign_pointer() Paul E. McKenney
2012-06-15 20:53 ` Josh Triplett
2012-06-15 20:13 ` [PATCH tip/core/rcu 09/14] rcu: Consolidate tree/tiny __rcu_read_{,un}lock() implementations Paul E. McKenney
2012-06-15 20:59 ` Josh Triplett
2012-06-15 20:13 ` [PATCH tip/core/rcu 10/14] rcu: Remove function versions of __kfree_rcu and __is_kfree_rcu_offset Paul E. McKenney
2012-06-15 20:59 ` Josh Triplett
2012-06-15 20:13 ` [PATCH tip/core/rcu 11/14] rcu: Make __call_rcu() handle invocation from idle Paul E. McKenney
2012-06-15 21:02 ` Josh Triplett
2012-06-15 20:13 ` [PATCH tip/core/rcu 12/14] rcu: Prevent __call_rcu() from invoking RCU core on offline CPUs Paul E. McKenney
2012-06-15 21:04 ` Josh Triplett
2012-06-15 20:13 ` [PATCH tip/core/rcu 13/14] rcu: Split RCU core processing out of __call_rcu() Paul E. McKenney
2012-06-15 21:25 ` Josh Triplett [this message]
2012-06-15 20:13 ` [PATCH tip/core/rcu 14/14] rcu: Fix rcu_is_cpu_idle() #ifdef in TINY_RCU Paul E. McKenney
2012-06-15 21:28 ` Josh Triplett
2012-06-15 22:57 ` Paul E. McKenney
2012-06-15 23:05 ` Josh Triplett
2012-06-15 20:40 ` [PATCH tip/core/rcu 01/14] rcu: Fix detection of abruptly-ending stall Josh Triplett
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=20120615212527.GQ31184@leaf \
--to=josh@joshtriplett.org \
--cc=Valdis.Kletnieks@vt.edu \
--cc=akpm@linux-foundation.org \
--cc=darren@dvhart.com \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=eric.dumazet@gmail.com \
--cc=fweisbec@gmail.com \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@polymtl.ca \
--cc=mingo@elte.hu \
--cc=niv@us.ibm.com \
--cc=patches@linaro.org \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox