From patchwork Mon Jun 10 07:10:58 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maarten Lankhorst X-Patchwork-Id: 2695961 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by patchwork2.kernel.org (Postfix) with ESMTP id F13E7DF264 for ; Mon, 10 Jun 2013 07:11:16 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B6377E5EBA for ; Mon, 10 Jun 2013 00:11:16 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by gabe.freedesktop.org (Postfix) with ESMTP id A91CFE5C8E for ; Mon, 10 Jun 2013 00:11:04 -0700 (PDT) Received: from 5ed49945.cm-7-5c.dynamic.ziggo.nl ([94.212.153.69] helo=[192.168.1.128]) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1UlwFp-0007Zh-Sf; Mon, 10 Jun 2013 07:11:01 +0000 Message-ID: <51B57C02.8030308@canonical.com> Date: Mon, 10 Jun 2013 09:10:58 +0200 From: Maarten Lankhorst User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130510 Thunderbird/17.0.6 MIME-Version: 1.0 To: Dave Airlie Subject: [PATCH] drm/cirrus: do not attempt to acquire a reservation while in an interrupt handler Cc: Fengguang Wu , "dri-devel@lists.freedesktop.org" X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org Errors-To: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org 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] [] dump_stack+0x19/0x1b [ 13.044441] [] warn_slowpath_common+0x6b/0x90 [ 13.044445] [] warn_slowpath_fmt+0x46/0x50 [ 13.044448] [] mutex_trylock+0x87/0x220 [ 13.044482] [] cirrus_dirty_update+0x1cd/0x330 [ 13.044486] [] cirrus_imageblit+0x38/0x50 [ 13.044506] [] soft_cursor+0x22e/0x240 [ 13.044510] [] bit_cursor+0x581/0x5b0 [ 13.044525] [] ? vsnprintf+0x124/0x670 [ 13.044529] [] ? get_color.isra.16+0x43/0x130 [ 13.044532] [] fbcon_cursor+0x18a/0x1d0 [ 13.044535] [] ? update_attr.isra.2+0xa0/0xa0 [ 13.044556] [] hide_cursor+0x32/0xa0 [ 13.044565] [] vt_console_print+0x103/0x3b0 [ 13.044569] [] ? print_time+0x9c/0xb0 [ 13.044576] [] ? print_prefix+0xa0/0xc0 [ 13.044580] [] call_console_drivers.constprop.6+0x146/0x1f0 [ 13.044593] [] ? do_raw_spin_unlock+0xc8/0x100 [ 13.044597] [] console_unlock+0x2f7/0x460 [ 13.044600] [] vprintk_emit+0x59a/0x5e0 [ 13.044615] [] printk+0x4d/0x4f [ 13.044650] [] print_local_APIC+0x28/0x41c [ 13.044672] [] generic_smp_call_function_single_interrupt+0x145/0x2b0 [ 13.044688] [] smp_call_function_single_interrupt+0x27/0x40 [ 13.044697] [] call_function_single_interrupt+0x72/0x80 [ 13.044707] [] ? native_safe_halt+0x6/0x10 [ 13.044717] [] ? trace_hardirqs_on+0xd/0x10 [ 13.044738] [] default_idle+0x59/0x120 [ 13.044742] [] arch_cpu_idle+0x18/0x40 [ 13.044754] [] cpu_startup_entry+0x235/0x410 [ 13.044763] [] rest_init+0xd1/0xe0 [ 13.044766] [] ? rest_init+0x5/0xe0 [ 13.044778] [] start_kernel+0x425/0x493 [ 13.044781] [] ? repair_env_string+0x5e/0x5e [ 13.044786] [] x86_64_start_reservations+0x2a/0x2c [ 13.044789] [] x86_64_start_kernel+0xf1/0x100 [ 13.044799] ---[ end trace 113ad28772af4058 ]--- Reported-by: Fengguang Wu Signed-off-by: Maarten Lankhorst 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;