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

Maarten Lankhorst maarten.lankhorst at canonical.com
Thu Jun 6 00:23:15 PDT 2013


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 at canonical.com>
> 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 at canonical.com>
>
> [   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;



More information about the dri-devel mailing list