linux/drivers/gpu/drm/i915
Daniel Stone bf248ca1f5 drm/i915: Fix locking around GuC firmware load
The GuC firmware load requires struct_mutex to create a GEM object,
but this collides badly with request_firmware. Move struct_mutex
locking down into the loader itself, so we don't hold it across the
entire load process, including request_firmware.

[   20.451400] ======================================================
[   20.451420] [ INFO: possible circular locking dependency detected ]
[   20.451441] 4.3.0-rc5+ #1 Tainted: G        W
[   20.451457] -------------------------------------------------------
[   20.451477] plymouthd/371 is trying to acquire lock:
[   20.451494]  (&dev->struct_mutex){+.+.+.}, at: [<ffffffffa0093c62>]
drm_gem_mmap+0x112/0x290 [drm]
[   20.451538]
               but task is already holding lock:
[   20.451557]  (&mm->mmap_sem){++++++}, at: [<ffffffff811fd9ac>]
vm_mmap_pgoff+0x8c/0xf0
[   20.451591]
               which lock already depends on the new lock.

[   20.451617]
               the existing dependency chain (in reverse order) is:
[   20.451640]
               -> #3 (&mm->mmap_sem){++++++}:
[   20.451661]        [<ffffffff8110644e>] lock_acquire+0xce/0x1c0
[   20.451683]        [<ffffffff8120ec9a>] __might_fault+0x7a/0xa0
[   20.451705]        [<ffffffff8127e34e>] filldir+0x9e/0x130
[   20.451726]        [<ffffffff81295b86>] dcache_readdir+0x186/0x230
[   20.451748]        [<ffffffff8127e117>] iterate_dir+0x97/0x130
[   20.451769]        [<ffffffff8127e66a>] SyS_getdents+0x9a/0x130
[   20.451790]        [<ffffffff8184f2f2>] entry_SYSCALL_64_fastpath+0x12/0x76
[   20.451829]
               -> #2 (&sb->s_type->i_mutex_key#2){+.+.+.}:
[   20.451852]        [<ffffffff8110644e>] lock_acquire+0xce/0x1c0
[   20.451872]        [<ffffffff8184b516>] mutex_lock_nested+0x86/0x400
[   20.451893]        [<ffffffff81277790>] walk_component+0x1d0/0x2a0
[   20.451914]        [<ffffffff812779f0>] link_path_walk+0x190/0x5a0
[   20.451935]        [<ffffffff8127803b>] path_openat+0xab/0x1260
[   20.451955]        [<ffffffff8127a651>] do_filp_open+0x91/0x100
[   20.451975]        [<ffffffff81267e67>] file_open_name+0xf7/0x150
[   20.451995]        [<ffffffff81267ef3>] filp_open+0x33/0x60
[   20.452014]        [<ffffffff8157e1e7>] _request_firmware+0x277/0x880
[   20.452038]        [<ffffffff8157e9e4>] request_firmware_work_func+0x34/0x80
[   20.452060]        [<ffffffff810c7020>] process_one_work+0x230/0x680
[   20.452082]        [<ffffffff810c74be>] worker_thread+0x4e/0x450
[   20.452102]        [<ffffffff810ce511>] kthread+0x101/0x120
[   20.452121]        [<ffffffff8184f66f>] ret_from_fork+0x3f/0x70
[   20.452140]
               -> #1 (umhelper_sem){++++.+}:
