2012-10-29 20:48:39

by Steven Rostedt

[permalink] [raw]
Subject: [PATCH 10/32] nohz/cpuset: Restart the tick if printk needs it

From: Frederic Weisbecker <[email protected]>

If we are in nohz adaptive mode and printk is called, the tick is
missing to wake up the logger. We need to restart the tick when that
happens. Do this asynchronously by issuing a tick restart self IPI
to avoid deadlocking with the current random locking chain.

Signed-off-by: Frederic Weisbecker <[email protected]>
Cc: Alessio Igor Bogani <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Avi Kivity <[email protected]>
Cc: Chris Metcalf <[email protected]>
Cc: Christoph Lameter <[email protected]>
Cc: Daniel Lezcano <[email protected]>
Cc: Geoff Levand <[email protected]>
Cc: Gilad Ben Yossef <[email protected]>
Cc: Hakan Akkan <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Kevin Hilman <[email protected]>
Cc: Max Krasnyansky <[email protected]>
Cc: Paul E. McKenney <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Stephen Hemminger <[email protected]>
Cc: Steven Rostedt <[email protected]>
Cc: Sven-Thorsten Dietrich <[email protected]>
Cc: Thomas Gleixner <[email protected]>
---
kernel/printk.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/kernel/printk.c b/kernel/printk.c
index 2d607f4..bf9048d 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -42,6 +42,7 @@
#include <linux/notifier.h>
#include <linux/rculist.h>
#include <linux/poll.h>
+#include <linux/cpuset.h>

#include <asm/uaccess.h>

@@ -1977,8 +1978,20 @@ int printk_needs_cpu(int cpu)

void wake_up_klogd(void)
{
- if (waitqueue_active(&log_wait))
+ unsigned long flags;
+
+ if (waitqueue_active(&log_wait)) {
this_cpu_or(printk_pending, PRINTK_PENDING_WAKEUP);
+ /* Make it visible from any interrupt from now */
+ barrier();
+ /*
+ * It's safe to check that even if interrupts are not disabled.
+ * If we enable nohz adaptive mode concurrently, we'll see the
+ * printk_pending value and thus keep a periodic tick behaviour.
+ */
+ if (cpuset_adaptive_nohz())
+ smp_cpuset_update_nohz(smp_processor_id());
+ }
}

static void console_cont_flush(char *text, size_t size)
--
1.7.10.4


2012-10-30 19:01:34

by Steven Rostedt

[permalink] [raw]
Subject: Re: [PATCH 10/32] nohz/cpuset: Restart the tick if printk needs it

On Mon, 2012-10-29 at 16:27 -0400, Steven Rostedt wrote:
> plain text document attachment
> (0010-nohz-cpuset-Restart-the-tick-if-printk-needs-it.patch)
> From: Frederic Weisbecker <[email protected]>
>
> If we are in nohz adaptive mode and printk is called, the tick is
> missing to wake up the logger. We need to restart the tick when that
> happens. Do this asynchronously by issuing a tick restart self IPI
> to avoid deadlocking with the current random locking chain.
>
> Signed-off-by: Frederic Weisbecker <[email protected]>
> Cc: Alessio Igor Bogani <[email protected]>
> Cc: Andrew Morton <[email protected]>
> Cc: Avi Kivity <[email protected]>
> Cc: Chris Metcalf <[email protected]>
> Cc: Christoph Lameter <[email protected]>
> Cc: Daniel Lezcano <[email protected]>
> Cc: Geoff Levand <[email protected]>
> Cc: Gilad Ben Yossef <[email protected]>
> Cc: Hakan Akkan <[email protected]>
> Cc: Ingo Molnar <[email protected]>
> Cc: Kevin Hilman <[email protected]>
> Cc: Max Krasnyansky <[email protected]>
> Cc: Paul E. McKenney <[email protected]>
> Cc: Peter Zijlstra <[email protected]>
> Cc: Stephen Hemminger <[email protected]>
> Cc: Steven Rostedt <[email protected]>
> Cc: Sven-Thorsten Dietrich <[email protected]>
> Cc: Thomas Gleixner <[email protected]>
> ---
> kernel/printk.c | 15 ++++++++++++++-
> 1 file changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/printk.c b/kernel/printk.c
> index 2d607f4..bf9048d 100644
> --- a/kernel/printk.c
> +++ b/kernel/printk.c
> @@ -42,6 +42,7 @@
> #include <linux/notifier.h>
> #include <linux/rculist.h>
> #include <linux/poll.h>
> +#include <linux/cpuset.h>
>
> #include <asm/uaccess.h>
>
> @@ -1977,8 +1978,20 @@ int printk_needs_cpu(int cpu)
>
> void wake_up_klogd(void)
> {
> - if (waitqueue_active(&log_wait))
> + unsigned long flags;
> +
> + if (waitqueue_active(&log_wait)) {
> this_cpu_or(printk_pending, PRINTK_PENDING_WAKEUP);
> + /* Make it visible from any interrupt from now */
> + barrier();
> + /*
> + * It's safe to check that even if interrupts are not disabled.

Probably need to at least disable preemption. I don't see any
requirement that wake_up_klogd() needs to be called with preemption
disabled.

The this_cpu_or() doesn't care which CPU it triggers, but the enabling
of nohz does.

-- Steve

> + * If we enable nohz adaptive mode concurrently, we'll see the
> + * printk_pending value and thus keep a periodic tick behaviour.
> + */
> + if (cpuset_adaptive_nohz())
> + smp_cpuset_update_nohz(smp_processor_id());
> + }
> }
>
> static void console_cont_flush(char *text, size_t size)

2012-10-30 23:54:56

by Frederic Weisbecker

[permalink] [raw]
Subject: Re: [PATCH 10/32] nohz/cpuset: Restart the tick if printk needs it

2012/10/30 Steven Rostedt <[email protected]>:
> Probably need to at least disable preemption. I don't see any
> requirement that wake_up_klogd() needs to be called with preemption
> disabled.
>
> The this_cpu_or() doesn't care which CPU it triggers, but the enabling
> of nohz does.

This patch is deemed to be replaced with the printk in nohz patchset
I'm working on. But it indeed to disable preemption as well and its
irq work should be made per cpu.