linux/drivers/gpu/drm/i915
Dave Gordon 0d92a6a4f6 drm/i915/guc: keep GuC doorbell & process descriptor mapped in kernel
Don't use kmap_atomic() for doorbell & process descriptor access.
This patch fixes the BUG shown below, where the thread could sleep
while holding a kmap_atomic mapping. In order not to need to call
kmap_atomic() in this code path, we now set up a permanent kernel
mapping of the shared doorbell and process-descriptor page, and
use that in all doorbell and process-descriptor related code.

  BUG: scheduling while atomic: gem_close_race/1941/0x00000002
  Modules linked in: hid_generic usbhid i915 asix usbnet libphy mii
    i2c_algo_bit drm_kms_helper cfbfillrect syscopyarea cfbimgblt
    sysfillrect sysimgblt fb_sys_fops cfbcopyarea drm coretemp i2c_hid
    hid video pinctrl_sunrisepoint pinctrl_intel acpi_pad nls_iso8859_1
    e1000e ptp psmouse pps_core ahci libahci
  CPU: 0 PID: 1941 Comm: gem_close_race Tainted: G     U 4.4.0-160121+ #123
  Hardware name: Intel Corporation Skylake Client platform/Skylake AIO
    DDR3L RVP10, BIOS SKLSE2R1.R00.X100.B01.1509220551 09/22/2015
    0000000000013e40 ffff880166c27a78 ffffffff81280d02 ffff880172c13e40
    ffff880166c27a88 ffffffff810c203a ffff880166c27ac8 ffffffff814ec808
    ffff88016b7c6000 ffff880166c28000 00000000000f4240 0000000000000001
  Call Trace:
    [<ffffffff81280d02>] dump_stack+0x4b/0x79
    [<ffffffff810c203a>] __schedule_bug+0x41/0x4f
    [<ffffffff814ec808>] __schedule+0x5a8/0x690
    [<ffffffff814ec927>] schedule+0x37/0x80
    [<ffffffff814ef3fd>] schedule_hrtimeout_range_clock+0xad/0x130
    [<ffffffff81090be0>] ? hrtimer_init+0x10/0x10
    [<ffffffff814ef3f1>] ?  schedule_hrtimeout_range_clock+0xa1/0x130
    [<ffffffff814ef48e>] schedule_hrtimeout_range+0xe/0x10
    [<ffffffff814eef9b>] usleep_range+0x3b/0x40
    [<ffffffffa01ec109>] i915_guc_wq_check_space+0x119/0x210 [i915]
    [<ffffffffa01da47c>] intel_logical_ring_alloc_request_extras+0x5c/0x70 [i915]
    [<ffffffffa01cdbf1>] i915_gem_request_alloc+0x91/0x170 [i915]
    [<ffffffffa01c1c07>] i915_gem_do_execbuffer.isra.25+0xbc7/0x12a0 [i915]
    [<ffffffffa01cb785>] ?  i915_gem_object_get_pages_gtt+0x225/0x3c0 [i915]
    [<ffffffffa01d1fb6>] ? i915_gem_pwrite_ioctl+0xd6/0x9f0 [i915]
    [<ffffffffa01c2e68>] i915_gem_execbuffer2+0xa8/0x250 [i915]
    [<ffffffffa00f65d8>] drm_ioctl+0x258/0x4f0 [drm]
    [<ffffffffa01c2dc0>] ? i915_gem_execbuffer+0x340/0x340 [i915]
    [<ffffffff8111590d>] do_vfs_ioctl+0x2cd/0x4a0
    [<ffffffff8111eac2>] ? __fget+0x72/0xb0
    [<ffffffff81115b1c>] SyS_ioctl+0x3c/0x70
    [<ffffffff814effd7>] entry_SYSCALL_64_fastpath+0x12/0x6a
  ------------[ cut here ]------------

