aboutsummaryrefslogtreecommitdiffstats
path: root/include/drm/drm_crtc.h
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-12-10 15:19:18 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-01-20 16:16:58 -0500
commit4b096ac10da0b63f09bd123b86fed8deb80646ce (patch)
tree3d252a1b2ed182beb769796fb99eb68693176bfa /include/drm/drm_crtc.h
parentdac35663cef4ca7f572d430bb54b14be8f03cb10 (diff)
drm: revamp locking around fb creation/destruction
Well, at least step 1. The goal here is that framebuffer objects can survive outside of the mode_config lock, with just a reference held as protection. The first step to get there is to introduce a special fb_lock which protects fb lookup, creation and destruction, to make them appear atomic. This new fb_lock can nest within the mode_config lock. But the idea is (once the reference counting part is completed) that we only quickly take that fb_lock to lookup a framebuffer and grab a reference, without any other locks involved. vmwgfx is the only driver which does framebuffer lookups itself, also wrap those calls to drm_mode_object_find with the new lock. Also protect the fb_list walking in i915 and omapdrm with the new lock. As a slight complication there's also the list of user-created fbs attached to the file private. The problem now is that at fclose() time we need to walk that list, eventually do a modeset call to remove the fb from active usage (and are required to be able to take the mode_config lock), but in the end we need to grab the new fb_lock to remove the fb from the list. The easiest solution is to add another mutex to protect this per-file list. Currently that new fbs_lock nests within the modeset locks and so appears redudant. But later patches will switch around this sequence so that taking the modeset locks in the fb destruction path is optional in the fastpath. Ultimately the goal is that addfb and rmfb do not require the mode_config lock, since otherwise they have the potential to introduce stalls in the pageflip sequence of a compositor (if the compositor e.g. switches to a fullscreen client or if it enables a plane). But that requires a few more steps and hoops to jump through. Note that framebuffer creation/destruction is now double-protected - once by the fb_lock and in parts by the idr_lock. The later would be unnecessariy if framebuffers would have their own idr allocator. But that's material for another patch (series). v2: Properly initialize the fb->filp_head list in _init, otherwise the newly added WARN to check whether the fb isn't on a fpriv list any more will fail for driver-private objects. v3: Fixup two error-case unlock bugs spotted by Richard Wilbur. Reviewed-by: Rob Clark <rob@ti.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'include/drm/drm_crtc.h')
-rw-r--r--include/drm/drm_crtc.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index c89b1161f0be..c35a807d7e5c 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -254,6 +254,10 @@ struct drm_framebuffer {
254 * userspace perspective. 254 * userspace perspective.
255 */ 255 */
256 struct kref refcount; 256 struct kref refcount;
257 /*
258 * Place on the dev->mode_config.fb_list, access protected by
259 * dev->mode_config.fb_lock.
260 */
257 struct list_head head; 261 struct list_head head;
258 struct drm_mode_object base; 262 struct drm_mode_object base;
259 const struct drm_framebuffer_funcs *funcs; 263 const struct drm_framebuffer_funcs *funcs;
@@ -780,8 +784,18 @@ struct drm_mode_config {
780 struct mutex idr_mutex; /* for IDR management */ 784 struct mutex idr_mutex; /* for IDR management */
781 struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */ 785 struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */
782 /* this is limited to one for now */ 786 /* this is limited to one for now */
787
788
789 /**
790 * fb_lock - mutex to protect fb state
791 *
792 * Besides the global fb list his also protects the fbs list in the
793 * file_priv
794 */
795 struct mutex fb_lock;
783 int num_fb; 796 int num_fb;
784 struct list_head fb_list; 797 struct list_head fb_list;
798
785 int num_connector; 799 int num_connector;
786 struct list_head connector_list; 800 struct list_head connector_list;
787 int num_encoder; 801 int num_encoder;