diff options
author | Stuart Menefy <stuart.menefy@st.com> | 2009-07-29 10:01:24 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2009-07-29 10:01:24 -0400 |
commit | fd78a76aefb5bf28a11d6960d29e03a11db62320 (patch) | |
tree | 8dac39f13c9b3bdadda02594f49501b5522ecad7 /arch/sh/kernel/io_trapped.c | |
parent | 82b242214b6f5b96eb9b76452ac6e2b67dd81abd (diff) |
sh: Rework irqflags tracing to fix up CONFIG_PROVE_LOCKING.
This cleans up the irqflags tracing code quite a bit and ties it
in to various missing callsites that caused an imbalance when
CONFIG_PROVE_LOCKING was enabled.
Previously this was catching on:
987 #ifdef CONFIG_PROVE_LOCKING
988 DEBUG_LOCKS_WARN_ON(!p->hardirqs_enabled);
989 DEBUG_LOCKS_WARN_ON(!p->softirqs_enabled);
990 #endif
991 retval = -EAGAIN;
with hardirqs being doubly enabled, and subsequently bailing out
with the following call trace:
Call trace:
[<88035224>] __lock_acquire+0x616/0x6a6
[<88015a8c>] do_fork+0xf8/0x2b0
[<880331ec>] trace_hardirqs_on_caller+0xd4/0x114
[<88241074>] _spin_unlock_irq+0x20/0x64
[<88035224>] __lock_acquire+0x616/0x6a6
[<8800386c>] kernel_thread+0x48/0x70
[<88024ecc>] ____call_usermodehelper+0x0/0x110
[<88024ecc>] ____call_usermodehelper+0x0/0x110
[<88003894>] kernel_thread_helper+0x0/0x14
[<88024bac>] __call_usermodehelper+0x38/0x70
[<88025dc0>] worker_thread+0x150/0x274
[<88035b9c>] lock_release+0x0/0x198
[<88024b74>] __call_usermodehelper+0x0/0x70
[<88028cf0>] autoremove_wake_function+0x0/0x30
[<88028bf2>] kthread+0x3e/0x70
[<88025c70>] worker_thread+0x0/0x274
[<8800389c>] kernel_thread_helper+0x8/0x14
[<88028bb4>] kthread+0x0/0x70
[<88003894>] kernel_thread_helper+0x0/0x14
Reported-by: Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
Signed-off-by: Stuart Menefy <stuart.menefy@st.com>
Signed-off-by: Matt Fleming <matt@console-pimps.org>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/kernel/io_trapped.c')
-rw-r--r-- | arch/sh/kernel/io_trapped.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/arch/sh/kernel/io_trapped.c b/arch/sh/kernel/io_trapped.c index 77dfecb64373..e27a19e1f46e 100644 --- a/arch/sh/kernel/io_trapped.c +++ b/arch/sh/kernel/io_trapped.c | |||
@@ -112,14 +112,15 @@ void __iomem *match_trapped_io_handler(struct list_head *list, | |||
112 | struct trapped_io *tiop; | 112 | struct trapped_io *tiop; |
113 | struct resource *res; | 113 | struct resource *res; |
114 | int k, len; | 114 | int k, len; |
115 | unsigned long flags; | ||
115 | 116 | ||
116 | spin_lock_irq(&trapped_lock); | 117 | spin_lock_irqsave(&trapped_lock, flags); |
117 | list_for_each_entry(tiop, list, list) { | 118 | list_for_each_entry(tiop, list, list) { |
118 | voffs = 0; | 119 | voffs = 0; |
119 | for (k = 0; k < tiop->num_resources; k++) { | 120 | for (k = 0; k < tiop->num_resources; k++) { |
120 | res = tiop->resource + k; | 121 | res = tiop->resource + k; |
121 | if (res->start == offset) { | 122 | if (res->start == offset) { |
122 | spin_unlock_irq(&trapped_lock); | 123 | spin_unlock_irqrestore(&trapped_lock, flags); |
123 | return tiop->virt_base + voffs; | 124 | return tiop->virt_base + voffs; |
124 | } | 125 | } |
125 | 126 | ||
@@ -127,7 +128,7 @@ void __iomem *match_trapped_io_handler(struct list_head *list, | |||
127 | voffs += roundup(len, PAGE_SIZE); | 128 | voffs += roundup(len, PAGE_SIZE); |
128 | } | 129 | } |
129 | } | 130 | } |
130 | spin_unlock_irq(&trapped_lock); | 131 | spin_unlock_irqrestore(&trapped_lock, flags); |
131 | return NULL; | 132 | return NULL; |
132 | } | 133 | } |
133 | EXPORT_SYMBOL_GPL(match_trapped_io_handler); | 134 | EXPORT_SYMBOL_GPL(match_trapped_io_handler); |