From: Ville Syrjälä <[email protected]> Instead of plane->fb (which we're going to deprecate for atomic drivers) we need to look at plane->state->fb. The maze of code leading to vmw_kms_helper_dirty() wasn't particularly clear, but my analysis concluded that the calls originating from vmw_*_primary_plane_atomic_update() all pass in the crtc which means we'll never end up in this branch of the function. All other callers use drm_modeset_lock_all() somewhere higher up, which means accessing plane->state is safe. We'll toss in a lockdep assert to catch wrongdoers.
Cc: Thomas Hellstrom <[email protected]> Cc: Sinclair Yeh <[email protected]> Cc: VMware Graphics <[email protected]> Cc: Daniel Vetter <[email protected]> Signed-off-by: Ville Syrjälä <[email protected]> --- drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index a2a796b4cc23..5a824125c231 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c @@ -2326,9 +2326,18 @@ int vmw_kms_helper_dirty(struct vmw_private *dev_priv, } else { list_for_each_entry(crtc, &dev_priv->dev->mode_config.crtc_list, head) { - if (crtc->primary->fb != &framebuffer->base) - continue; - units[num_units++] = vmw_crtc_to_du(crtc); + struct drm_plane *plane = crtc->primary; + + /* + * vmw_*_primary_plane_atomic_update() pass in the crtc, + * and so don't end up here. All other callers use + * drm_modeset_lock_all(), hence we can access the + * plane state safely. + */ + lockdep_assert_held(&plane->mutex); + + if (plane->state->fb != &framebuffer->base) + units[num_units++] = vmw_crtc_to_du(crtc); } } -- 2.16.1 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
