linux/drivers/gpu/drm/i915
Tvrtko Ursulin e9f24d5fb7 drm/i915: Clean up associated VMAs on context destruction
Prevent leaking VMAs and PPGTT VMs when objects are imported
via flink.

Scenario is that any VMAs created by the importer will be left
dangling after the importer exits, or destroys the PPGTT context
with which they are associated.

This is caused by object destruction not running when the
importer closes the buffer object handle due the reference held
by the exporter. This also leaks the VM since the VMA has a
reference on it.

In practice these leaks can be observed by stopping and starting
the X server on a kernel with fbcon compiled in. Every time
X server exits another VMA will be leaked against the fbcon's
frame buffer object.

Also on systems where flink buffer sharing is used extensively,
like Android, this leak has even more serious consequences.

This version is takes a general approach from the  earlier work
by Rafael Barbalho (drm/i915: Clean-up PPGTT on context
destruction) and tries to incorporate the subsequent discussion
between Chris Wilson and Daniel Vetter.

v2:

Removed immediate cleanup on object retire - it was causing a
recursive VMA unbind via i915_gem_object_wait_rendering. And
it is in fact not even needed since by definition context
cleanup worker runs only after the last context reference has
been dropped, hence all VMAs against the VM belonging to the
context are already on the inactive list.

v3:

Previous version could deadlock since VMA unbind waits on any
rendering on an object to complete. Objects can be busy in a
different VM which would mean that the cleanup loop would do
the wait with the struct mutex held.

This is an even simpler approach where we just unbind VMAs
without waiting since we know all VMAs belonging to this VM
are idle, and there is nothing in flight, at the point
context destructor runs.

v4:

Double underscore prefix for __915_vma_unbind_no_wait and a
commit message typo fix. (Michel Thierry)

Note that this is just a partial/interim fix since we have a bit a
fundamental issue with cleaning up, e.g.

https://bugs.freedesktop.org/show_bug.cgi?id=87729

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Testcase: igt/gem_ppgtt.c/flink-and-exit-vma-leak
Reviewed-by: Michel Thierry <michel.thierry@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Rafael Barbalho <rafael.barbalho@intel.com>
Cc: Michel Thierry <michel.thierry@intel.com>
[danvet: Add a note that this isn't everything.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2015-10-06 14:13:26 +02: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 drm/i915: unlock on error in i915_ppgtt_info() 2015-10-05 10:01:02 +02:00
i915_dma.c drm/i915/bdw: Check for slice, subslice and EU count for BDW 2015-09-30 14:13:03 +02: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 drm/i915: Clean up associated VMAs on context destruction 2015-10-06 14:13:26 +02:00
i915_gem_batch_pool.c
i915_gem_batch_pool.h
i915_gem_context.c drm/i915: Clean up associated VMAs on context destruction 2015-10-06 14:13:26 +02:00
i915_gem_debug.c
i915_gem_dmabuf.c drm/i915: remove unused has_dma_mapping flag 2015-07-13 22:42:41 +02:00
i915_gem_evict.c
i915_gem_execbuffer.c drm/i915: Wa32bitGeneralStateOffset & Wa32bitInstructionBaseOffset 2015-10-01 18:12:17 +02:00
i915_gem_fence.c drm/i915: Parametrize fence registers 2015-09-30 10:20:03 +02:00
i915_gem_gtt.c drm/i915: Add LO/HI PRIVATE_PAT registers 2015-09-30 10:20:13 +02:00
i915_gem_gtt.h drm/i915: Enable querying offset of UV plane with intel_plane_obj_offset 2015-09-23 17:31: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
i915_gem_stolen.c drm/i915: don't use the first stolen page on Broadwell 2015-09-30 10:20:05 +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/userptr: Kill user_size limit check 2015-08-14 18:16:27 +02:00
i915_gem.c drm/i915: Clean up associated VMAs on context destruction 2015-10-06 14:13:26 +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 drm/i915: Use czclk_freq in vlv c0 residency calculations 2015-09-30 10:20:39 +02: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: Add GEN7_GPGPU_DISPATCHDIMX/Y/Z to the register whitelist 2015-10-06 10:40:22 +02:00
i915_suspend.c drm/i915: use dev_priv for the FBC functions 2015-07-08 11:39:45 +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: cleanup pipe_update trace functions with new crtc debug info v3 2015-09-18 14:15:19 +03: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: Spell vga_switcheroo consistently 2015-09-22 17:10:52 +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/ivb: Move WaCxSRDisabledForSpriteScaling w/a to atomic check 2015-09-30 17:15:42 +02:00
intel_audio.c drm/i915: Constify adjusted_mode 2015-09-30 10:20:11 +02:00
intel_bios.c Merge remote-tracking branch 'airlied/drm-next' into drm-intel-next 2015-09-30 08:47:41 +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/bxt: DSI encoder support in CRTC modeset 2015-10-02 14:27:55 +02:00
intel_dp_mst.c drm/i915: Rename DP link training functions 2015-10-06 10:53:52 +02:00
intel_dp.c drm/i915: Rename DP link training functions 2015-10-06 10:53:52 +02:00
intel_drv.h drm/i915: Rename DP link training functions 2015-10-06 10:53:52 +02:00
intel_dsi_panel_vbt.c
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: export size_is_valid() from __intel_fbc_update() 2015-09-30 10:20:07 +02:00
intel_fbdev.c Merge remote-tracking branch 'airlied/drm-next' into drm-intel-next 2015-09-30 08:47:41 +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/guc: Add host2guc notification for suspend and resume 2015-10-06 10:32:22 +02: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: Add hot_plug hook for hdmi encoder 2015-10-06 10:52:22 +02:00
intel_hotplug.c drm/i915: Call encoder hotplug for init and resume cases 2015-10-06 10:25:55 +02:00
intel_i2c.c Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2015-06-26 13:18:51 -07:00
intel_lrc.c drm/i915: Remove extraneous request cancel. 2015-09-23 17:33:55 +02:00
intel_lrc.h drm/i915: Parametrize LRC registers 2015-09-23 17:13:01 +02:00
intel_lvds.c drm/i915: Always call the adjusted mode 'adjusted_mode' 2015-09-30 10:19:52 +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 drm/i915/bxt: DSI encoder support in CRTC modeset 2015-10-02 14:27:55 +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 drm/i915/bxt: Modify BXT BLC according to VBT changes 2015-10-02 14:59:25 +02:00
intel_pm.c drm/i915: Update Promotion timer for RC6 TO Mode 2015-10-06 10:34:27 +02:00
intel_psr.c drm/i915: VLV/CHV PSR: Increase wait delay time before active PSR. 2015-08-05 10:07:44 +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/gen8: Move WaHdcDisableFetchWhenMasked to common init fn 2015-09-30 10:20:34 +02:00
intel_ringbuffer.h drm/i915: Refactor common ringbuffer allocation code 2015-09-04 10:17:00 +02:00
intel_runtime_pm.c drm/i915: Skip CHV PHY asserts until PHY has been fully reset 2015-10-06 10:29:40 +02:00
intel_sdvo_regs.h
intel_sdvo.c drm/i915: Call encoder hotplug for init and resume cases 2015-10-06 10:25:55 +02:00
intel_sideband.c
intel_sprite.c drm/i915: Drop intel_update_sprite_watermarks 2015-09-30 17:15:47 +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: Include MCHBAR_MIRROR_BASE in ILK_GDSR 2015-09-30 10:20:15 +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