Messages in this thread | | | Subject | Re: [PATCH 10/32] nohz/cpuset: Restart the tick if printk needs it | From | Steven Rostedt <> | Date | Tue, 30 Oct 2012 15:01:08 -0400 |
| |
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 <fweisbec@gmail.com> > > 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 <fweisbec@gmail.com> > Cc: Alessio Igor Bogani <abogani@kernel.org> > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: Avi Kivity <avi@redhat.com> > Cc: Chris Metcalf <cmetcalf@tilera.com> > Cc: Christoph Lameter <cl@linux.com> > Cc: Daniel Lezcano <daniel.lezcano@linaro.org> > Cc: Geoff Levand <geoff@infradead.org> > Cc: Gilad Ben Yossef <gilad@benyossef.com> > Cc: Hakan Akkan <hakanakkan@gmail.com> > Cc: Ingo Molnar <mingo@kernel.org> > Cc: Kevin Hilman <khilman@ti.com> > Cc: Max Krasnyansky <maxk@qualcomm.com> > Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> > Cc: Peter Zijlstra <peterz@infradead.org> > Cc: Stephen Hemminger <shemminger@vyatta.com> > Cc: Steven Rostedt <rostedt@goodmis.org> > Cc: Sven-Thorsten Dietrich <thebigcorporation@gmail.com> > Cc: Thomas Gleixner <tglx@linutronix.de> > --- > 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)
| |