From c6feb881e00c8db9f9f73d099a08e86c5af79d50 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 4 Feb 2014 13:19:08 +1000 Subject: [PATCH] drm: add in_interrupt to drm_can_sleep list of things This should stop us taking locks when we shouldn't in the console drivers, [ 1.749341] ------------[ cut here ]------------ [ 1.749347] WARNING: CPU: 0 PID: 0 at kernel/locking/mutex.c:856 mutex_trylock+0x1e5/0x250() [ 1.749348] DEBUG_LOCKS_WARN_ON(in_interrupt()) [ 1.749360] Modules linked in: ppdev cirrus syscopyarea sysfillrect sysimgblt drm_kms_helper evdev psmouse microcode serio_raw pcspkr ttm e1000 parport_pc parport processor button intel_agp drm intel_gtt i2c_piix4 ipv6 ext4 crc16 mbcache jbd2 sd_mod sr_mod cdrom ata_generic pata_acpi ata_piix 9pnet_virtio 9pnet libata scsi_mod [ 1.749362] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.14.0-rc1-t1 #34 [ 1.749364] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 1.749366] 0000000000000009 ffff88001fc038c8 ffffffff814e8456 ffff88001fc03910 [ 1.749367] ffff88001fc03900 ffffffff8106a0dd ffff88001d3ff990 0000000000000010 [ 1.749368] 0000000000000000 00000000000001e0 ffff88001cc3b000 ffff88001fc03960 [ 1.749369] Call Trace: [ 1.749372] [] dump_stack+0x4d/0x6f [ 1.749374] [] warn_slowpath_common+0x7d/0xa0 [ 1.749375] [] warn_slowpath_fmt+0x4c/0x50 [ 1.749377] [] mutex_trylock+0x1e5/0x250 [ 1.749380] [] cirrus_dirty_update+0x7c/0x2f0 [cirrus] [ 1.749381] [] cirrus_imageblit+0x2f/0x40 [cirrus] [ 1.749388] [] soft_cursor+0x1b4/0x250 [ 1.749390] [] bit_cursor+0x613/0x650 [ 1.749391] [] ? get_color.isra.15+0x31/0x140 Reported-by: Sabrina Dubroca Signed-off-by: Dave Airlie --- include/drm/drmP.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 1d4a920..3a98664 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -1665,7 +1665,7 @@ extern void drm_platform_exit(struct drm_driver *driver, struct platform_device /* returns true if currently okay to sleep */ static __inline__ bool drm_can_sleep(void) { - if (in_atomic() || in_dbg_master() || irqs_disabled()) + if (in_atomic() || in_dbg_master() || in_interrupt() || irqs_disabled()) return false; return true; } -- 1.8.4.2