projects
/
platform
/
kernel
/
linux-rpi.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
1107276
)
drm/cirrus: do not attempt to acquire a reservation while in an interrupt handler
author
Maarten Lankhorst
<m.b.lankhorst@gmail.com>
Thu, 27 Jun 2013 11:38:24 +0000
(13:38 +0200)
committer
Dave Airlie
<airlied@redhat.com>
Fri, 28 Jun 2013 01:56:30 +0000
(11:56 +1000)
Mutexes should not be acquired in interrupt context. While the trylock
fastpath is arguably safe on all implementations, the slowpath
unlock path definitely isn't. This fixes the following lockdep splat:
[ 13.044313] ------------[ cut here ]------------
[ 13.044367] WARNING: at /c/kernel-tests/src/tip/kernel/mutex.c:858 mutex_trylock+0x87/0x220()
[ 13.044378] DEBUG_LOCKS_WARN_ON(in_interrupt())
[ 13.044378] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.10.0-rc4-00296-ga2963dd #20
[ 13.044379] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007
[ 13.044390]
0000000000000009
ffff88000de039f8
ffffffff81fc86d5
ffff88000de03a38
[ 13.044395]
ffffffff810d511b
ffff880000000018
ffff88000f33c690
0000000000000001
[ 13.044398]
00000000000003f0
ffff88000f4677c8
0000000000000000
ffff88000de03a98
[ 13.044400] Call Trace:
[ 13.044412] <IRQ> [<
ffffffff81fc86d5
>] dump_stack+0x19/0x1b
[ 13.044441] [<
ffffffff810d511b
>] warn_slowpath_common+0x6b/0x90
[ 13.044445] [<
ffffffff810d51a6
>] warn_slowpath_fmt+0x46/0x50
[ 13.044448] [<
ffffffff81fd34d7
>] mutex_trylock+0x87/0x220
[ 13.044482] [<
ffffffff8186484d
>] cirrus_dirty_update+0x1cd/0x330
[ 13.044486] [<
ffffffff818649e8
>] cirrus_imageblit+0x38/0x50
[ 13.044506] [<
ffffffff8165782e
>] soft_cursor+0x22e/0x240
[ 13.044510] [<
ffffffff81656c31
>] bit_cursor+0x581/0x5b0
[ 13.044525] [<
ffffffff815de9f4
>] ? vsnprintf+0x124/0x670
[ 13.044529] [<
ffffffff81651333
>] ? get_color.isra.16+0x43/0x130
[ 13.044532] [<
ffffffff81653fca
>] fbcon_cursor+0x18a/0x1d0
[ 13.044535] [<
ffffffff816566b0
>] ? update_attr.isra.2+0xa0/0xa0
[ 13.044556] [<
ffffffff81754b82
>] hide_cursor+0x32/0xa0
[ 13.044565] [<
ffffffff81755bd3
>] vt_console_print+0x103/0x3b0
[ 13.044569] [<
ffffffff810d58ac
>] ? print_time+0x9c/0xb0
[ 13.044576] [<
ffffffff810d5960
>] ? print_prefix+0xa0/0xc0
[ 13.044580] [<
ffffffff810d63f6
>] call_console_drivers.constprop.6+0x146/0x1f0
[ 13.044593] [<
ffffffff815f9b38
>] ? do_raw_spin_unlock+0xc8/0x100
[ 13.044597] [<
ffffffff810d6f27
>] console_unlock+0x2f7/0x460
[ 13.044600] [<
ffffffff810d787a
>] vprintk_emit+0x59a/0x5e0
[ 13.044615] [<
ffffffff81fb676c
>] printk+0x4d/0x4f
[ 13.044650] [<
ffffffff82ba5511
>] print_local_APIC+0x28/0x41c
[ 13.044672] [<
ffffffff8114db55
>] generic_smp_call_function_single_interrupt+0x145/0x2b0
[ 13.044688] [<
ffffffff8106f9e7
>] smp_call_function_single_interrupt+0x27/0x40
[ 13.044697] [<
ffffffff81fd8f72
>] call_function_single_interrupt+0x72/0x80
[ 13.044707] <EOI> [<
ffffffff81078166
>] ? native_safe_halt+0x6/0x10
[ 13.044717] [<
ffffffff811425cd
>] ? trace_hardirqs_on+0xd/0x10
[ 13.044738] [<
ffffffff8104f669
>] default_idle+0x59/0x120
[ 13.044742] [<
ffffffff810501e8
>] arch_cpu_idle+0x18/0x40
[ 13.044754] [<
ffffffff811320c5
>] cpu_startup_entry+0x235/0x410
[ 13.044763] [<
ffffffff81f9e781
>] rest_init+0xd1/0xe0
[ 13.044766] [<
ffffffff81f9e6b5
>] ? rest_init+0x5/0xe0
[ 13.044778] [<
ffffffff82b93ec2
>] start_kernel+0x425/0x493
[ 13.044781] [<
ffffffff82b93810
>] ? repair_env_string+0x5e/0x5e
[ 13.044786] [<
ffffffff82b93595
>] x86_64_start_reservations+0x2a/0x2c
[ 13.044789] [<
ffffffff82b93688
>] x86_64_start_kernel+0xf1/0x100
[ 13.044799] ---[ end trace
113ad28772af4058
]---
Reported-by: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/cirrus/cirrus_fbdev.c
patch
|
blob
|
history
diff --git
a/drivers/gpu/drm/cirrus/cirrus_fbdev.c
b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
index
3541b56
..
b27e956
100644
(file)
--- a/
drivers/gpu/drm/cirrus/cirrus_fbdev.c
+++ b/
drivers/gpu/drm/cirrus/cirrus_fbdev.c
@@
-25,7
+25,7
@@
static void cirrus_dirty_update(struct cirrus_fbdev *afbdev,
struct cirrus_bo *bo;
int src_offset, dst_offset;
int bpp = (afbdev->gfb.base.bits_per_pixel + 7)/8;
- int ret;
+ int ret
= -EBUSY
;
bool unmap = false;
bool store_for_later = false;
int x2, y2;
@@
-39,7
+39,8
@@
static void cirrus_dirty_update(struct cirrus_fbdev *afbdev,
* then the BO is being moved and we should
* store up the damage until later.
*/
- ret = cirrus_bo_reserve(bo, true);
+ if (!in_interrupt())
+ ret = cirrus_bo_reserve(bo, true);
if (ret) {
if (ret != -EBUSY)
return;