Re: [vt_console_print/cirrus_dirty_update] WARNING: at kernel/mutex.c:858mutex_trylock()

From: Maarten Lankhorst
Date: Thu Jun 06 2013 - 03:23:27 EST


Hey,

Op 06-06-13 03:35, Fengguang Wu schreef:
> Greetings,
>
> I got the below dmesg and the first bad commit is
>
> commit 3d71c6ed43d838e593538176a9a59debe228cfb0
> Author: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxx>
> Date: Tue Apr 2 12:33:01 2013 +0200
>
> drm/ttm: convert to the reservation api
>
> Now that the code is compatible in semantics, flip the switch.
> Use ww_mutex instead of the homegrown implementation.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxx>
>
> [ 13.044298] printing local APIC contents on CPU#0/0:
> [ 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 ]---
Thanks for catching this, I'm uncertain how to proceed here. Can you try below patch?

diff --git a/drivers/gpu/drm/cirrus/cirrus_fbdev.c b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
index 3541b56..b27e956 100644
--- 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;

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/