linux/include/drm
Dave Airlie 735dc0d1e2 Merge branch 'drm-kms-locking' of git://people.freedesktop.org/~danvet/drm-intel into drm-next
The aim of this locking rework is that ioctls which a compositor should be
might call for every frame (set_cursor, page_flip, addfb, rmfb and
getfb/create_handle) should not be able to block on kms background
activities like output detection. And since each EDID read takes about
25ms (in the best case), that always means we'll drop at least one frame.

The solution is to add per-crtc locking for these ioctls, and restrict
background activities to only use the global lock. Change-the-world type
of events (modeset, dpms, ...) need to grab all locks.

Two tricky parts arose in the conversion:
- A lot of current code assumes that a kms fb object can't disappear while
  holding the global lock, since the current code serializes fb
  destruction with it. Hence proper lifetime management using the already
  created refcounting for fbs need to be instantiated for all ioctls and
  interfaces/users.

- The rmfb ioctl removes the to-be-deleted fb from all active users. But
  unconditionally taking the global kms lock to do so introduces an
  unacceptable potential stall point. And obviously changing the userspace
  abi isn't on the table, either. Hence this conversion opportunistically
  checks whether the rmfb ioctl holds the very last reference, which
  guarantees that the fb isn't in active use on any crtc or plane (thanks
  to the conversion to the new lifetime rules using proper refcounting).
  Only if this is not the case will the code go through the slowpath and
  grab all modeset locks. Sane compositors will never hit this path and so
  avoid the stall, but userspace relying on these semantics will also not
  break.

All these cases are exercised by the newly added subtests for the i-g-t
kms_flip, tested on a machine where a full detect cycle takes around 100
ms.  It works, and no frames are dropped any more with these patches
applied.  kms_flip also contains a special case to exercise the
above-describe rmfb slowpath.

* 'drm-kms-locking' of git://people.freedesktop.org/~danvet/drm-intel: (335 commits)
  drm/fb_helper: check whether fbcon is bound
  drm/doc: updates for new framebuffer lifetime rules
  drm: don't hold crtc mutexes for connector ->detect callbacks
  drm: only grab the crtc lock for pageflips
  drm: optimize drm_framebuffer_remove
  drm/vmwgfx: add proper framebuffer refcounting
  drm/i915: dump refcount into framebuffer debugfs file
  drm: refcounting for crtc framebuffers
  drm: refcounting for sprite framebuffers
  drm: fb refcounting for dirtyfb_ioctl
  drm: don't take modeset locks in getfb ioctl
  drm: push modeset_lock_all into ->fb_create driver callbacks
  drm: nest modeset locks within fpriv->fbs_lock
  drm: reference framebuffers which are on the idr
  drm: revamp framebuffer cleanup interfaces
  drm: create drm_framebuffer_lookup
  drm: revamp locking around fb creation/destruction
  drm: only take the crtc lock for ->cursor_move
  drm: only take the crtc lock for ->cursor_set
  drm: add per-crtc locks
  ...
2013-01-21 07:44:58 +10:00
..
i2c drm: Import driver for the sil164 I2C TMDS transmitter. 2010-08-02 10:21:13 +10:00
ttm drm/ttm: remove no_wait_reserve, v3 2012-12-10 20:21:30 +10:00
drm_buffer.h UAPI: (Scripted) Convert #include "..." to #include <path/...> in kernel system headers 2012-10-02 18:01:25 +01:00
drm_cache.h
drm_core.h drm: Fix support for PCI domains 2010-08-10 08:20:20 +10:00
drm_crtc_helper.h drm: extract drm_kms_helper_hotplug_event 2012-11-20 15:50:32 +10:00
drm_crtc.h drm: revamp framebuffer cleanup interfaces 2013-01-20 22:17:00 +01:00
drm_dp_helper.h drm/doc: add new dp helpers into drm DocBook 2012-11-28 20:26:53 +10:00
drm_edid.h drm/edid: Add packed attribute to new gtf2 and cvt structs 2012-04-23 17:41:17 +01:00
drm_encoder_slave.h UAPI: (Scripted) Convert #include "..." to #include <path/...> in kernel system headers 2012-10-02 18:01:25 +01:00
drm_fb_cma_helper.h DRM: Add DRM KMS/FB CMA helper 2012-09-18 12:28:21 +02:00
drm_fb_helper.h drm fb helper: remove unused variable crtc_id 2012-02-03 09:55:52 +00:00
drm_fixed.h drm: fixed: Add dfixed_frac 2012-04-27 09:29:35 +01:00
drm_gem_cma_helper.h DRM: Add DRM GEM CMA helper 2012-09-18 12:28:21 +02:00
drm_global.h drm: move ttm global code to core drm 2010-08-04 09:46:06 +10:00
drm_hashtab.h drm: Add a hash-tab rcu-safe API 2012-11-28 18:36:05 +10:00
drm_mem_util.h introduce SIZE_MAX 2012-05-31 17:49:26 -07:00
drm_memory.h UAPI: (Scripted) Convert #include "..." to #include <path/...> in kernel system headers 2012-10-02 18:01:25 +01:00
drm_mm.h Merge branch 'drm-kms-locking' of git://people.freedesktop.org/~danvet/drm-intel into drm-next 2013-01-21 07:44:58 +10:00
drm_os_linux.h
drm_pciids.h drm/radeon: add new SI pci id 2012-11-21 18:37:38 -05:00
drm_sysfs.h
drm_usb.h drm: add usb framework 2011-02-07 13:09:42 +10:00
drmP.h drm: revamp locking around fb creation/destruction 2013-01-20 22:16:58 +01:00
exynos_drm.h drm/exynos: change file license to GPL 2013-01-04 15:54:32 +09:00
gma_drm.h gma500: fix ioctl confict 2012-03-10 13:06:04 +00:00
i915_drm.h UAPI: (Scripted) Disintegrate include/drm 2012-10-04 18:21:50 +01:00
intel-gtt.h drm/i915: Move GSM mapping into dev_priv 2012-12-20 16:28:42 +01:00