ARM: 7565/1: sched: stop sched_clock() during suspend
authorFelipe Balbi 2 <balbi@ti.com>
Tue, 23 Oct 2012 18:00:03 +0000 (19:00 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 29 Oct 2012 10:02:49 +0000 (10:02 +0000)
commit6a4dae5e138a32b45ca5218cc2b81802f9d378c3
tree76d5e66d01e83d1badae704fc8fb21d2ceade0f5
parentb43b1ffa82aa0d4d13b5ebedcc743dfaa4c2a19f
ARM: 7565/1: sched: stop sched_clock() during suspend

The scheduler imposes a requirement to sched_clock()
which is to stop the clock during suspend, if we don't
do that any RT thread will be rescheduled in the future
which might cause any sort of problems.

This became an issue on OMAP when we converted omap-i2c.c
to use threaded IRQs, it turned out that depending on how
much time we spent on suspend, the I2C IRQ thread would
end up being rescheduled so far in the future that I2C
transfers would timeout and, because omap_hsmmc depends
on an I2C-connected device to detect if an MMC card is
inserted in the slot, our rootfs would just vanish.

arch/arm/kernel/sched_clock.c already had an optional
implementation (sched_clock_needs_suspend()) which would
handle scheduler's requirement properly, what this patch
does is simply to make that implementation non-optional.

Note that this has the side-effect that printk timings
won't reflect the actual time spent on suspend so other
methods to measure that will have to be used.

This has been tested with beagleboard XM (OMAP3630) and
pandaboard rev A3 (OMAP4430). Suspend to RAM is now working
after this patch.

Thanks to Kevin Hilman for helping out with debugging.

Acked-by: Kevin Hilman <khilman@ti.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/include/asm/sched_clock.h
arch/arm/kernel/sched_clock.c