[   20.452159]        [<ffffffff8110644e>] lock_acquire+0xce/0x1c0
[   20.452178]        [<ffffffff8184c5c1>] down_read+0x51/0xa0
[   20.452197]        [<ffffffff810c203b>]
usermodehelper_read_trylock+0x5b/0x130
[   20.452221]        [<ffffffff8157e147>] _request_firmware+0x1d7/0x880
[   20.452242]        [<ffffffff8157e821>] request_firmware+0x31/0x50
[   20.452262]        [<ffffffffa01b54a4>]
intel_guc_ucode_init+0xf4/0x400 [i915]
[   20.452305]        [<ffffffffa0213913>] i915_driver_load+0xd63/0x16e0 [i915]
[   20.452343]        [<ffffffffa00987d9>] drm_dev_register+0xa9/0xc0 [drm]
[   20.452369]        [<ffffffffa009ae3d>] drm_get_pci_dev+0x8d/0x1e0 [drm]
[   20.452396]        [<ffffffffa01521e4>] i915_pci_probe+0x34/0x50 [i915]
[   20.452421]        [<ffffffff81464675>] local_pci_probe+0x45/0xa0
[   20.452443]        [<ffffffff81465a6d>] pci_device_probe+0xfd/0x140
[   20.452464]        [<ffffffff8156a2e4>] driver_probe_device+0x224/0x480
[   20.452486]        [<ffffffff8156a5c8>] __driver_attach+0x88/0x90
[   20.452505]        [<ffffffff81567cf3>] bus_for_each_dev+0x73/0xc0
[   20.452526]        [<ffffffff81569a7e>] driver_attach+0x1e/0x20
[   20.452546]        [<ffffffff815695ae>] bus_add_driver+0x1ee/0x280
[   20.452566]        [<ffffffff8156b100>] driver_register+0x60/0xe0
[   20.453197]        [<ffffffff81464050>] __pci_register_driver+0x60/0x70
[   20.453845]        [<ffffffffa009b070>] drm_pci_init+0xe0/0x110 [drm]
[   20.454497]        [<ffffffffa027f092>] 0xffffffffa027f092
[   20.455156]        [<ffffffff81002123>] do_one_initcall+0xb3/0x200
[   20.455796]        [<ffffffff811d8c01>] do_init_module+0x5f/0x1e7
[   20.456434]        [<ffffffff8114c4e6>] load_module+0x2126/0x27d0
[   20.457071]        [<ffffffff8114cdf9>] SyS_finit_module+0xb9/0xf0
[   20.457738]        [<ffffffff8184f2f2>] entry_SYSCALL_64_fastpath+0x12/0x76
[   20.458370]
               -> #0 (&dev->struct_mutex){+.+.+.}:
[   20.459773]        [<ffffffff8110584f>] __lock_acquire+0x191f/0x1ba0
[   20.460451]        [<ffffffff8110644e>] lock_acquire+0xce/0x1c0
[   20.461074]        [<ffffffffa0093c88>] drm_gem_mmap+0x138/0x290 [drm]
[   20.461693]        [<ffffffff8121a5ec>] mmap_region+0x3ec/0x670
[   20.462298]        [<ffffffff8121abb2>] do_mmap+0x342/0x420
[   20.462901]        [<ffffffff811fd9d2>] vm_mmap_pgoff+0xb2/0xf0
[   20.463532]        [<ffffffff81218f62>] SyS_mmap_pgoff+0x1f2/0x290
[   20.464118]        [<ffffffff8102187b>] SyS_mmap+0x1b/0x30
[   20.464702]        [<ffffffff8184f2f2>] entry_SYSCALL_64_fastpath+0x12/0x76
[   20.465289]
               other info that might help us debug this:

[   20.467179] Chain exists of:
                 &dev->struct_mutex --> &sb->s_type->i_mutex_key#2 -->
&mm->mmap_sem

[   20.468928]  Possible unsafe locking scenario:

