@@ -462,6 +462,9 @@ int vmw_bo_create(struct vmw_private *vmw,
462462 return - ENOMEM ;
463463 }
464464
465+ /*
466+ * vmw_bo_init will delete the *p_bo object if it fails
467+ */
465468 ret = vmw_bo_init (vmw , * p_bo , size ,
466469 placement , interruptible , pin ,
467470 bo_free );
@@ -470,7 +473,6 @@ int vmw_bo_create(struct vmw_private *vmw,
470473
471474 return ret ;
472475out_error :
473- kfree (* p_bo );
474476 * p_bo = NULL ;
475477 return ret ;
476478}
@@ -596,6 +598,7 @@ static int vmw_user_bo_synccpu_release(struct drm_file *filp,
596598 ttm_bo_put (& vmw_bo -> base );
597599 }
598600
601+ drm_gem_object_put (& vmw_bo -> base .base );
599602 return ret ;
600603}
601604
@@ -636,6 +639,7 @@ int vmw_user_bo_synccpu_ioctl(struct drm_device *dev, void *data,
636639
637640 ret = vmw_user_bo_synccpu_grab (vbo , arg -> flags );
638641 vmw_bo_unreference (& vbo );
642+ drm_gem_object_put (& vbo -> base .base );
639643 if (unlikely (ret != 0 )) {
640644 if (ret == - ERESTARTSYS || ret == - EBUSY )
641645 return - EBUSY ;
@@ -693,7 +697,7 @@ int vmw_bo_unref_ioctl(struct drm_device *dev, void *data,
693697 * struct vmw_buffer_object should be placed.
694698 * Return: Zero on success, Negative error code on error.
695699 *
696- * The vmw buffer object pointer will be refcounted.
700+ * The vmw buffer object pointer will be refcounted (both ttm and gem)
697701 */
698702int vmw_user_bo_lookup (struct drm_file * filp ,
699703 uint32_t handle ,
@@ -710,7 +714,6 @@ int vmw_user_bo_lookup(struct drm_file *filp,
710714
711715 * out = gem_to_vmw_bo (gobj );
712716 ttm_bo_get (& (* out )-> base );
713- drm_gem_object_put (gobj );
714717
715718 return 0 ;
716719}
@@ -791,7 +794,8 @@ int vmw_dumb_create(struct drm_file *file_priv,
791794 ret = vmw_gem_object_create_with_handle (dev_priv , file_priv ,
792795 args -> size , & args -> handle ,
793796 & vbo );
794-
797+ /* drop reference from allocate - handle holds it now */
798+ drm_gem_object_put (& vbo -> base .base );
795799 return ret ;
796800}
797801
0 commit comments