From: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
To: tglx@linutronix.de
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
Andrew Morton <akpm@linux-foundation.org>,
Russell King <linux@arm.linux.org.uk>,
Greg Kroah-Hartman <gregkh@suse.de>,
Alan Stern <stern@rowland.harvard.edu>,
linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org
Subject: interrupt latency while resuming.
Date: Sat, 08 Jan 2011 08:58:57 -0800 [thread overview]
Message-ID: <4D2897D1.3040609@codeaurora.org> (raw)
I am trying to address an issue of not handling a wakeup interrupt quick
enough while resuming. It is an edge triggered interrupt with the
IRQ_WAKEUP flag set. The interrupt controller implements lazy disabling
of interrupts, IOW does not have a disable callback in the irq_chip.
So while going in to supend that interrupt is marked IRQ_DISABLED in
dpm_suspend_noirq().
On resume handle_edge_trigger is run right after
arch_suspend_enable_irqs(). It finds the interrupt marked IRQ_DISABLED
and it sets the IRQ_PENDING flag and does not call the handler.
As the resume path unrolls, non boot cpus are enabled,
dpm_resume_noirq() is run. At that time it finds the IRQ_PENDING flag is
set on this interrupt and the interrupt handler is run.
The problem is, this is very late for the interrupt to be run. Possibly
because enable_nonboot_cpu takes a while or the resume_noirq callbacks
take a long time etc.
I tried using IRQF_NO_SUSPEND for that interrupt and it seems the
interrupt is handled as soon as arch_suspend_enable_irqs() is run.
However I suspect that with this the system will fail to abort suspend -
The interrupt could trigger between dpm_suspend_noirq() and
arch_suspend_disable_irqs() and since it wont be marked IRQF_PENDING the
system goes to suspend never to be woken up again. (the check to abort
suspend because of a pending interrupt is done in check_wakeup_irqs() in
sysdev_suspend). I dont think IRQF_NO_SUSPEND was designed for wakeup
interrupts. Please correct me if I am missing something here.
A solution that comes to mind is enabling such interrupts right before
arch_suspend_enable_irqs() is run. In some more detail, mark these
interrupts as IRQF_LOW_SUSPEND_LATENCY in their irq_desc->status and
enable such interrupts before doing arch_suspend_enable_irqs(). That way
when arch_suspend_enable_irqs() happens, the handler is run immediately.
We skip enabling such interrupts in resume_device_irqs() to avoid
enabling them twice.
Will appreciate any other suggestions towards fixing the delay.
Abhijeet
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
next reply other threads:[~2011-01-08 16:58 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-08 16:58 Abhijeet Dharmapurikar [this message]
2011-01-08 17:13 ` interrupt latency while resuming Russell King - ARM Linux
2011-01-08 19:09 ` Abhijeet Dharmapurikar
2011-01-11 5:11 ` Stephen Boyd
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=4D2897D1.3040609@codeaurora.org \
--to=adharmap@codeaurora.org \
--cc=akpm@linux-foundation.org \
--cc=gregkh@suse.de \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=rjw@sisk.pl \
--cc=stern@rowland.harvard.edu \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.