From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Arjan van de Ven <arjan@infradead.org>,
LKML <linux-kernel@vger.kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Venki Pallipadi <venkatesh.pallipadi@intel.com>,
Len Brown <lenb@kernel.org>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
ACPI Devel Maling List <linux-acpi@vger.kernel.org>
Subject: Re: kerneloops.org report for the week of June 14 2009
Date: Tue, 23 Jun 2009 18:56:23 +0200 [thread overview]
Message-ID: <200906231856.24959.rjw@sisk.pl> (raw)
In-Reply-To: <20090623115510.GC9497@elte.hu>
On Tuesday 23 June 2009, Ingo Molnar wrote:
>
> * Thomas Gleixner <tglx@linutronix.de> wrote:
>
> > On Sun, 14 Jun 2009, Arjan van de Ven wrote:
> > > Rank 3: getnstimeofday (warning)
> > > Reported 309 times (2446 total reports)
> > > [suspend resume] getnstimeofday() is called before timekeeping is
> > resumed
> >
> > > Rank 6: hres_timers_resume (warning)
> > > Reported 188 times (1024 total reports)
> > > [suspend resume] hres_timers_resume() is incorrectly called with
> > > interrupts on
> >
> > Both have the same root cause. Something enables interrupts in the
> > early resume path. IIRC, there was a culprit identified recently.
> > Rafael ?
Apparently, we have smp_call_function_single() called from cpufreq_suspend
via acpi_cpufreq somehow, but I'm still to figure out how this happens.
> This can be debugged automatically today, using lockdep, by using a
> 'helper lock':
>
> static DEFINE_PER_CPU(struct lockdep_map, helper_lock);
>
> Then mark the lock irq-safe by doing something like:
>
> static void mark_lock_irqsafe(void)
> {
> unsigned long flags;
> int cpu;
>
> local_irq_save(flags);
> irq_enter(0);
>
> for_each_online_cpu(cpu) {
> lock_acquire(&per_cpu(helper_lock, cpu), 0, 0, 0, 0, NULL, 0);
> lock_release(&per_cpu(helper_lock, cpu), 0, 0, 0, 0, NULL, 0);
> }
>
> irq_exit(0);
> local_irq_restore(flags);
> }
>
> Then, the resume path, when it disables irqs, you can disallow
> irq-enable via:
>
> local_irq_disable();
> lock_acquire(&__get_cpu_var(helper_lock), 0, 0, 0, 0, NULL, 0);
> ...
> <extensive suspend or resume codepaths, callbacks>
> ...
> lock_release(&__get_cpu_var(helper_lock), 0, 0, 0, 0, NULL, 0);
> local_irq_enable();
>
> And lockdep will warn if any function inbetween enables IRQs, by
> emitting a splat about incorrectly enabled hardirqs. It will warn
> about the specific place and will emit a relevant backtrace, - not
> just the handler in general.
>
> This should work just fine with current lockdep facilities.
>
> Rafael?
We have some debug code for checking interrupts disabled in sysdev_suspend
and sysdev_resume already and these reports are from 2.6.29 where that code
was not present.
The long term solution for the issue at hand is to clean up the suspend-resume
support in cpufreq so that it doesn't do stupid things like calling
smp_call_function_single() with interrupts disabled, but that requires someone
(I can do it, but I need to dig through the cpufreq code for this purpose) to
figure out how to fix it.
I'm not quite sure if there's an acceptable short term solution, though.
In principle we can do
local_irq_save()
...
local_irq_restore()
around each sysdevs ->susend() and ->resume() in addition to checking the
status of interrupts. Would that work?
Rafael
next prev parent reply other threads:[~2009-06-23 16:56 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-15 0:33 Arjan van de Ven
2009-06-15 5:53 ` [alsa-devel] " Takashi Iwai
2009-06-15 7:06 ` Stefan Schmidt
2009-06-16 7:11 ` WARN_ON's in i915_gem_tiling.c Stefan Schmidt
2009-06-18 17:08 ` kerneloops.org report for the week of June 14 2009 Bob Copeland
2009-06-19 5:32 ` Arjan van de Ven
2009-06-28 9:11 ` Bob Copeland
2009-06-23 10:05 ` Thomas Gleixner
2009-06-23 11:55 ` Ingo Molnar
2009-06-23 14:50 ` Arjan van de Ven
2009-06-23 16:56 ` Rafael J. Wysocki [this message]
2009-06-23 16:58 ` Thomas Gleixner
2009-06-25 13:03 ` Pádraig Brady
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=200906231856.24959.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=arjan@infradead.org \
--cc=benh@kernel.crashing.org \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=venkatesh.pallipadi@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome