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

From: Fengguang Wu
Date: Thu Jun 06 2013 - 03:29:08 EST


Hi Maarten,

Thanks for the patch! I'll queue it for the tests.

Thanks,
Fengguang

On Thu, Jun 06, 2013 at 09:23:15AM +0200, Maarten Lankhorst wrote:
> 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/