From: Jakob Bornecrantz <ja...@vmware.com>

Signed-off-by: Jakob Bornecrantz <jakob at vmware.com>
Reviewed-by: Thomas Hellstrom <thellstrom at vmware.com>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.h     |    3 ++-
 drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c |   15 +++++++++++----
 drivers/gpu/drm/vmwgfx/vmwgfx_kms.c     |   10 +++++-----
 3 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h 
b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
index 93505ce..14c2f49 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
@@ -534,7 +534,8 @@ extern int vmw_execbuf_process(struct drm_file *file_priv,
                               uint32_t command_size,
                               uint64_t throttle_us,
                               struct drm_vmw_fence_rep __user
-                              *user_fence_rep);
+                              *user_fence_rep,
+                              struct vmw_fence_obj **out_fence);

 extern void
 vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv,
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
index 40932fb..4acced4 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
@@ -1109,10 +1109,11 @@ int vmw_execbuf_process(struct drm_file *file_priv,
                        void *kernel_commands,
                        uint32_t command_size,
                        uint64_t throttle_us,
-                       struct drm_vmw_fence_rep __user *user_fence_rep)
+                       struct drm_vmw_fence_rep __user *user_fence_rep,
+                       struct vmw_fence_obj **out_fence)
 {
        struct vmw_sw_context *sw_context = &dev_priv->ctx;
-       struct vmw_fence_obj *fence;
+       struct vmw_fence_obj *fence = NULL;
        uint32_t handle;
        void *cmd;
        int ret;
@@ -1208,8 +1209,13 @@ int vmw_execbuf_process(struct drm_file *file_priv,
        vmw_execbuf_copy_fence_user(dev_priv, vmw_fpriv(file_priv), ret,
                                    user_fence_rep, fence, handle);

-       if (likely(fence != NULL))
+       /* Don't unreference when handing fence out */
+       if (unlikely(out_fence != NULL)) {
+               *out_fence = fence;
+               fence = NULL;
+       } else if (likely(fence != NULL)) {
                vmw_fence_obj_unreference(&fence);
+       }

        mutex_unlock(&dev_priv->cmdbuf_mutex);
        return 0;
@@ -1362,7 +1368,8 @@ int vmw_execbuf_ioctl(struct drm_device *dev, void *data,
        ret = vmw_execbuf_process(file_priv, dev_priv,
                                  (void __user *)(unsigned long)arg->commands,
                                  NULL, arg->command_size, arg->throttle_us,
-                                 (void __user *)(unsigned long)arg->fence_rep);
+                                 (void __user *)(unsigned long)arg->fence_rep,
+                                 NULL);

        if (unlikely(ret != 0))
                goto out_unlock;
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index b66ef0e..12619c3 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -547,7 +547,7 @@ static int do_surface_dirty_sou(struct vmw_private 
*dev_priv,
                fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num;
                cmd->header.size = cpu_to_le32(fifo_size - sizeof(cmd->header));
                ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd,
-                                         fifo_size, 0, NULL);
+                                         fifo_size, 0, NULL, NULL);

                if (unlikely(ret != 0))
                        break;
@@ -809,7 +809,7 @@ static int do_dmabuf_define_gmrfb(struct drm_file 
*file_priv,
        cmd->body.ptr.offset = 0;

        ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd,
-                                 fifo_size, 0, NULL);
+                                 fifo_size, 0, NULL, NULL);

        kfree(cmd);

@@ -896,7 +896,7 @@ static int do_dmabuf_dirty_sou(struct drm_file *file_priv,

                fifo_size = sizeof(*blits) * hit_num;
                ret = vmw_execbuf_process(file_priv, dev_priv, NULL, blits,
-                                         fifo_size, 0, NULL);
+                                         fifo_size, 0, NULL, NULL);

                if (unlikely(ret != 0))
                        break;
@@ -1296,7 +1296,7 @@ int vmw_kms_present(struct vmw_private *dev_priv,
                fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num;
                cmd->header.size = cpu_to_le32(fifo_size - sizeof(cmd->header));
                ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd,
-                                         fifo_size, 0, NULL);
+                                         fifo_size, 0, NULL, NULL);

                if (unlikely(ret != 0))
                        break;
@@ -1409,7 +1409,7 @@ int vmw_kms_readback(struct vmw_private *dev_priv,
        fifo_size = sizeof(*cmd) + sizeof(*blits) * blits_pos;

        ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd, fifo_size,
-                                 0, user_fence_rep);
+                                 0, user_fence_rep, NULL);

        kfree(cmd);

-- 
1.7.4.4

Reply via email to