v4:
  Only tear down doorbell & kunmap() client object if we actually
  succeeded in allocating a client object (Tvrtko Ursulin)

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93847
Original-version-by: Alex Dai <yu.dai@intel.com>
Signed-off-by: Dave Gordon <david.s.gordon@intel.com>
Cc: Tvtrko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
2016-04-20 14:45:49 +01:00
..
Kconfig drm/i915: Kconfig for extra driver debugging 2016-03-03 17:26:57 +00:00
Kconfig.debug drm/i915: Add GEM debugging Kconfig option 2016-04-14 10:45:40 +01:00
Makefile drm/i915: Force clean compilation with -Werror 2016-04-14 10:45:40 +01:00
dvo.h drm/i915: constify intel_dvo_dev_ops structures 2015-12-09 08:21:10 +01:00
dvo_ch7xxx.c drm/i915: constify intel_dvo_dev_ops structures 2015-12-09 08:21:10 +01:00
dvo_ch7017.c drm/i915: constify intel_dvo_dev_ops structures 2015-12-09 08:21:10 +01:00
dvo_ivch.c drm/i915: constify intel_dvo_dev_ops structures 2015-12-09 08:21:10 +01:00
dvo_ns2501.c drm/i915: constify intel_dvo_dev_ops structures 2015-12-09 08:21:10 +01:00
dvo_sil164.c drm/i915: constify intel_dvo_dev_ops structures 2015-12-09 08:21:10 +01:00
dvo_tfp410.c drm/i915: constify intel_dvo_dev_ops structures 2015-12-09 08:21:10 +01:00
i915_cmd_parser.c drm/i915: Bump command parser version for new whitelisted registers 2016-03-21 10:03:26 +01:00
i915_debugfs.c drm/i915: Show pin mapped counts and sizes in debugfs 2016-04-15 14:53:29 +01:00
i915_dma.c drm/i915: Clean up PCI config register handling 2016-04-19 17:57:33 +03:00
i915_drv.c drm/i915/gen9: Fix runtime PM refcounting in case DMC firmware isn't loaded 2016-04-19 12:33:48 +03:00
i915_drv.h drm/i915/bxt: Enable runtime PM 2016-04-15 14:48:19 +03:00
i915_gem.c drm/i915: Remove a couple pointless WARN_ONs 2016-04-20 09:59:17 +01:00
i915_gem.h drm/i915: Add GEM debugging Kconfig option 2016-04-14 10:45:40 +01:00
i915_gem_batch_pool.c
i915_gem_batch_pool.h
i915_gem_context.c drm/i915: Reorganise legacy context switch to cope with late failure 2016-04-14 10:45:40 +01:00
i915_gem_debug.c drm/i915: replace for_each_engine() 2016-03-24 14:34:11 +00:00
i915_gem_dmabuf.c Linux 4.6-rc3 2016-04-11 19:25:13 +02:00
i915_gem_evict.c drm/i915: Rename vma->*_list to *_link for consistency 2016-02-26 13:15:39 +00:00
i915_gem_execbuffer.c drm/i915: Late request cancellations are harmful 2016-04-14 10:45:40 +01:00
i915_gem_fence.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2016-03-17 21:38:27 -07:00
i915_gem_gtt.c drm/i915: call kunmap_px on pt_vaddr 2016-04-19 17:24:17 +03:00
i915_gem_gtt.h drm/i915: Refer to GGTT {,VM} consistently 2016-03-31 17:55:43 +03:00
i915_gem_render_state.c drm/i915: Rename intel_engine_cs struct members 2016-03-16 15:33:17 +00:00
i915_gem_render_state.h drm/i915: Rename intel_engine_cs function parameters 2016-03-16 15:33:10 +00:00
i915_gem_shrinker.c drm/i915/shrinker: Only shmemfs objects are backed by swap 2016-04-20 13:49:44 +01:00
i915_gem_stolen.c drm/i915: Clean up PCI config register handling 2016-04-19 17:57:33 +03:00
i915_gem_tiling.c drm/i915: get runtime PM reference around GEM set_tiling IOCTL 2015-11-17 18:43:30 +02:00
i915_gem_userptr.c drm/i915: Prevent leaking of -EIO from i915_wait_request() 2016-04-14 10:45:40 +01:00
i915_gpu_error.c drm/i915: Separate out the seqno-barrier from engine->get_seqno 2016-04-09 12:09:05 +01:00
i915_guc_reg.h drm/i915/guc: always reset GuC before loading firmware 2016-04-05 13:29:24 +01:00
i915_guc_submission.c drm/i915/guc: keep GuC doorbell & process descriptor mapped in kernel 2016-04-20 14:45:49 +01:00
i915_ioc32.c
i915_irq.c drm/i915/gen8+: Do not enable DPF interrupt since the handler does not exist 2016-04-20 09:59:16 +01:00
i915_params.c drm/i915: Add fault injection support 2016-03-17 15:22:09 +02:00
i915_params.h drm/i915: Add fault injection support 2016-03-17 15:22:09 +02:00
i915_reg.h drm/i915/gen9: implement WaEnableSamplerGPGPUPreemptionSupport 2016-04-20 09:58:19 +01:00
i915_suspend.c drm/i915/bxt: Don't save/restore eDP panel power during suspend (v3) 2016-02-08 11:32:32 +02:00
i915_sysfs.c drm/i915: Hold RPM reference while setting freq limits through sysfs 2016-03-02 18:50:47 +02:00
i915_trace.h drm/i915: Separate out the seqno-barrier from engine->get_seqno 2016-04-09 12:09:05 +01:00
i915_trace_points.c
i915_vgpu.c drm/i915: Refer to GGTT {,VM} consistently 2016-03-31 17:55:43 +03:00
i915_vgpu.h drm/i915: Type safe register read/write 2015-11-18 15:39:11 +02:00
intel_acpi.c drm/i915: Drop unnecessary #include <linux/vga_switcheroo.h> 2015-10-13 10:18:38 +02:00
intel_atomic.c drm/i915: Remove some post-commit members from intel_crtc->atomic, v3. 2016-03-16 14:50:25 +01:00
intel_atomic_plane.c drm/i915: Pass the correct crtc state to .update_plane() 2016-03-10 13:49:31 +02:00
intel_audio.c drm/i915: Do not use {HAS_*, IS_*, INTEL_INFO}(dev_priv->dev) 2016-04-07 14:50:26 +03:00
intel_bios.c drm/i915: Get panel_type from OpRegion panel details 2016-04-12 13:23:43 +03:00
intel_bios.h drm/i915: hide away VBT private data in a separate header 2016-03-17 11:58:57 +02:00
intel_color.c drm/i915: Do not check crtc_state->active in intel_color_load_luts. 2016-03-31 12:46:07 +02:00
intel_crt.c drm/i915: Move HSW/BDW pll selection logic to intel_dpll_mgr.c 2016-03-09 11:55:31 +02:00
intel_csr.c drm/i915/gen9: Fix runtime PM refcounting in case DMC firmware isn't loaded 2016-04-19 12:33:48 +03:00
intel_ddi.c drm/i915/ddi: Fix eDP VDD handling during booting and suspend/resume 2016-04-19 12:33:11 +03:00
intel_display.c drm/i915: Fix oops in vlv_force_pll_on() 2016-04-19 14:42:40 +03:00
intel_dp.c drm/i915: Fixing eDP detection on certain platforms 2016-04-19 18:43:32 +03:00
intel_dp_link_training.c drm/i915/dp: reduce missing TPS3 support errors to debug logging 2016-02-08 11:37:17 +02:00
intel_dp_mst.c drm/i915: Fix race condition in intel_dp_destroy_mst_connector() 2016-03-17 09:12:28 +01:00
intel_dpll_mgr.c drm/i915/bxt: PORT_PLL_REF_SEL bit should be set for all BXT variations 2016-04-15 16:10:59 +03:00
intel_dpll_mgr.h drm/i915: Use a crtc mask instead of a refcount for dpll functions, v2. 2016-03-17 09:27:28 +01:00
intel_drv.h drm/i915/gen9: Fix runtime PM refcounting in case DMC firmware isn't loaded 2016-04-19 12:33:48 +03:00
intel_dsi.c drm/i915: Wait for power cycle delay after turning off DSI panel power 2016-04-19 14:57:33 +03:00
intel_dsi.h drm/i915: Compute DSI PLL parameters during .compute_config() 2016-04-15 16:25:27 +03:00
intel_dsi_panel_vbt.c drm/i915: Sharing the pixel_format_from_vbt to whole i915 2016-04-07 16:46:06 +03:00
intel_dsi_pll.c drm/i915: Eliminate {vlv,bxt}_configure_dsi_pll() 2016-04-15 16:25:27 +03:00
intel_dvo.c drm: Pass 'name' to drm_encoder_init() 2015-12-11 09:13:20 +01:00
intel_fbc.c drm/i915: Refer to GGTT {,VM} consistently 2016-03-31 17:55:43 +03:00
intel_fbdev.c Revert "drm/i915: Fix races on fbdev" 2016-04-01 15:03:55 +03:00
intel_fifo_underrun.c drm/i915: Do not use {HAS_*, IS_*, INTEL_INFO}(dev_priv->dev) 2016-04-07 14:50:26 +03:00
intel_frontbuffer.c
intel_guc.h drm/i915/guc: keep GuC doorbell & process descriptor mapped in kernel 2016-04-20 14:45:49 +01:00
intel_guc_fwif.h drm/i915/guc: Decouple GuC engine id from ring id 2016-01-25 10:56:30 +00:00
intel_guc_loader.c drm/i915/guc: always reset GuC before loading firmware 2016-04-05 13:29:24 +01:00
intel_hdmi.c drm/i915: Do not use {HAS_*, IS_*, INTEL_INFO}(dev_priv->dev) 2016-04-07 14:50:26 +03:00
intel_hotplug.c drm/i915: intel_hpd_init(): Fix suspend/resume reprobing 2016-01-13 10:49:42 +02:00
intel_i2c.c drm/i915: Make GMBUS timeout message DRM_DEBUG_KMS 2016-04-12 13:23:17 +03:00
intel_lrc.c drm/i915: Remove a couple pointless WARN_ONs 2016-04-20 09:59:17 +01:00
intel_lrc.h drm/i915: Disentangle i915_drv.h includes 2016-04-14 10:45:40 +01:00
intel_lvds.c drm/i915: fix deadlock on lid open 2016-03-30 12:17:13 +02:00
intel_mocs.c drm/i915/mocs: Program MOCS for all engines on init 2016-04-14 10:45:40 +01:00
intel_mocs.h drm/i915/mocs: Program MOCS for all engines on init 2016-04-14 10:45:40 +01:00
intel_modes.c drm/i915: Add HDMI aspect ratio property for SDVO 2015-09-30 10:20:12 +02:00
intel_opregion.c drm/i915: Clean up PCI config register handling 2016-04-19 17:57:33 +03:00
intel_overlay.c drm/i915: Late request cancellations are harmful 2016-04-14 10:45:40 +01:00
intel_panel.c drm/i915: Clean up PCI config register handling 2016-04-19 17:57:33 +03:00
intel_pm.c drm/i915: Ignore GTFIFODBG FIFO free entry fields on CHV 2016-04-14 14:45:00 +03:00
intel_psr.c drm/i915: Do not use {HAS_*, IS_*, INTEL_INFO}(dev_priv->dev) 2016-04-07 14:50:26 +03:00
intel_renderstate.h
intel_renderstate_gen6.c
intel_renderstate_gen7.c
intel_renderstate_gen8.c
intel_renderstate_gen9.c
intel_ringbuffer.c drm/i915: Remove a couple pointless WARN_ONs 2016-04-20 09:59:17 +01:00
intel_ringbuffer.h drm/i915: Only grab correct forcewake for the engine with execlists 2016-04-12 15:35:22 +01:00
intel_runtime_pm.c drm/i915: Define HSW/BDW display power domains the right way up 2016-04-19 14:43:22 +03:00
intel_sdvo.c drm/i915: move sdvo mappings to vbt data 2016-03-29 15:12:30 +03:00
intel_sdvo_regs.h drm/i915/sdvo: revert bogus kernel-doc comments to normal comments 2016-01-20 10:21:34 +02:00
intel_sideband.c drm/i915: Extend gpio read/write to other cores 2016-02-04 19:11:17 +02:00
intel_sprite.c drm/i915: Fix plane init failure paths 2016-04-01 23:24:21 +03:00
intel_tv.c drm/i915: move VBT based TV presence check to intel_bios.c 2016-03-16 18:28:07 +02:00
intel_uncore.c drm/i915: Use fw_domains_put_with_fifo() on HSW 2016-04-14 15:02:16 +03:00
intel_vbt_defs.h drm/i915: Update VBT fields for child devices 2016-04-06 14:10:15 +03:00