drm/vmwgfx: Stricter count of legacy surface device resources
authorThomas Hellstrom <[email protected]>
Thu, 22 Mar 2018 09:34:00 +0000 (10:34 +0100)
committerThomas Hellstrom <[email protected]>
Thu, 22 Mar 2018 11:08:24 +0000 (12:08 +0100)
For legacy surfaces, they were previously registered as device resources
when the driver resources were created. Since they are evictable we instead
register them as device resources once they are created on the device,
just like for guest-backed surfaces. This has implications during
hibernation where we can't hibernate with device resources active.

Signed-off-by: Thomas Hellstrom <[email protected]>
Reviewed-by: Brian Paul <[email protected]>
Reviewed-by: Deepak Rawat <[email protected]>
Reviewed-by: Sinclair Yeh <[email protected]>
drivers/gpu/drm/vmwgfx/vmwgfx_surface.c

index db1bb166845eaf5033e3ca3a100625c8778a46b2..b236c48bf265b864cd378b883d8284d59d41f951 100644 (file)
@@ -345,7 +345,6 @@ static void vmw_hw_surface_destroy(struct vmw_resource *res)
                dev_priv->used_memory_size -= res->backup_size;
                mutex_unlock(&dev_priv->cmdbuf_mutex);
        }
-       vmw_fifo_resource_dec(dev_priv);
 }
 
 /**
@@ -407,6 +406,8 @@ static int vmw_legacy_srf_create(struct vmw_resource *res)
 
        vmw_surface_define_encode(srf, cmd);
        vmw_fifo_commit(dev_priv, submit_size);
+       vmw_fifo_resource_inc(dev_priv);
+
        /*
         * Surface memory usage accounting.
         */
@@ -558,6 +559,7 @@ static int vmw_legacy_srf_destroy(struct vmw_resource *res)
         */
 
        vmw_resource_release_id(res);
+       vmw_fifo_resource_dec(dev_priv);
 
        return 0;
 }
@@ -579,15 +581,11 @@ static int vmw_surface_init(struct vmw_private *dev_priv,
        struct vmw_resource *res = &srf->res;
 
        BUG_ON(!res_free);
-       if (!dev_priv->has_mob)
-               vmw_fifo_resource_inc(dev_priv);
        ret = vmw_resource_init(dev_priv, res, true, res_free,
                                (dev_priv->has_mob) ? &vmw_gb_surface_func :
                                &vmw_legacy_surface_func);
 
        if (unlikely(ret != 0)) {
-               if (!dev_priv->has_mob)
-                       vmw_fifo_resource_dec(dev_priv);
                res_free(res);
                return ret;
        }