odhcp6c: filter similar RAs spammed by some ISPs
[openwrt/openwrt.git] / target / linux / avr32 / patches-3.10 / 100-avr32-balance-cpu_idle_poll_ctrl-calls.patch
1 From 1b2bdd19742d4a336a4865d9b352c7a0ca7028ee Mon Sep 17 00:00:00 2001
2 From: Gabor Juhos <juhosg@openwrt.org>
3 Date: Wed, 25 Sep 2013 10:00:10 +0200
4 Subject: [PATCH] avr32: balance cpu_idle_poll_ctrl calls
5
6 Since commit 01426478df3a8791ff5c8b6b82d409e699cfaf38
7 (avr32: Use generic idle loop) the kernel throws the
8 following warning on avr32:
9
10 WARNING: at 900322e4 [verbose debug info unavailable]
11 Modules linked in:
12 CPU: 0 PID: 0 Comm: swapper Not tainted 3.12.0-rc2 #117
13 task: 901c3ecc ti: 901c0000 task.ti: 901c0000
14 PC is at cpu_idle_poll_ctrl+0x1c/0x38
15 LR is at comparator_mode+0x3e/0x40
16 pc : [<900322e4>] lr : [<90014882>] Not tainted
17 sp : 901c1f74 r12: 00000000 r11: 901c74a0
18 r10: 901d2510 r9 : 00000001 r8 : 901db4de
19 r7 : 901c74a0 r6 : 00000001 r5 : 00410020 r4 : 901db574
20 r3 : 00410024 r2 : 90206fe0 r1 : 00000000 r0 : 007f0000
21 Flags: qvnzc
22 Mode bits: hjmde....G
23 CPU Mode: Supervisor
24 Call trace:
25 [<90039ede>] clockevents_set_mode+0x16/0x2e
26 [<90039f00>] clockevents_shutdown+0xa/0x1e
27 [<9003a078>] clockevents_exchange_device+0x58/0x70
28 [<9003a78c>] tick_check_new_device+0x38/0x54
29 [<9003a1a2>] clockevents_register_device+0x32/0x90
30 [<900035c4>] time_init+0xa8/0x108
31 [<90000520>] start_kernel+0x128/0x23c
32
33 When the 'avr32_comparator' clockevent device is registered,
34 the clockevent core sets the mode of that clockevent device
35 to CLOCK_EVT_MODE_SHUTDOWN. Due to this, the 'comparator_mode'
36 function calls the 'cpu_idle_poll_ctrl' to disables idle poll.
37 This results in the aforementioned warning because the polling
38 is not enabled yet.
39
40 Change the code to only disable idle poll if it is enabled by
41 the same function to avoid the warning.
42
43 Cc: stable@vger.kernel.org
44 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
45 ---
46 Note: the patch is against v3.12-rc2.
47 ---
48 arch/avr32/kernel/time.c | 9 ++++++++-
49 1 file changed, 8 insertions(+), 1 deletion(-)
50
51 --- a/arch/avr32/kernel/time.c
52 +++ b/arch/avr32/kernel/time.c
53 @@ -98,7 +98,14 @@ static void comparator_mode(enum clock_e
54 case CLOCK_EVT_MODE_SHUTDOWN:
55 sysreg_write(COMPARE, 0);
56 pr_debug("%s: stop\n", evdev->name);
57 - cpu_idle_poll_ctrl(false);
58 + if (evdev->mode == CLOCK_EVT_MODE_ONESHOT ||
59 + evdev->mode == CLOCK_EVT_MODE_RESUME) {
60 + /*
61 + * Only disable idle poll if we have forced that
62 + * in a previous call.
63 + */
64 + cpu_idle_poll_ctrl(false);
65 + }
66 break;
67 default:
68 BUG();