[   20.470161]        CPU0                    CPU1
[   20.470745]        ----                    ----
[   20.471325]   lock(&mm->mmap_sem);
[   20.471902]                                lock(&sb->s_type->i_mutex_key#2);
[   20.472538]                                lock(&mm->mmap_sem);
[   20.473118]   lock(&dev->struct_mutex);
[   20.473704]
                *** DEADLOCK ***

Signed-off-by: Daniel Stone <daniels@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2015-11-04 13:23:15 +10:00
..
dvo_ch7xxx.c drm/i915: Constify adjusted_mode 2015-09-30 10:20:11 +02:00
dvo_ch7017.c drm/i915: Constify adjusted_mode 2015-09-30 10:20:11 +02:00
dvo_ivch.c drm/i915: Constify adjusted_mode 2015-09-30 10:20:11 +02:00
dvo_ns2501.c drm/i915: Constify adjusted_mode 2015-09-30 10:20:11 +02:00
dvo_sil164.c drm/i915: Constify adjusted_mode 2015-09-30 10:20:11 +02:00
dvo_tfp410.c drm/i915: Constify adjusted_mode 2015-09-30 10:20:11 +02:00
dvo.h drm/i915: Constify adjusted_mode 2015-09-30 10:20:11 +02:00
i915_cmd_parser.c drm/i915: Add GEN7_GPGPU_DISPATCHDIMX/Y/Z to the register whitelist 2015-10-06 10:40:22 +02:00
i915_debugfs.c Merge tag 'drm-intel-next-fixes-2015-10-22' of git://anongit.freedesktop.org/drm-intel into drm-next 2015-10-30 09:45:33 +10:00
i915_dma.c drm/i915: Fix locking around GuC firmware load 2015-11-04 13:23:15 +10:00
i915_drv.c drm/i915/guc: Add host2guc notification for suspend and resume 2015-10-06 10:32:22 +02:00
i915_drv.h Merge tag 'drm-intel-next-fixes-2015-10-22' of git://anongit.freedesktop.org/drm-intel into drm-next 2015-10-30 09:45:33 +10:00
i915_gem_batch_pool.c
i915_gem_batch_pool.h
i915_gem_context.c drm/i915: Remove wrong warning from i915_gem_context_clean 2015-10-09 10:19:48 +02:00
i915_gem_debug.c drm/i915: Implement inter-engine read-read optimisations 2015-05-21 15:11:42 +02:00
i915_gem_dmabuf.c drm/i915: remove unused has_dma_mapping flag 2015-07-13 22:42:41 +02:00
i915_gem_evict.c drm/i915: Remove dead i915_gem_evict_everything() 2015-10-07 16:05:40 +02:00
i915_gem_execbuffer.c drm/i915: Kill DRI1 cliprects 2015-10-07 16:05:41 +02:00
i915_gem_fence.c Merge tag 'drm-intel-next-2015-10-10' of git://anongit.freedesktop.org/drm-intel into drm-next 2015-10-20 09:00:01 +10:00
i915_gem_gtt.c drm/i915: restore ggtt double-bind avoidance 2015-10-15 15:28:11 +02:00
i915_gem_gtt.h drm/i915: prevent out of range pt in the PDE macros (take 3) 2015-10-06 14:15:29 +02:00
i915_gem_render_state.c drm/i915: Add provision to extend Golden context batch 2015-07-21 09:30:57 +02:00
i915_gem_render_state.h drm/i915: Add provision to extend Golden context batch 2015-07-21 09:30:57 +02:00
i915_gem_shrinker.c drm/i915: Avoid GPU stalls from kswapd 2015-10-07 16:05:41 +02:00
i915_gem_stolen.c drm/i915: Determine the stolen memory base address on gen2 2015-10-09 10:14:43 +02:00
i915_gem_tiling.c Merge tag 'drm-intel-fixes-2015-08-14' into drm-intel-next-fixes 2015-08-14 18:11:30 +02:00
i915_gem_userptr.c drm/i915: Use a task to cancel the userptr on invalidate_range 2015-10-06 14:15:30 +02:00
i915_gem.c drm/i915: Drop i915_gem_obj_is_pinned() from set-cache-level 2015-10-13 15:52:38 +02:00
i915_gpu_error.c drm/i915: rename INSTDONE1 to GEN4_INSTDONE1 2015-10-02 14:25:19 +02:00
i915_guc_reg.h drm/i915: Parametrize UOS_RSA_SCRATCH 2015-09-30 10:20:13 +02:00
i915_guc_submission.c drm/i915/guc: Add host2guc notification for suspend and resume 2015-10-06 10:32:22 +02:00
i915_ioc32.c Merge tag 'drm-intel-fixes-2015-07-15' into drm-intel-next-queued 2015-07-15 16:36:50 +02:00
i915_irq.c Merge tag 'drm-intel-next-fixes-2015-10-22' of git://anongit.freedesktop.org/drm-intel into drm-next 2015-10-30 09:45:33 +10:00
i915_params.c drm/i915: Mark debug mod options as _unsafe 2015-09-22 17:10:53 +02:00
i915_reg.h drm/i915: Parametrize and fix SWF registers 2015-10-13 13:20:38 +02:00
i915_suspend.c drm/i915: Parametrize and fix SWF registers 2015-10-13 13:20:38 +02:00
i915_sysfs.c drm/i915/bxt: fix RC6 residency time calculation 2015-09-30 17:15:13 +02:00
i915_trace_points.c
i915_trace.h drm/i915: Add a tracepoint for the shrinker 2015-10-07 16:05:38 +02:00
i915_vgpu.c
i915_vgpu.h drm/i915: Update PV INFO page definition for Intel GVT-g 2015-09-02 11:46:12 +02:00
intel_acpi.c drm/i915: Drop unnecessary #include <linux/vga_switcheroo.h> 2015-10-13 10:18:38 +02:00
intel_atomic_plane.c drm/i915: Do not handle a null plane state. 2015-09-10 18:27:17 +02:00
intel_atomic.c drm/i915: revert a few more watermark commits 2015-10-13 13:59:55 +02:00
intel_audio.c drm/i915: Use round to closest when computing the CEA 1.001 pixel clocks 2015-10-19 17:56:02 +02:00
intel_bios.c i915: switch from acpi_os_ioremap to memremap 2015-10-13 10:22:45 +02:00
intel_bios.h drm/i915: Ignore "digital output" and "not HDMI output" bits for eDP detection 2015-09-23 16:58:29 +02:00
intel_crt.c drm/i915: s/_FDI_RXA_.../FDI_RX_...(PIPE_A)/ 2015-09-30 17:15:11 +02:00
intel_csr.c drm/i915/skl: Added a check for the hardware status of csr fw before loading. 2015-09-30 10:14:22 +02:00
intel_ddi.c drm/i915: Rename DP link training functions 2015-10-06 10:53:52 +02:00
intel_display.c drm/i915/skl+: Enable pipe CSC on cursor planes. (v2) 2015-10-15 15:21:54 +02:00
intel_dp_mst.c Merge tag 'drm-intel-next-2015-10-10' of git://anongit.freedesktop.org/drm-intel into drm-next 2015-10-20 09:00:01 +10:00
intel_dp.c drm/i915: Throw out some useless variables 2015-10-13 13:20:50 +02:00
intel_drv.h drm/i915: revert a few more watermark commits 2015-10-13 13:59:55 +02:00
intel_dsi_panel_vbt.c drm/i915: s/dpio_lock/sb_lock/ 2015-05-28 11:13:51 +02:00
intel_dsi_pll.c drm/i915/bxt: vlv_dsi_reset_clocks() can be static 2015-10-06 10:57:06 +02:00
intel_dsi.c drm/i915/bxt: get DSI pixelclock 2015-10-02 14:45:51 +02:00
intel_dsi.h drm/i915/bxt: get DSI pixelclock 2015-10-02 14:45:51 +02:00
intel_dvo.c drm/i915: Constify adjusted_mode 2015-09-30 10:20:11 +02:00
intel_fbc.c drm/i915: fix FBC buffer size checks 2015-10-09 09:35:50 +02:00
intel_fbdev.c drm/i915: don't allocate fbcon from stolen memory if it's too big 2015-10-09 09:31:58 +02:00
intel_fifo_underrun.c
intel_frontbuffer.c drm/i915: fix FBC frontbuffer tracking flushing code 2015-08-05 09:59:44 +02:00
intel_guc_fwif.h drm/i915/guc: Add host2guc notification for suspend and resume 2015-10-06 10:32:22 +02:00
intel_guc_loader.c drm/i915: Fix locking around GuC firmware load 2015-11-04 13:23:15 +10:00
intel_guc.h drm/i915/guc: Add host2guc notification for suspend and resume 2015-10-06 10:32:22 +02:00
intel_hdmi.c drm/i915: Parametrize HSW video DIP data registers 2015-10-13 13:15:50 +02:00
intel_hotplug.c Revert "drm/i915: Call encoder hotplug for init and resume cases" 2015-10-08 21:51:57 +02:00
intel_i2c.c drm/i915: Include gpio_mmio_base in GMBUS reg defines 2015-10-13 13:16:09 +02:00
intel_lrc.c Merge tag 'drm-intel-next-2015-10-10' of git://anongit.freedesktop.org/drm-intel into drm-next 2015-10-20 09:00:01 +10:00
intel_lrc.h Merge commit '06d1ee32a4d25356a710b49d5e95dbdd68bdf505' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux into drm-next 2015-10-16 10:25:28 +10:00
intel_lvds.c drm/i915: Clean up LVDS register handling 2015-10-13 13:21:15 +02:00
intel_mocs.c drm/i915: Added Programming of the MOCS 2015-07-14 17:13:14 +02:00
intel_mocs.h drm/i915: Added Programming of the MOCS 2015-07-14 17:13:14 +02:00
intel_modes.c drm/i915: Add HDMI aspect ratio property for SDVO 2015-09-30 10:20:12 +02:00
intel_opregion.c i915: switch from acpi_os_ioremap to memremap 2015-10-13 10:22:45 +02:00
intel_overlay.c drm/i915: Update intel_ring_begin() to take a request structure 2015-06-23 14:02:29 +02:00
intel_panel.c i915: switch from acpi_os_ioremap to memremap 2015-10-13 10:22:45 +02:00
intel_pm.c drm/i915: Move skl/bxt gt specific workarounds to ring init 2015-10-13 17:41:57 +02:00
intel_psr.c drm/i915: Parametrize HSW video DIP data registers 2015-10-13 13:15:50 +02:00
intel_renderstate_gen6.c
intel_renderstate_gen7.c
intel_renderstate_gen8.c
intel_renderstate_gen9.c
intel_renderstate.h
intel_ringbuffer.c drm/i915: Move skl/bxt gt specific workarounds to ring init 2015-10-13 17:41:57 +02:00
intel_ringbuffer.h drm/i915: Refactor common ringbuffer allocation code 2015-09-04 10:17:00 +02:00
intel_runtime_pm.c Merge tag 'drm-intel-next-2015-10-10' of git://anongit.freedesktop.org/drm-intel into drm-next 2015-10-20 09:00:01 +10:00
intel_sdvo_regs.h
intel_sdvo.c Revert "drm/i915: Call encoder hotplug for init and resume cases" 2015-10-08 21:51:57 +02:00
intel_sideband.c drm/i915: s/dpio_lock/sb_lock/ 2015-05-28 11:13:51 +02:00
intel_sprite.c drm/i915: Kill the leftover RMW from ivb_sprite_disable() 2015-10-15 18:45:52 +02:00
intel_tv.c Merge remote-tracking branch 'airlied/drm-next' into drm-intel-next 2015-09-30 08:47:41 +02:00
intel_uncore.c drm/i915: Remove dev_priv argument from NEEDS_FORCE_WAKE 2015-10-13 13:21:35 +02:00
Kconfig drm/i915: Use CONFIG_DRM_FBDEV_EMULATION 2015-08-11 14:00:29 +02:00
Makefile Merge tag 'drm-intel-next-fixes-2015-09-02' into drm-intel-next-queued 2015-09-02 14:33:42 +02:00