diff mbox series

[04/11] drm/vmwgfx: stop using ttm_bo_create

Message ID 20200921144856.2797-5-christian.koenig@amd.com (mailing list archive)
State New, archived
Headers show
Series [01/11] drm/ttm: add ttm_bo_pin()/ttm_bo_unpin() | expand

Commit Message

Christian König Sept. 21, 2020, 2:48 p.m. UTC
Implement in the driver instead since it is the only user of that function.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_bo.c         | 42 ++++++++++++++++++++++
 drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c     |  6 ++--
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.h        |  4 +++
 drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c |  8 ++---
 4 files changed, 52 insertions(+), 8 deletions(-)

Comments

Thomas Zimmermann Sept. 22, 2020, 6:45 a.m. UTC | #1
Hi

Am 21.09.20 um 16:48 schrieb Christian König:
> Implement in the driver instead since it is the only user of that function.

Maybe merge this patch with patch 10.

Best regards
Thomas

> 
> Signed-off-by: Christian König <christian.koenig@amd.com>
> ---
>  drivers/gpu/drm/vmwgfx/vmwgfx_bo.c         | 42 ++++++++++++++++++++++
>  drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c     |  6 ++--
>  drivers/gpu/drm/vmwgfx/vmwgfx_drv.h        |  4 +++
>  drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c |  8 ++---
>  4 files changed, 52 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> index 813f1b148094..30d19b45b602 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> @@ -487,6 +487,48 @@ static void vmw_user_bo_destroy(struct ttm_buffer_object *bo)
>  	ttm_prime_object_kfree(vmw_user_bo, prime);
>  }
>  
> +/**
> + * vmw_bo_create_kernel - Create a pinned BO for internal kernel use.
> + *
> + * @dev_priv: Pointer to the device private struct
> + * @size: size of the BO we need
> + * @placement: where to put it
> + * @p_bo: resulting BO
> + *
> + * Creates and pin a simple BO for in kernel use.
> + */
> +int vmw_bo_create_kernel(struct vmw_private *dev_priv, unsigned long size,
> +			 struct ttm_placement *placement,
> +			 struct ttm_buffer_object **p_bo)
> +{
> +	unsigned npages = PAGE_ALIGN(size) >> PAGE_SHIFT;
> +	struct ttm_buffer_object *bo;
> +	size_t acc_size;
> +	int ret;
> +
> +	bo = kzalloc(sizeof(*bo), GFP_KERNEL);
> +	if (unlikely(!bo))
> +		return -ENOMEM;
> +
> +	acc_size = ttm_round_pot(sizeof(*bo));
> +	acc_size += ttm_round_pot(npages * sizeof(void *));
> +	acc_size += ttm_round_pot(sizeof(struct ttm_tt));
> +	ret = ttm_bo_init_reserved(&dev_priv->bdev, bo, size,
> +				   ttm_bo_type_device, placement, 0,
> +				   false, acc_size, NULL, NULL, NULL);
> +	if (unlikely(ret))
> +		goto error_free;
> +
> +	ttm_bo_pin(bo);
> +	ttm_bo_unreserve(bo);
> +	*p_bo = bo;
> +
> +	return 0;
> +
> +error_free:
> +	kfree(bo);
> +	return ret;
> +}
>  
>  /**
>   * vmw_bo_init - Initialize a vmw buffer object
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
> index 3b41cf63110a..9a9fe10d829b 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
> @@ -1245,9 +1245,9 @@ int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man,
>  		    !dev_priv->has_mob)
>  			return -ENOMEM;
>  
> -		ret = ttm_bo_create(&dev_priv->bdev, size, ttm_bo_type_device,
> -				    &vmw_mob_ne_placement, 0, false,
> -				    &man->cmd_space);
> +		ret = vmw_bo_create_kernel(dev_priv, size,
> +					   &vmw_mob_placement,
> +					   &man->cmd_space);
>  		if (ret)
>  			return ret;
>  
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> index 9ceee4eb0b13..5d07de5183e1 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> @@ -845,6 +845,10 @@ extern void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *buf,
>  				 SVGAGuestPtr *ptr);
>  extern void vmw_bo_pin_reserved(struct vmw_buffer_object *bo, bool pin);
>  extern void vmw_bo_bo_free(struct ttm_buffer_object *bo);
> +extern int vmw_bo_create_kernel(struct vmw_private *dev_priv,
> +				unsigned long size,
> +				struct ttm_placement *placement,
> +				struct ttm_buffer_object **p_bo);
>  extern int vmw_bo_init(struct vmw_private *dev_priv,
>  		       struct vmw_buffer_object *vmw_bo,
>  		       size_t size, struct ttm_placement *placement,
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> index d7ea658e9910..39a2f720f4ed 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> @@ -793,11 +793,9 @@ int vmw_bo_create_and_populate(struct vmw_private *dev_priv,
>  	struct ttm_buffer_object *bo;
>  	int ret;
>  
> -	ret = ttm_bo_create(&dev_priv->bdev, bo_size,
> -			    ttm_bo_type_device,
> -			    &vmw_sys_ne_placement,
> -			    0, false, &bo);
> -
> +	ret = vmw_bo_create_kernel(dev_priv, bo_size,
> +				   &vmw_sys_placement,
> +				   &bo);
>  	if (unlikely(ret != 0))
>  		return ret;
>  
>
Christian König Sept. 22, 2020, 8:25 a.m. UTC | #2
Am 22.09.20 um 08:45 schrieb Thomas Zimmermann:
> Hi
>
> Am 21.09.20 um 16:48 schrieb Christian König:
>> Implement in the driver instead since it is the only user of that function.
> Maybe merge this patch with patch 10.

That's how I initially did it as well, but then found a number of bugs 
in the VMware patches and so thought it would be better to separate it 
(less code to revert and double check).

Regards,
Christian.

>
> Best regards
> Thomas
>
>> Signed-off-by: Christian König <christian.koenig@amd.com>
>> ---
>>   drivers/gpu/drm/vmwgfx/vmwgfx_bo.c         | 42 ++++++++++++++++++++++
>>   drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c     |  6 ++--
>>   drivers/gpu/drm/vmwgfx/vmwgfx_drv.h        |  4 +++
>>   drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c |  8 ++---
>>   4 files changed, 52 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
>> index 813f1b148094..30d19b45b602 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
>> @@ -487,6 +487,48 @@ static void vmw_user_bo_destroy(struct ttm_buffer_object *bo)
>>   	ttm_prime_object_kfree(vmw_user_bo, prime);
>>   }
>>   
>> +/**
>> + * vmw_bo_create_kernel - Create a pinned BO for internal kernel use.
>> + *
>> + * @dev_priv: Pointer to the device private struct
>> + * @size: size of the BO we need
>> + * @placement: where to put it
>> + * @p_bo: resulting BO
>> + *
>> + * Creates and pin a simple BO for in kernel use.
>> + */
>> +int vmw_bo_create_kernel(struct vmw_private *dev_priv, unsigned long size,
>> +			 struct ttm_placement *placement,
>> +			 struct ttm_buffer_object **p_bo)
>> +{
>> +	unsigned npages = PAGE_ALIGN(size) >> PAGE_SHIFT;
>> +	struct ttm_buffer_object *bo;
>> +	size_t acc_size;
>> +	int ret;
>> +
>> +	bo = kzalloc(sizeof(*bo), GFP_KERNEL);
>> +	if (unlikely(!bo))
>> +		return -ENOMEM;
>> +
>> +	acc_size = ttm_round_pot(sizeof(*bo));
>> +	acc_size += ttm_round_pot(npages * sizeof(void *));
>> +	acc_size += ttm_round_pot(sizeof(struct ttm_tt));
>> +	ret = ttm_bo_init_reserved(&dev_priv->bdev, bo, size,
>> +				   ttm_bo_type_device, placement, 0,
>> +				   false, acc_size, NULL, NULL, NULL);
>> +	if (unlikely(ret))
>> +		goto error_free;
>> +
>> +	ttm_bo_pin(bo);
>> +	ttm_bo_unreserve(bo);
>> +	*p_bo = bo;
>> +
>> +	return 0;
>> +
>> +error_free:
>> +	kfree(bo);
>> +	return ret;
>> +}
>>   
>>   /**
>>    * vmw_bo_init - Initialize a vmw buffer object
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
>> index 3b41cf63110a..9a9fe10d829b 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
>> @@ -1245,9 +1245,9 @@ int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man,
>>   		    !dev_priv->has_mob)
>>   			return -ENOMEM;
>>   
>> -		ret = ttm_bo_create(&dev_priv->bdev, size, ttm_bo_type_device,
>> -				    &vmw_mob_ne_placement, 0, false,
>> -				    &man->cmd_space);
>> +		ret = vmw_bo_create_kernel(dev_priv, size,
>> +					   &vmw_mob_placement,
>> +					   &man->cmd_space);
>>   		if (ret)
>>   			return ret;
>>   
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
>> index 9ceee4eb0b13..5d07de5183e1 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
>> @@ -845,6 +845,10 @@ extern void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *buf,
>>   				 SVGAGuestPtr *ptr);
>>   extern void vmw_bo_pin_reserved(struct vmw_buffer_object *bo, bool pin);
>>   extern void vmw_bo_bo_free(struct ttm_buffer_object *bo);
>> +extern int vmw_bo_create_kernel(struct vmw_private *dev_priv,
>> +				unsigned long size,
>> +				struct ttm_placement *placement,
>> +				struct ttm_buffer_object **p_bo);
>>   extern int vmw_bo_init(struct vmw_private *dev_priv,
>>   		       struct vmw_buffer_object *vmw_bo,
>>   		       size_t size, struct ttm_placement *placement,
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
>> index d7ea658e9910..39a2f720f4ed 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
>> @@ -793,11 +793,9 @@ int vmw_bo_create_and_populate(struct vmw_private *dev_priv,
>>   	struct ttm_buffer_object *bo;
>>   	int ret;
>>   
>> -	ret = ttm_bo_create(&dev_priv->bdev, bo_size,
>> -			    ttm_bo_type_device,
>> -			    &vmw_sys_ne_placement,
>> -			    0, false, &bo);
>> -
>> +	ret = vmw_bo_create_kernel(dev_priv, bo_size,
>> +				   &vmw_sys_placement,
>> +				   &bo);
>>   	if (unlikely(ret != 0))
>>   		return ret;
>>   
>>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
index 813f1b148094..30d19b45b602 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
@@ -487,6 +487,48 @@  static void vmw_user_bo_destroy(struct ttm_buffer_object *bo)
 	ttm_prime_object_kfree(vmw_user_bo, prime);
 }
 
+/**
+ * vmw_bo_create_kernel - Create a pinned BO for internal kernel use.
+ *
+ * @dev_priv: Pointer to the device private struct
+ * @size: size of the BO we need
+ * @placement: where to put it
+ * @p_bo: resulting BO
+ *
+ * Creates and pin a simple BO for in kernel use.
+ */
+int vmw_bo_create_kernel(struct vmw_private *dev_priv, unsigned long size,
+			 struct ttm_placement *placement,
+			 struct ttm_buffer_object **p_bo)
+{
+	unsigned npages = PAGE_ALIGN(size) >> PAGE_SHIFT;
+	struct ttm_buffer_object *bo;
+	size_t acc_size;
+	int ret;
+
+	bo = kzalloc(sizeof(*bo), GFP_KERNEL);
+	if (unlikely(!bo))
+		return -ENOMEM;
+
+	acc_size = ttm_round_pot(sizeof(*bo));
+	acc_size += ttm_round_pot(npages * sizeof(void *));
+	acc_size += ttm_round_pot(sizeof(struct ttm_tt));
+	ret = ttm_bo_init_reserved(&dev_priv->bdev, bo, size,
+				   ttm_bo_type_device, placement, 0,
+				   false, acc_size, NULL, NULL, NULL);
+	if (unlikely(ret))
+		goto error_free;
+
+	ttm_bo_pin(bo);
+	ttm_bo_unreserve(bo);
+	*p_bo = bo;
+
+	return 0;
+
+error_free:
+	kfree(bo);
+	return ret;
+}
 
 /**
  * vmw_bo_init - Initialize a vmw buffer object
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
index 3b41cf63110a..9a9fe10d829b 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
@@ -1245,9 +1245,9 @@  int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man,
 		    !dev_priv->has_mob)
 			return -ENOMEM;
 
-		ret = ttm_bo_create(&dev_priv->bdev, size, ttm_bo_type_device,
-				    &vmw_mob_ne_placement, 0, false,
-				    &man->cmd_space);
+		ret = vmw_bo_create_kernel(dev_priv, size,
+					   &vmw_mob_placement,
+					   &man->cmd_space);
 		if (ret)
 			return ret;
 
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
index 9ceee4eb0b13..5d07de5183e1 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
@@ -845,6 +845,10 @@  extern void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *buf,
 				 SVGAGuestPtr *ptr);
 extern void vmw_bo_pin_reserved(struct vmw_buffer_object *bo, bool pin);
 extern void vmw_bo_bo_free(struct ttm_buffer_object *bo);
+extern int vmw_bo_create_kernel(struct vmw_private *dev_priv,
+				unsigned long size,
+				struct ttm_placement *placement,
+				struct ttm_buffer_object **p_bo);
 extern int vmw_bo_init(struct vmw_private *dev_priv,
 		       struct vmw_buffer_object *vmw_bo,
 		       size_t size, struct ttm_placement *placement,
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
index d7ea658e9910..39a2f720f4ed 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
@@ -793,11 +793,9 @@  int vmw_bo_create_and_populate(struct vmw_private *dev_priv,
 	struct ttm_buffer_object *bo;
 	int ret;
 
-	ret = ttm_bo_create(&dev_priv->bdev, bo_size,
-			    ttm_bo_type_device,
-			    &vmw_sys_ne_placement,
-			    0, false, &bo);
-
+	ret = vmw_bo_create_kernel(dev_priv, bo_size,
+				   &vmw_sys_placement,
+				   &bo);
 	if (unlikely(ret != 0))
 		return ret;