Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2fd5eaba authored by Daniel Vetter's avatar Daniel Vetter
Browse files

drm/vmwgfx: add proper framebuffer refcounting



Afact vmwgfx already has all the right refcounting implemented on the
backing storage, and we only need to ensure that the drm fb doesn't
disappear untimely. So holding onto the fb reference from _lookup
until vmw_kms_present has completed should be enough.

Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 623f9783
Loading
Loading
Loading
Loading
+3 −5
Original line number Original line Diff line number Diff line
@@ -171,8 +171,6 @@ int vmw_present_ioctl(struct drm_device *dev, void *data,
		ret = -EINVAL;
		ret = -EINVAL;
		goto out_no_fb;
		goto out_no_fb;
	}
	}
	/* fb is protect by the mode_config lock, so drop the ref immediately */
	drm_framebuffer_unreference(fb);
	vfb = vmw_framebuffer_to_vfb(fb);
	vfb = vmw_framebuffer_to_vfb(fb);


	ret = ttm_read_lock(&vmaster->lock, true);
	ret = ttm_read_lock(&vmaster->lock, true);
@@ -197,6 +195,7 @@ int vmw_present_ioctl(struct drm_device *dev, void *data,
out_no_surface:
out_no_surface:
	ttm_read_unlock(&vmaster->lock);
	ttm_read_unlock(&vmaster->lock);
out_no_ttm_lock:
out_no_ttm_lock:
	drm_framebuffer_unreference(fb);
out_no_fb:
out_no_fb:
	drm_modeset_unlock_all(dev);
	drm_modeset_unlock_all(dev);
out_no_copy:
out_no_copy:
@@ -256,14 +255,12 @@ int vmw_present_readback_ioctl(struct drm_device *dev, void *data,
		ret = -EINVAL;
		ret = -EINVAL;
		goto out_no_fb;
		goto out_no_fb;
	}
	}
	/* fb is protect by the mode_config lock, so drop the ref immediately */
	drm_framebuffer_unreference(fb);


	vfb = vmw_framebuffer_to_vfb(fb);
	vfb = vmw_framebuffer_to_vfb(fb);
	if (!vfb->dmabuf) {
	if (!vfb->dmabuf) {
		DRM_ERROR("Framebuffer not dmabuf backed.\n");
		DRM_ERROR("Framebuffer not dmabuf backed.\n");
		ret = -EINVAL;
		ret = -EINVAL;
		goto out_no_fb;
		goto out_no_ttm_lock;
	}
	}


	ret = ttm_read_lock(&vmaster->lock, true);
	ret = ttm_read_lock(&vmaster->lock, true);
@@ -276,6 +273,7 @@ int vmw_present_readback_ioctl(struct drm_device *dev, void *data,


	ttm_read_unlock(&vmaster->lock);
	ttm_read_unlock(&vmaster->lock);
out_no_ttm_lock:
out_no_ttm_lock:
	drm_framebuffer_unreference(fb);
out_no_fb:
out_no_fb:
	drm_modeset_unlock_all(dev);
	drm_modeset_unlock_all(dev);
out_no_copy:
out_no_copy: