All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drm/amdgpu: enable bo priority setting from user space
@ 2019-03-07  9:15 Chunming Zhou
       [not found] ` <20190307091528.22788-1-david1.zhou-5C7GfCeVMHo@public.gmane.org>
  0 siblings, 1 reply; 8+ messages in thread
From: Chunming Zhou @ 2019-03-07  9:15 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Chunming Zhou

Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c     |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c    | 13 +++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h    |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c |  3 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.h |  1 +
 include/drm/ttm/ttm_bo_driver.h            |  9 ++++++++-
 include/uapi/drm/amdgpu_drm.h              |  3 +++
 7 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
index 5cbde74b97dd..70a6baf20c22 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
@@ -144,6 +144,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
 	size = mode_cmd->pitches[0] * height;
 	aligned_size = ALIGN(size, PAGE_SIZE);
 	ret = amdgpu_gem_object_create(adev, aligned_size, 0, domain,
+				       TTM_BO_PRIORITY_NORMAL,
 				       AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
 				       AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
 				       AMDGPU_GEM_CREATE_VRAM_CLEARED,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index d21dd2f369da..7c1c2362c67e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -44,6 +44,7 @@ void amdgpu_gem_object_free(struct drm_gem_object *gobj)
 
 int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
 			     int alignment, u32 initial_domain,
+			     enum ttm_bo_priority priority,
 			     u64 flags, enum ttm_bo_type type,
 			     struct reservation_object *resv,
 			     struct drm_gem_object **obj)
@@ -60,6 +61,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
 	bp.type = type;
 	bp.resv = resv;
 	bp.preferred_domain = initial_domain;
+	bp.priority = priority;
 retry:
 	bp.flags = flags;
 	bp.domain = initial_domain;
@@ -229,6 +231,14 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
 	if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK)
 		return -EINVAL;
 
+	/* check priority */
+	if (args->in.priority == 0) {
+		/* default is normal */
+		args->in.priority = TTM_BO_PRIORITY_NORMAL;
+	} else if (args->in.priority > TTM_MAX_BO_PRIORITY) {
+		args->in.priority = TTM_MAX_BO_PRIORITY;
+		DRM_ERROR("priority specified from user space is over MAX priority\n");
+	}
 	/* create a gem object to contain this object in */
 	if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS |
 	    AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) {
@@ -252,6 +262,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
 
 	r = amdgpu_gem_object_create(adev, size, args->in.alignment,
 				     (u32)(0xffffffff & args->in.domains),
+				     args->in.priority - 1,
 				     flags, ttm_bo_type_device, resv, &gobj);
 	if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
 		if (!r) {
@@ -304,6 +315,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
 
 	/* create a gem object to contain this object in */
 	r = amdgpu_gem_object_create(adev, args->size, 0, AMDGPU_GEM_DOMAIN_CPU,
+				     TTM_BO_PRIORITY_NORMAL,
 				     0, ttm_bo_type_device, NULL, &gobj);
 	if (r)
 		return r;
@@ -755,6 +767,7 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,
 	domain = amdgpu_bo_get_preferred_pin_domain(adev,
 				amdgpu_display_supported_domains(adev));
 	r = amdgpu_gem_object_create(adev, args->size, 0, domain,
+				     TTM_BO_PRIORITY_NORMAL,
 				     AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
 				     ttm_bo_type_device, NULL, &gobj);
 	if (r)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
index f1ddfc50bcc7..47b0a8190948 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
@@ -61,7 +61,7 @@ extern const struct dma_buf_ops amdgpu_dmabuf_ops;
  */
 void amdgpu_gem_force_release(struct amdgpu_device *adev);
 int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
-			     int alignment, u32 initial_domain,
+			     int alignment, u32 initial_domain, u32 priority,
 			     u64 flags, enum ttm_bo_type type,
 			     struct reservation_object *resv,
 			     struct drm_gem_object **obj);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index fd9c4beeaaa4..c85304e03021 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -494,8 +494,9 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
 
 	bo->tbo.bdev = &adev->mman.bdev;
 	amdgpu_bo_placement_from_domain(bo, bp->domain);
+	bo->tbo.priority = bp->priority;
 	if (bp->type == ttm_bo_type_kernel)
-		bo->tbo.priority = 1;
+		bo->tbo.priority = TTM_BO_PRIORITY_VERYHIGH;
 
 	r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,
 				 &bo->placement, page_align, &ctx, acc_size,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index 9291c2f837e9..091a7884a821 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -39,6 +39,7 @@ struct amdgpu_bo_param {
 	int				byte_align;
 	u32				domain;
 	u32				preferred_domain;
+	u32				priority;
 	u64				flags;
 	enum ttm_bo_type		type;
 	struct reservation_object	*resv;
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index cbf3180cb612..53f39ed540d7 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -43,7 +43,14 @@
 #include "ttm_placement.h"
 #include "ttm_tt.h"
 
-#define TTM_MAX_BO_PRIORITY	4U
+enum ttm_bo_priority {
+	TTM_BO_PRIORITY_VERYLOW = 0,
+	TTM_BO_PRIORITY_LOW,
+	TTM_BO_PRIORITY_NORMAL,
+	TTM_BO_PRIORITY_HIGH,
+	TTM_BO_PRIORITY_VERYHIGH,
+	TTM_MAX_BO_PRIORITY
+};
 
 #define TTM_MEMTYPE_FLAG_FIXED         (1 << 0)	/* Fixed (on-card) PCI memory */
 #define TTM_MEMTYPE_FLAG_MAPPABLE      (1 << 1)	/* Memory mappable */
diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
index b7718bfdf8ad..b74a7583d7f3 100644
--- a/include/uapi/drm/amdgpu_drm.h
+++ b/include/uapi/drm/amdgpu_drm.h
@@ -138,6 +138,9 @@ struct drm_amdgpu_gem_create_in  {
 	__u64 domains;
 	/** allocation flags */
 	__u64 domain_flags;
+	/** priority */
+	__u32 priority;
+	__u32 pad;
 };
 
 struct drm_amdgpu_gem_create_out  {
-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] drm/amdgpu: enable bo priority setting from user space
       [not found] ` <20190307091528.22788-1-david1.zhou-5C7GfCeVMHo@public.gmane.org>
@ 2019-03-07  9:55   ` Michel Dänzer
       [not found]     ` <a8803c5e-d911-992e-2b67-13ed6ca29ccf-otUistvHUpPR7s880joybQ@public.gmane.org>
  2019-03-07 11:36   ` Christian König
  1 sibling, 1 reply; 8+ messages in thread
From: Michel Dänzer @ 2019-03-07  9:55 UTC (permalink / raw)
  To: Chunming Zhou; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On 2019-03-07 10:15 a.m., Chunming Zhou wrote:
> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>

Please provide corresponding UMD patches showing how this is to be used.


> @@ -229,6 +231,14 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>  	if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK)
>  		return -EINVAL;
>  
> +	/* check priority */
> +	if (args->in.priority == 0) {

Did you verify that this is 0 with old userspace compiled against struct
drm_amdgpu_gem_create_in without the priority field?


> +		/* default is normal */
> +		args->in.priority = TTM_BO_PRIORITY_NORMAL;
> +	} else if (args->in.priority > TTM_MAX_BO_PRIORITY) {
> +		args->in.priority = TTM_MAX_BO_PRIORITY;
> +		DRM_ERROR("priority specified from user space is over MAX priority\n");

This must be DRM_DEBUG, or buggy/malicious userspace can spam dmesg.


> @@ -252,6 +262,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>  
>  	r = amdgpu_gem_object_create(adev, size, args->in.alignment,
>  				     (u32)(0xffffffff & args->in.domains),
> +				     args->in.priority - 1,
>  				     flags, ttm_bo_type_device, resv, &gobj);

It might be less confusing to subtract 1 after checking against
TTM_MAX_BO_PRIORITY instead of here. Still kind of confusing though. How
about this instead:

Make the priority field of struct drm_amdgpu_gem_create_in signed. In
amdgpu_gem_create_ioctl, clamp the priority to the supported range:

	args->in.priority += TTM_BO_PRIORITY_NORMAL;
	args->in.priority = max(args->in.priority, 0);
	args->in.priority = min(args->in.priority,
				TTM_BO_PRIORITY_NORMAL - 1);

This way userspace doesn't need to do a weird mapping of the priority
values (where 0 and 2 have the same meaning), and the range of supported
priorities could at least theoretically be extended without breaking
userspace.


> @@ -304,6 +315,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
>  
>  	/* create a gem object to contain this object in */
>  	r = amdgpu_gem_object_create(adev, args->size, 0, AMDGPU_GEM_DOMAIN_CPU,
> +				     TTM_BO_PRIORITY_NORMAL,
>  				     0, ttm_bo_type_device, NULL, &gobj);

Should the userptr ioctl also allow setting the priority?


> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index fd9c4beeaaa4..c85304e03021 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -494,8 +494,9 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
>  
>  	bo->tbo.bdev = &adev->mman.bdev;
>  	amdgpu_bo_placement_from_domain(bo, bp->domain);
> +	bo->tbo.priority = bp->priority;
>  	if (bp->type == ttm_bo_type_kernel)
> -		bo->tbo.priority = 1;
> +		bo->tbo.priority = TTM_BO_PRIORITY_VERYHIGH;

	if (bp->type == ttm_bo_type_kernel)
		bo->tbo.priority = TTM_BO_PRIORITY_VERYHIGH;
	else
		bo->tbo.priority = bp->priority;

would be clearer I think.


-- 
Earthling Michel Dänzer               |              https://www.amd.com
Libre software enthusiast             |             Mesa and X developer
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] drm/amdgpu: enable bo priority setting from user space
       [not found]     ` <a8803c5e-d911-992e-2b67-13ed6ca29ccf-otUistvHUpPR7s880joybQ@public.gmane.org>
@ 2019-03-07 10:48       ` zhoucm1
       [not found]         ` <1d4f0b7d-f726-3cad-13c3-36e670f35baf-5C7GfCeVMHo@public.gmane.org>
  0 siblings, 1 reply; 8+ messages in thread
From: zhoucm1 @ 2019-03-07 10:48 UTC (permalink / raw)
  To: Michel Dänzer, Chunming Zhou
  Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW


[-- Attachment #1.1: Type: text/plain, Size: 5755 bytes --]



On 2019年03月07日 17:55, Michel Dänzer wrote:
> On 2019-03-07 10:15 a.m., Chunming Zhou wrote:
>> Signed-off-by: Chunming Zhou <david1.zhou-5C7GfCeVMHo@public.gmane.org>
> Please provide corresponding UMD patches showing how this is to be used.
spec is here:
https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html, 
please search "|VkMemoryPriorityAllocateInfoEXT|".

Fortunately, Windows guy already implemented it before, otherwise, I 
cannot find ready code on opensource, I hate this chicken first and egg 
first question :
https://github.com/GPUOpen-Drivers/pal/blob/dev/src/core/gpuMemory.cpp, 
please search "createInfo.priority".
https://github.com/GPUOpen-Drivers/pal/blob/dev/inc/core/palGpuMemory.h, 
priority definition is here.

>
>
>> @@ -229,6 +231,14 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>>   	if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK)
>>   		return -EINVAL;
>>   
>> +	/* check priority */
>> +	if (args->in.priority == 0) {
> Did you verify that this is 0 with old userspace compiled against struct
> drm_amdgpu_gem_create_in without the priority field?
Without priority field, I don't think we can check here. Do you mean we 
need to add a new args struct?

>
>
>> +		/* default is normal */
>> +		args->in.priority = TTM_BO_PRIORITY_NORMAL;
>> +	} else if (args->in.priority > TTM_MAX_BO_PRIORITY) {
>> +		args->in.priority = TTM_MAX_BO_PRIORITY;
>> +		DRM_ERROR("priority specified from user space is over MAX priority\n");
> This must be DRM_DEBUG, or buggy/malicious userspace can spam dmesg.
Will change.

>
>
>> @@ -252,6 +262,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>>   
>>   	r = amdgpu_gem_object_create(adev, size, args->in.alignment,
>>   				     (u32)(0xffffffff & args->in.domains),
>> +				     args->in.priority - 1,
>>   				     flags, ttm_bo_type_device, resv, &gobj);
> It might be less confusing to subtract 1 after checking against
> TTM_MAX_BO_PRIORITY instead of here. Still kind of confusing though. How
> about this instead:
>
> Make the priority field of struct drm_amdgpu_gem_create_in signed. In
> amdgpu_gem_create_ioctl, clamp the priority to the supported range:
>
> 	args->in.priority += TTM_BO_PRIORITY_NORMAL;
> 	args->in.priority = max(args->in.priority, 0);
> 	args->in.priority = min(args->in.priority,
> 				TTM_BO_PRIORITY_NORMAL - 1);
>
> This way userspace doesn't need to do a weird mapping of the priority
> values (where 0 and 2 have the same meaning), and the range of supported
> priorities could at least theoretically be extended without breaking
> userspace.
First, I want to explain a bit the priority value from vulkan:
"    From Vulkan Spec, 0.0 <= value <= 1.0, and the granularity of the 
priorities is implementation-dependent.
      One thing Spec forced is that if VkMemoryPriority not specified as 
default behavior, it is as if the
      priority value is 0.5. Our strategy is that map 0.5 to 
GpuMemPriority::Normal-GpuMemPriorityOffset::Offset0,
      which is consistent to MemoryPriorityDefault. We adopts 
GpuMemPriority::VeryLow, GpuMemPriority::Low,
      GpuMemPriority::Normal, GpuMemPriority::High, 4 priority grades, 
each of which contains 8 steps of offests.
      This maps [0.0-1.0) to totally 32 steps. Finally, 1.0 maps to 
GpuMemPriority::VeryHigh.
"

So my original purpose is directly use Priority enum defined in PAL, 
like this:
  "
/// Specifies Base Level priority per GPU memory allocation as a hint to 
the memory manager in the event it needs to
/// select allocations to page out of their preferred heaps.
enum class GpuMemPriority : uint32
{
     Unused    = 0x0,  ///< Indicates that the allocation is not 
currently being used at all, and should be the first
                       ///  choice to be paged out.
     VeryLow   = 0x1,  ///< Lowest priority to keep in its preferred heap.
     Low       = 0x2,  ///< Low priority to keep in its preferred heap.
     Normal    = 0x3,  ///< Normal priority to keep in its preferred heap.
     High      = 0x4,  ///< High priority to keep in its preferred heap 
(e.g., render targets).
     VeryHigh  = 0x5,  ///< Highest priority to keep in its preferred 
heap.  Last choice to be paged out (e.g., page
                       ///  tables, displayable allocations).
     Count
};
"

If according your idea, we will need to convert it again when hooking 
linux implementation.
So what do think we still use unsigned?

>
>
>> @@ -304,6 +315,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
>>   
>>   	/* create a gem object to contain this object in */
>>   	r = amdgpu_gem_object_create(adev, args->size, 0, AMDGPU_GEM_DOMAIN_CPU,
>> +				     TTM_BO_PRIORITY_NORMAL,
>>   				     0, ttm_bo_type_device, NULL, &gobj);
> Should the userptr ioctl also allow setting the priority?

We can.

>
>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>> index fd9c4beeaaa4..c85304e03021 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>> @@ -494,8 +494,9 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
>>   
>>   	bo->tbo.bdev = &adev->mman.bdev;
>>   	amdgpu_bo_placement_from_domain(bo, bp->domain);
>> +	bo->tbo.priority = bp->priority;
>>   	if (bp->type == ttm_bo_type_kernel)
>> -		bo->tbo.priority = 1;
>> +		bo->tbo.priority = TTM_BO_PRIORITY_VERYHIGH;
> 	if (bp->type == ttm_bo_type_kernel)
> 		bo->tbo.priority = TTM_BO_PRIORITY_VERYHIGH;
> 	else
> 		bo->tbo.priority = bp->priority;
>
> would be clearer I think.
Agree.

-David

>
>


[-- Attachment #1.2: Type: text/html, Size: 8675 bytes --]

[-- Attachment #2: Type: text/plain, Size: 153 bytes --]

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] drm/amdgpu: enable bo priority setting from user space
       [not found]         ` <1d4f0b7d-f726-3cad-13c3-36e670f35baf-5C7GfCeVMHo@public.gmane.org>
@ 2019-03-07 11:33           ` Michel Dänzer
  0 siblings, 0 replies; 8+ messages in thread
From: Michel Dänzer @ 2019-03-07 11:33 UTC (permalink / raw)
  To: zhoucm1, Chunming Zhou; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On 2019-03-07 11:48 a.m., zhoucm1 wrote:
> On 2019年03月07日 17:55, Michel Dänzer wrote:
>> On 2019-03-07 10:15 a.m., Chunming Zhou wrote:
>>> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
>> Please provide corresponding UMD patches showing how this is to be used.
> spec is here:
> https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html,
> please search "|VkMemoryPriorityAllocateInfoEXT|".
> 
> Fortunately, Windows guy already implemented it before, otherwise, I
> cannot find ready code on opensource, I hate this chicken first and egg
> first question :

Whether you like it or not, the rule documented in
Documentation/gpu/drm-uapi.rst is clear: New UAPI cannot go upstream
before corresponding userspace patches have been reviewed. This is
important to avoid adding broken/unmaintainable UAPI.


> https://github.com/GPUOpen-Drivers/pal/blob/dev/src/core/gpuMemory.cpp,
> please search "createInfo.priority".
> https://github.com/GPUOpen-Drivers/pal/blob/dev/inc/core/palGpuMemory.h,
> priority definition is here.

These don't show how the priority field of struct
drm_amdgpu_gem_create_in is used.


>>> @@ -229,6 +231,14 @@ int amdgpu_gem_create_ioctl(struct drm_device
>>> *dev, void *data,
>>>       if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK)
>>>           return -EINVAL;
>>>   +    /* check priority */
>>> +    if (args->in.priority == 0) {
>> Did you verify that this is 0 with old userspace compiled against struct
>> drm_amdgpu_gem_create_in without the priority field?
> Without priority field, I don't think we can check here. Do you mean we
> need to add a new args struct?

I don't think so. Presumably this will be initialized to 0 if userspace
doesn't pass in a value, but this needs to be verified.


>>> @@ -252,6 +262,7 @@ int amdgpu_gem_create_ioctl(struct drm_device
>>> *dev, void *data,
>>>         r = amdgpu_gem_object_create(adev, size, args->in.alignment,
>>>                        (u32)(0xffffffff & args->in.domains),
>>> +                     args->in.priority - 1,
>>>                        flags, ttm_bo_type_device, resv, &gobj);
>> It might be less confusing to subtract 1 after checking against
>> TTM_MAX_BO_PRIORITY instead of here. Still kind of confusing though. How
>> about this instead:
>>
>> Make the priority field of struct drm_amdgpu_gem_create_in signed. In
>> amdgpu_gem_create_ioctl, clamp the priority to the supported range:
>>
>>     args->in.priority += TTM_BO_PRIORITY_NORMAL;
>>     args->in.priority = max(args->in.priority, 0);
>>     args->in.priority = min(args->in.priority,
>>                 TTM_BO_PRIORITY_NORMAL - 1);
>>
>> This way userspace doesn't need to do a weird mapping of the priority
>> values (where 0 and 2 have the same meaning), and the range of supported
>> priorities could at least theoretically be extended without breaking
>> userspace.
> First, I want to explain a bit the priority value from vulkan:
> "    From Vulkan Spec, 0.0 <= value <= 1.0, and the granularity of the
> priorities is implementation-dependent.
>      One thing Spec forced is that if VkMemoryPriority not specified as
> default behavior, it is as if the
>      priority value is 0.5. Our strategy is that map 0.5 to
> GpuMemPriority::Normal-GpuMemPriorityOffset::Offset0,
>      which is consistent to MemoryPriorityDefault. We adopts
> GpuMemPriority::VeryLow, GpuMemPriority::Low,
>      GpuMemPriority::Normal, GpuMemPriority::High, 4 priority grades,
> each of which contains 8 steps of offests.
>      This maps [0.0-1.0) to totally 32 steps. Finally, 1.0 maps to
> GpuMemPriority::VeryHigh.
> "

In that case, I'd suggest making the priority field signed, and mapping
the full integer range to the range of supported priorities:

* 0 maps to TTM_BO_PRIORITY_NORMAL
* INT_MIN maps to TTM_BO_PRIORITY_VERYLOW
* INT_MAX maps to TTM_BO_PRIORITY_VERYHIGH

Intermediate values are interpolated appropriately to the supported
range of priorities.


This way, the Vulkan float priority value can easily be converted to the
integer priority value, and the actual range of priorities used on the
kernel side can be changed arbitrarily without breaking userspace.


> So my original purpose is directly use Priority enum defined in PAL,
> [...]

I don't think it's a good idea to let PAL dictate UAPI.


>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>> index fd9c4beeaaa4..c85304e03021 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>> @@ -494,8 +494,9 @@ static int amdgpu_bo_do_create(struct
>>> amdgpu_device *adev,
>>>         bo->tbo.bdev = &adev->mman.bdev;
>>>       amdgpu_bo_placement_from_domain(bo, bp->domain);
>>> +    bo->tbo.priority = bp->priority;
>>>       if (bp->type == ttm_bo_type_kernel)
>>> -        bo->tbo.priority = 1;
>>> +        bo->tbo.priority = TTM_BO_PRIORITY_VERYHIGH;
>>     if (bp->type == ttm_bo_type_kernel)
>>         bo->tbo.priority = TTM_BO_PRIORITY_VERYHIGH;
>>     else
>>         bo->tbo.priority = bp->priority;
>>
>> would be clearer I think.
> Agree.

Another question is whether userspace should be allowed to set the same
priority as the kernel? I'm inclined to say no, there should be a
separate priority for the kernel.


-- 
Earthling Michel Dänzer               |              https://www.amd.com
Libre software enthusiast             |             Mesa and X developer
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] drm/amdgpu: enable bo priority setting from user space
       [not found] ` <20190307091528.22788-1-david1.zhou-5C7GfCeVMHo@public.gmane.org>
  2019-03-07  9:55   ` Michel Dänzer
@ 2019-03-07 11:36   ` Christian König
       [not found]     ` <a1efec4e-0cb9-f92f-2688-ecfd4ed7ad12-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  1 sibling, 1 reply; 8+ messages in thread
From: Christian König @ 2019-03-07 11:36 UTC (permalink / raw)
  To: Chunming Zhou, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Am 07.03.19 um 10:15 schrieb Chunming Zhou:
> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>

Well NAK to the whole approach.

The TTM priority is a global priority, but processes are only allowed to 
specific the priority inside their own allocations. So this approach 
will never fly upstream.

What you can do is to add a priority for per vm BOs to affect their sort 
order on the LRU, but I doubt that this will have much of an effect.

Regards,
Christian.

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c     |  1 +
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c    | 13 +++++++++++++
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h    |  2 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.c |  3 ++-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.h |  1 +
>   include/drm/ttm/ttm_bo_driver.h            |  9 ++++++++-
>   include/uapi/drm/amdgpu_drm.h              |  3 +++
>   7 files changed, 29 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> index 5cbde74b97dd..70a6baf20c22 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> @@ -144,6 +144,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
>   	size = mode_cmd->pitches[0] * height;
>   	aligned_size = ALIGN(size, PAGE_SIZE);
>   	ret = amdgpu_gem_object_create(adev, aligned_size, 0, domain,
> +				       TTM_BO_PRIORITY_NORMAL,
>   				       AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
>   				       AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
>   				       AMDGPU_GEM_CREATE_VRAM_CLEARED,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index d21dd2f369da..7c1c2362c67e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -44,6 +44,7 @@ void amdgpu_gem_object_free(struct drm_gem_object *gobj)
>   
>   int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
>   			     int alignment, u32 initial_domain,
> +			     enum ttm_bo_priority priority,
>   			     u64 flags, enum ttm_bo_type type,
>   			     struct reservation_object *resv,
>   			     struct drm_gem_object **obj)
> @@ -60,6 +61,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
>   	bp.type = type;
>   	bp.resv = resv;
>   	bp.preferred_domain = initial_domain;
> +	bp.priority = priority;
>   retry:
>   	bp.flags = flags;
>   	bp.domain = initial_domain;
> @@ -229,6 +231,14 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>   	if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK)
>   		return -EINVAL;
>   
> +	/* check priority */
> +	if (args->in.priority == 0) {
> +		/* default is normal */
> +		args->in.priority = TTM_BO_PRIORITY_NORMAL;
> +	} else if (args->in.priority > TTM_MAX_BO_PRIORITY) {
> +		args->in.priority = TTM_MAX_BO_PRIORITY;
> +		DRM_ERROR("priority specified from user space is over MAX priority\n");
> +	}
>   	/* create a gem object to contain this object in */
>   	if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS |
>   	    AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) {
> @@ -252,6 +262,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>   
>   	r = amdgpu_gem_object_create(adev, size, args->in.alignment,
>   				     (u32)(0xffffffff & args->in.domains),
> +				     args->in.priority - 1,
>   				     flags, ttm_bo_type_device, resv, &gobj);
>   	if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
>   		if (!r) {
> @@ -304,6 +315,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
>   
>   	/* create a gem object to contain this object in */
>   	r = amdgpu_gem_object_create(adev, args->size, 0, AMDGPU_GEM_DOMAIN_CPU,
> +				     TTM_BO_PRIORITY_NORMAL,
>   				     0, ttm_bo_type_device, NULL, &gobj);
>   	if (r)
>   		return r;
> @@ -755,6 +767,7 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,
>   	domain = amdgpu_bo_get_preferred_pin_domain(adev,
>   				amdgpu_display_supported_domains(adev));
>   	r = amdgpu_gem_object_create(adev, args->size, 0, domain,
> +				     TTM_BO_PRIORITY_NORMAL,
>   				     AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
>   				     ttm_bo_type_device, NULL, &gobj);
>   	if (r)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
> index f1ddfc50bcc7..47b0a8190948 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
> @@ -61,7 +61,7 @@ extern const struct dma_buf_ops amdgpu_dmabuf_ops;
>    */
>   void amdgpu_gem_force_release(struct amdgpu_device *adev);
>   int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
> -			     int alignment, u32 initial_domain,
> +			     int alignment, u32 initial_domain, u32 priority,
>   			     u64 flags, enum ttm_bo_type type,
>   			     struct reservation_object *resv,
>   			     struct drm_gem_object **obj);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index fd9c4beeaaa4..c85304e03021 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -494,8 +494,9 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
>   
>   	bo->tbo.bdev = &adev->mman.bdev;
>   	amdgpu_bo_placement_from_domain(bo, bp->domain);
> +	bo->tbo.priority = bp->priority;
>   	if (bp->type == ttm_bo_type_kernel)
> -		bo->tbo.priority = 1;
> +		bo->tbo.priority = TTM_BO_PRIORITY_VERYHIGH;
>   
>   	r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,
>   				 &bo->placement, page_align, &ctx, acc_size,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index 9291c2f837e9..091a7884a821 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -39,6 +39,7 @@ struct amdgpu_bo_param {
>   	int				byte_align;
>   	u32				domain;
>   	u32				preferred_domain;
> +	u32				priority;
>   	u64				flags;
>   	enum ttm_bo_type		type;
>   	struct reservation_object	*resv;
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index cbf3180cb612..53f39ed540d7 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -43,7 +43,14 @@
>   #include "ttm_placement.h"
>   #include "ttm_tt.h"
>   
> -#define TTM_MAX_BO_PRIORITY	4U
> +enum ttm_bo_priority {
> +	TTM_BO_PRIORITY_VERYLOW = 0,
> +	TTM_BO_PRIORITY_LOW,
> +	TTM_BO_PRIORITY_NORMAL,
> +	TTM_BO_PRIORITY_HIGH,
> +	TTM_BO_PRIORITY_VERYHIGH,
> +	TTM_MAX_BO_PRIORITY
> +};
>   
>   #define TTM_MEMTYPE_FLAG_FIXED         (1 << 0)	/* Fixed (on-card) PCI memory */
>   #define TTM_MEMTYPE_FLAG_MAPPABLE      (1 << 1)	/* Memory mappable */
> diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
> index b7718bfdf8ad..b74a7583d7f3 100644
> --- a/include/uapi/drm/amdgpu_drm.h
> +++ b/include/uapi/drm/amdgpu_drm.h
> @@ -138,6 +138,9 @@ struct drm_amdgpu_gem_create_in  {
>   	__u64 domains;
>   	/** allocation flags */
>   	__u64 domain_flags;
> +	/** priority */
> +	__u32 priority;
> +	__u32 pad;
>   };
>   
>   struct drm_amdgpu_gem_create_out  {

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re:[PATCH] drm/amdgpu: enable bo priority setting from user space
       [not found]     ` <a1efec4e-0cb9-f92f-2688-ecfd4ed7ad12-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2019-03-07 13:09       ` Zhou, David(ChunMing)
       [not found]         ` <-o8xodt-v7ma50s620vm-x3ufrzt16m3ru4l9qc4l8rct-ppumfj-lgzfos2xnj696p97zq-q88klx-1xor439yr648-3s2lfc-pglvz8-9du7dn8goc66-3zd1sv-cy6o2qkurchc-gpwxlg-c9iov0a657ue.1551963984191-2ueSQiBKiTY7tOexoI0I+QC/G2K4zDHf@public.gmane.org>
  0 siblings, 1 reply; 8+ messages in thread
From: Zhou, David(ChunMing) @ 2019-03-07 13:09 UTC (permalink / raw)
  To: Koenig, Christian, Zhou, David(ChunMing),
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW


[-- Attachment #1.1: Type: text/plain, Size: 8733 bytes --]

Yes, you are right, thanks to point it out. Will see if there is other way.

-David

send from my phone

-------- Original Message --------
Subject: Re: [PATCH] drm/amdgpu: enable bo priority setting from user space
From: Christian König
To: "Zhou, David(ChunMing)" ,amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
CC:

Am 07.03.19 um 10:15 schrieb Chunming Zhou:
> Signed-off-by: Chunming Zhou <david1.zhou-5C7GfCeVMHo@public.gmane.org>

Well NAK to the whole approach.

The TTM priority is a global priority, but processes are only allowed to
specific the priority inside their own allocations. So this approach
will never fly upstream.

What you can do is to add a priority for per vm BOs to affect their sort
order on the LRU, but I doubt that this will have much of an effect.

Regards,
Christian.

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c     |  1 +
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c    | 13 +++++++++++++
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h    |  2 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.c |  3 ++-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.h |  1 +
>   include/drm/ttm/ttm_bo_driver.h            |  9 ++++++++-
>   include/uapi/drm/amdgpu_drm.h              |  3 +++
>   7 files changed, 29 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> index 5cbde74b97dd..70a6baf20c22 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> @@ -144,6 +144,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
>        size = mode_cmd->pitches[0] * height;
>        aligned_size = ALIGN(size, PAGE_SIZE);
>        ret = amdgpu_gem_object_create(adev, aligned_size, 0, domain,
> +                                    TTM_BO_PRIORITY_NORMAL,
>                                       AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
>                                       AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
>                                       AMDGPU_GEM_CREATE_VRAM_CLEARED,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index d21dd2f369da..7c1c2362c67e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -44,6 +44,7 @@ void amdgpu_gem_object_free(struct drm_gem_object *gobj)
>
>   int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
>                             int alignment, u32 initial_domain,
> +                          enum ttm_bo_priority priority,
>                             u64 flags, enum ttm_bo_type type,
>                             struct reservation_object *resv,
>                             struct drm_gem_object **obj)
> @@ -60,6 +61,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
>        bp.type = type;
>        bp.resv = resv;
>        bp.preferred_domain = initial_domain;
> +     bp.priority = priority;
>   retry:
>        bp.flags = flags;
>        bp.domain = initial_domain;
> @@ -229,6 +231,14 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>        if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK)
>                return -EINVAL;
>
> +     /* check priority */
> +     if (args->in.priority == 0) {
> +             /* default is normal */
> +             args->in.priority = TTM_BO_PRIORITY_NORMAL;
> +     } else if (args->in.priority > TTM_MAX_BO_PRIORITY) {
> +             args->in.priority = TTM_MAX_BO_PRIORITY;
> +             DRM_ERROR("priority specified from user space is over MAX priority\n");
> +     }
>        /* create a gem object to contain this object in */
>        if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS |
>            AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) {
> @@ -252,6 +262,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>
>        r = amdgpu_gem_object_create(adev, size, args->in.alignment,
>                                     (u32)(0xffffffff & args->in.domains),
> +                                  args->in.priority - 1,
>                                     flags, ttm_bo_type_device, resv, &gobj);
>        if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
>                if (!r) {
> @@ -304,6 +315,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
>
>        /* create a gem object to contain this object in */
>        r = amdgpu_gem_object_create(adev, args->size, 0, AMDGPU_GEM_DOMAIN_CPU,
> +                                  TTM_BO_PRIORITY_NORMAL,
>                                     0, ttm_bo_type_device, NULL, &gobj);
>        if (r)
>                return r;
> @@ -755,6 +767,7 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,
>        domain = amdgpu_bo_get_preferred_pin_domain(adev,
>                                amdgpu_display_supported_domains(adev));
>        r = amdgpu_gem_object_create(adev, args->size, 0, domain,
> +                                  TTM_BO_PRIORITY_NORMAL,
>                                     AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
>                                     ttm_bo_type_device, NULL, &gobj);
>        if (r)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
> index f1ddfc50bcc7..47b0a8190948 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
> @@ -61,7 +61,7 @@ extern const struct dma_buf_ops amdgpu_dmabuf_ops;
>    */
>   void amdgpu_gem_force_release(struct amdgpu_device *adev);
>   int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
> -                          int alignment, u32 initial_domain,
> +                          int alignment, u32 initial_domain, u32 priority,
>                             u64 flags, enum ttm_bo_type type,
>                             struct reservation_object *resv,
>                             struct drm_gem_object **obj);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index fd9c4beeaaa4..c85304e03021 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -494,8 +494,9 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
>
>        bo->tbo.bdev = &adev->mman.bdev;
>        amdgpu_bo_placement_from_domain(bo, bp->domain);
> +     bo->tbo.priority = bp->priority;
>        if (bp->type == ttm_bo_type_kernel)
> -             bo->tbo.priority = 1;
> +             bo->tbo.priority = TTM_BO_PRIORITY_VERYHIGH;
>
>        r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,
>                                 &bo->placement, page_align, &ctx, acc_size,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index 9291c2f837e9..091a7884a821 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -39,6 +39,7 @@ struct amdgpu_bo_param {
>        int                             byte_align;
>        u32                             domain;
>        u32                             preferred_domain;
> +     u32                             priority;
>        u64                             flags;
>        enum ttm_bo_type                type;
>        struct reservation_object       *resv;
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index cbf3180cb612..53f39ed540d7 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -43,7 +43,14 @@
>   #include "ttm_placement.h"
>   #include "ttm_tt.h"
>
> -#define TTM_MAX_BO_PRIORITY  4U
> +enum ttm_bo_priority {
> +     TTM_BO_PRIORITY_VERYLOW = 0,
> +     TTM_BO_PRIORITY_LOW,
> +     TTM_BO_PRIORITY_NORMAL,
> +     TTM_BO_PRIORITY_HIGH,
> +     TTM_BO_PRIORITY_VERYHIGH,
> +     TTM_MAX_BO_PRIORITY
> +};
>
>   #define TTM_MEMTYPE_FLAG_FIXED         (1 << 0)     /* Fixed (on-card) PCI memory */
>   #define TTM_MEMTYPE_FLAG_MAPPABLE      (1 << 1)     /* Memory mappable */
> diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
> index b7718bfdf8ad..b74a7583d7f3 100644
> --- a/include/uapi/drm/amdgpu_drm.h
> +++ b/include/uapi/drm/amdgpu_drm.h
> @@ -138,6 +138,9 @@ struct drm_amdgpu_gem_create_in  {
>        __u64 domains;
>        /** allocation flags */
>        __u64 domain_flags;
> +     /** priority */
> +     __u32 priority;
> +     __u32 pad;
>   };
>
>   struct drm_amdgpu_gem_create_out  {


[-- Attachment #1.2: Type: text/html, Size: 18245 bytes --]

[-- Attachment #2: Type: text/plain, Size: 153 bytes --]

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] drm/amdgpu: enable bo priority setting from user space
       [not found]         ` <-o8xodt-v7ma50s620vm-x3ufrzt16m3ru4l9qc4l8rct-ppumfj-lgzfos2xnj696p97zq-q88klx-1xor439yr648-3s2lfc-pglvz8-9du7dn8goc66-3zd1sv-cy6o2qkurchc-gpwxlg-c9iov0a657ue.1551963984191-2ueSQiBKiTY7tOexoI0I+QC/G2K4zDHf@public.gmane.org>
@ 2019-03-07 13:15           ` Koenig, Christian
       [not found]             ` <b2fed38f-bcc1-07df-625c-fa912022bdd4-5C7GfCeVMHo@public.gmane.org>
  0 siblings, 1 reply; 8+ messages in thread
From: Koenig, Christian @ 2019-03-07 13:15 UTC (permalink / raw)
  To: Zhou, David(ChunMing), amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW


[-- Attachment #1.1: Type: text/plain, Size: 9047 bytes --]

Well you can already use the per submission priority for the BOs.

Additional to that as I said for per VM BOs we can add a priority to sort them in the LRU.

Not sure how effective both of those actually are.

Regards,
Christian.

Am 07.03.19 um 14:09 schrieb Zhou, David(ChunMing):
Yes, you are right, thanks to point it out. Will see if there is other way.

-David

send from my phone

-------- Original Message --------
Subject: Re: [PATCH] drm/amdgpu: enable bo priority setting from user space
From: Christian König
To: "Zhou, David(ChunMing)" ,amd-gfx@lists.freedesktop.org<mailto:amd-gfx@lists.freedesktop.org>
CC:

Am 07.03.19 um 10:15 schrieb Chunming Zhou:
> Signed-off-by: Chunming Zhou <david1.zhou@amd.com><mailto:david1.zhou@amd.com>

Well NAK to the whole approach.

The TTM priority is a global priority, but processes are only allowed to
specific the priority inside their own allocations. So this approach
will never fly upstream.

What you can do is to add a priority for per vm BOs to affect their sort
order on the LRU, but I doubt that this will have much of an effect.

Regards,
Christian.

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c     |  1 +
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c    | 13 +++++++++++++
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h    |  2 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.c |  3 ++-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.h |  1 +
>   include/drm/ttm/ttm_bo_driver.h            |  9 ++++++++-
>   include/uapi/drm/amdgpu_drm.h              |  3 +++
>   7 files changed, 29 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> index 5cbde74b97dd..70a6baf20c22 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> @@ -144,6 +144,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
>        size = mode_cmd->pitches[0] * height;
>        aligned_size = ALIGN(size, PAGE_SIZE);
>        ret = amdgpu_gem_object_create(adev, aligned_size, 0, domain,
> +                                    TTM_BO_PRIORITY_NORMAL,
>                                       AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
>                                       AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
>                                       AMDGPU_GEM_CREATE_VRAM_CLEARED,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index d21dd2f369da..7c1c2362c67e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -44,6 +44,7 @@ void amdgpu_gem_object_free(struct drm_gem_object *gobj)
>
>   int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
>                             int alignment, u32 initial_domain,
> +                          enum ttm_bo_priority priority,
>                             u64 flags, enum ttm_bo_type type,
>                             struct reservation_object *resv,
>                             struct drm_gem_object **obj)
> @@ -60,6 +61,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
>        bp.type = type;
>        bp.resv = resv;
>        bp.preferred_domain = initial_domain;
> +     bp.priority = priority;
>   retry:
>        bp.flags = flags;
>        bp.domain = initial_domain;
> @@ -229,6 +231,14 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>        if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK)
>                return -EINVAL;
>
> +     /* check priority */
> +     if (args->in.priority == 0) {
> +             /* default is normal */
> +             args->in.priority = TTM_BO_PRIORITY_NORMAL;
> +     } else if (args->in.priority > TTM_MAX_BO_PRIORITY) {
> +             args->in.priority = TTM_MAX_BO_PRIORITY;
> +             DRM_ERROR("priority specified from user space is over MAX priority\n");
> +     }
>        /* create a gem object to contain this object in */
>        if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS |
>            AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) {
> @@ -252,6 +262,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>
>        r = amdgpu_gem_object_create(adev, size, args->in.alignment,
>                                     (u32)(0xffffffff & args->in.domains),
> +                                  args->in.priority - 1,
>                                     flags, ttm_bo_type_device, resv, &gobj);
>        if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
>                if (!r) {
> @@ -304,6 +315,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
>
>        /* create a gem object to contain this object in */
>        r = amdgpu_gem_object_create(adev, args->size, 0, AMDGPU_GEM_DOMAIN_CPU,
> +                                  TTM_BO_PRIORITY_NORMAL,
>                                     0, ttm_bo_type_device, NULL, &gobj);
>        if (r)
>                return r;
> @@ -755,6 +767,7 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,
>        domain = amdgpu_bo_get_preferred_pin_domain(adev,
>                                amdgpu_display_supported_domains(adev));
>        r = amdgpu_gem_object_create(adev, args->size, 0, domain,
> +                                  TTM_BO_PRIORITY_NORMAL,
>                                     AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
>                                     ttm_bo_type_device, NULL, &gobj);
>        if (r)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
> index f1ddfc50bcc7..47b0a8190948 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
> @@ -61,7 +61,7 @@ extern const struct dma_buf_ops amdgpu_dmabuf_ops;
>    */
>   void amdgpu_gem_force_release(struct amdgpu_device *adev);
>   int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
> -                          int alignment, u32 initial_domain,
> +                          int alignment, u32 initial_domain, u32 priority,
>                             u64 flags, enum ttm_bo_type type,
>                             struct reservation_object *resv,
>                             struct drm_gem_object **obj);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index fd9c4beeaaa4..c85304e03021 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -494,8 +494,9 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
>
>        bo->tbo.bdev = &adev->mman.bdev;
>        amdgpu_bo_placement_from_domain(bo, bp->domain);
> +     bo->tbo.priority = bp->priority;
>        if (bp->type == ttm_bo_type_kernel)
> -             bo->tbo.priority = 1;
> +             bo->tbo.priority = TTM_BO_PRIORITY_VERYHIGH;
>
>        r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,
>                                 &bo->placement, page_align, &ctx, acc_size,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index 9291c2f837e9..091a7884a821 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -39,6 +39,7 @@ struct amdgpu_bo_param {
>        int                             byte_align;
>        u32                             domain;
>        u32                             preferred_domain;
> +     u32                             priority;
>        u64                             flags;
>        enum ttm_bo_type                type;
>        struct reservation_object       *resv;
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index cbf3180cb612..53f39ed540d7 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -43,7 +43,14 @@
>   #include "ttm_placement.h"
>   #include "ttm_tt.h"
>
> -#define TTM_MAX_BO_PRIORITY  4U
> +enum ttm_bo_priority {
> +     TTM_BO_PRIORITY_VERYLOW = 0,
> +     TTM_BO_PRIORITY_LOW,
> +     TTM_BO_PRIORITY_NORMAL,
> +     TTM_BO_PRIORITY_HIGH,
> +     TTM_BO_PRIORITY_VERYHIGH,
> +     TTM_MAX_BO_PRIORITY
> +};
>
>   #define TTM_MEMTYPE_FLAG_FIXED         (1 << 0)     /* Fixed (on-card) PCI memory */
>   #define TTM_MEMTYPE_FLAG_MAPPABLE      (1 << 1)     /* Memory mappable */
> diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
> index b7718bfdf8ad..b74a7583d7f3 100644
> --- a/include/uapi/drm/amdgpu_drm.h
> +++ b/include/uapi/drm/amdgpu_drm.h
> @@ -138,6 +138,9 @@ struct drm_amdgpu_gem_create_in  {
>        __u64 domains;
>        /** allocation flags */
>        __u64 domain_flags;
> +     /** priority */
> +     __u32 priority;
> +     __u32 pad;
>   };
>
>   struct drm_amdgpu_gem_create_out  {



[-- Attachment #1.2: Type: text/html, Size: 19000 bytes --]

[-- Attachment #2: Type: text/plain, Size: 153 bytes --]

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re:[PATCH] drm/amdgpu: enable bo priority setting from user space
       [not found]             ` <b2fed38f-bcc1-07df-625c-fa912022bdd4-5C7GfCeVMHo@public.gmane.org>
@ 2019-03-07 13:31               ` Zhou, David(ChunMing)
  0 siblings, 0 replies; 8+ messages in thread
From: Zhou, David(ChunMing) @ 2019-03-07 13:31 UTC (permalink / raw)
  To: Koenig, Christian, Zhou, David(ChunMing),
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW


[-- Attachment #1.1: Type: text/plain, Size: 9402 bytes --]

yes,per submission bo list priority already is used by us. but per vm bo still is in fly, no priority on that.

-David

send from my phone

-------- Original Message --------
Subject: Re: [PATCH] drm/amdgpu: enable bo priority setting from user space
From: "Koenig, Christian"
To: "Zhou, David(ChunMing)" ,amd-gfx@lists.freedesktop.org
CC:

Well you can already use the per submission priority for the BOs.

Additional to that as I said for per VM BOs we can add a priority to sort them in the LRU.

Not sure how effective both of those actually are.

Regards,
Christian.

Am 07.03.19 um 14:09 schrieb Zhou, David(ChunMing):
Yes, you are right, thanks to point it out. Will see if there is other way.

-David

send from my phone

-------- Original Message --------
Subject: Re: [PATCH] drm/amdgpu: enable bo priority setting from user space
From: Christian König
To: "Zhou, David(ChunMing)" ,amd-gfx@lists.freedesktop.org<mailto:amd-gfx@lists.freedesktop.org>
CC:

Am 07.03.19 um 10:15 schrieb Chunming Zhou:
> Signed-off-by: Chunming Zhou <david1.zhou@amd.com><mailto:david1.zhou@amd.com>

Well NAK to the whole approach.

The TTM priority is a global priority, but processes are only allowed to
specific the priority inside their own allocations. So this approach
will never fly upstream.

What you can do is to add a priority for per vm BOs to affect their sort
order on the LRU, but I doubt that this will have much of an effect.

Regards,
Christian.

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c     |  1 +
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c    | 13 +++++++++++++
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h    |  2 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.c |  3 ++-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.h |  1 +
>   include/drm/ttm/ttm_bo_driver.h            |  9 ++++++++-
>   include/uapi/drm/amdgpu_drm.h              |  3 +++
>   7 files changed, 29 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> index 5cbde74b97dd..70a6baf20c22 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
> @@ -144,6 +144,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
>        size = mode_cmd->pitches[0] * height;
>        aligned_size = ALIGN(size, PAGE_SIZE);
>        ret = amdgpu_gem_object_create(adev, aligned_size, 0, domain,
> +                                    TTM_BO_PRIORITY_NORMAL,
>                                       AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
>                                       AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
>                                       AMDGPU_GEM_CREATE_VRAM_CLEARED,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index d21dd2f369da..7c1c2362c67e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -44,6 +44,7 @@ void amdgpu_gem_object_free(struct drm_gem_object *gobj)
>
>   int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
>                             int alignment, u32 initial_domain,
> +                          enum ttm_bo_priority priority,
>                             u64 flags, enum ttm_bo_type type,
>                             struct reservation_object *resv,
>                             struct drm_gem_object **obj)
> @@ -60,6 +61,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
>        bp.type = type;
>        bp.resv = resv;
>        bp.preferred_domain = initial_domain;
> +     bp.priority = priority;
>   retry:
>        bp.flags = flags;
>        bp.domain = initial_domain;
> @@ -229,6 +231,14 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>        if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK)
>                return -EINVAL;
>
> +     /* check priority */
> +     if (args->in.priority == 0) {
> +             /* default is normal */
> +             args->in.priority = TTM_BO_PRIORITY_NORMAL;
> +     } else if (args->in.priority > TTM_MAX_BO_PRIORITY) {
> +             args->in.priority = TTM_MAX_BO_PRIORITY;
> +             DRM_ERROR("priority specified from user space is over MAX priority\n");
> +     }
>        /* create a gem object to contain this object in */
>        if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS |
>            AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) {
> @@ -252,6 +262,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>
>        r = amdgpu_gem_object_create(adev, size, args->in.alignment,
>                                     (u32)(0xffffffff & args->in.domains),
> +                                  args->in.priority - 1,
>                                     flags, ttm_bo_type_device, resv, &gobj);
>        if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
>                if (!r) {
> @@ -304,6 +315,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
>
>        /* create a gem object to contain this object in */
>        r = amdgpu_gem_object_create(adev, args->size, 0, AMDGPU_GEM_DOMAIN_CPU,
> +                                  TTM_BO_PRIORITY_NORMAL,
>                                     0, ttm_bo_type_device, NULL, &gobj);
>        if (r)
>                return r;
> @@ -755,6 +767,7 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,
>        domain = amdgpu_bo_get_preferred_pin_domain(adev,
>                                amdgpu_display_supported_domains(adev));
>        r = amdgpu_gem_object_create(adev, args->size, 0, domain,
> +                                  TTM_BO_PRIORITY_NORMAL,
>                                     AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
>                                     ttm_bo_type_device, NULL, &gobj);
>        if (r)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
> index f1ddfc50bcc7..47b0a8190948 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
> @@ -61,7 +61,7 @@ extern const struct dma_buf_ops amdgpu_dmabuf_ops;
>    */
>   void amdgpu_gem_force_release(struct amdgpu_device *adev);
>   int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
> -                          int alignment, u32 initial_domain,
> +                          int alignment, u32 initial_domain, u32 priority,
>                             u64 flags, enum ttm_bo_type type,
>                             struct reservation_object *resv,
>                             struct drm_gem_object **obj);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index fd9c4beeaaa4..c85304e03021 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -494,8 +494,9 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
>
>        bo->tbo.bdev = &adev->mman.bdev;
>        amdgpu_bo_placement_from_domain(bo, bp->domain);
> +     bo->tbo.priority = bp->priority;
>        if (bp->type == ttm_bo_type_kernel)
> -             bo->tbo.priority = 1;
> +             bo->tbo.priority = TTM_BO_PRIORITY_VERYHIGH;
>
>        r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,
>                                 &bo->placement, page_align, &ctx, acc_size,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index 9291c2f837e9..091a7884a821 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -39,6 +39,7 @@ struct amdgpu_bo_param {
>        int                             byte_align;
>        u32                             domain;
>        u32                             preferred_domain;
> +     u32                             priority;
>        u64                             flags;
>        enum ttm_bo_type                type;
>        struct reservation_object       *resv;
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index cbf3180cb612..53f39ed540d7 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -43,7 +43,14 @@
>   #include "ttm_placement.h"
>   #include "ttm_tt.h"
>
> -#define TTM_MAX_BO_PRIORITY  4U
> +enum ttm_bo_priority {
> +     TTM_BO_PRIORITY_VERYLOW = 0,
> +     TTM_BO_PRIORITY_LOW,
> +     TTM_BO_PRIORITY_NORMAL,
> +     TTM_BO_PRIORITY_HIGH,
> +     TTM_BO_PRIORITY_VERYHIGH,
> +     TTM_MAX_BO_PRIORITY
> +};
>
>   #define TTM_MEMTYPE_FLAG_FIXED         (1 << 0)     /* Fixed (on-card) PCI memory */
>   #define TTM_MEMTYPE_FLAG_MAPPABLE      (1 << 1)     /* Memory mappable */
> diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
> index b7718bfdf8ad..b74a7583d7f3 100644
> --- a/include/uapi/drm/amdgpu_drm.h
> +++ b/include/uapi/drm/amdgpu_drm.h
> @@ -138,6 +138,9 @@ struct drm_amdgpu_gem_create_in  {
>        __u64 domains;
>        /** allocation flags */
>        __u64 domain_flags;
> +     /** priority */
> +     __u32 priority;
> +     __u32 pad;
>   };
>
>   struct drm_amdgpu_gem_create_out  {



[-- Attachment #1.2: Type: text/html, Size: 19243 bytes --]

[-- Attachment #2: Type: text/plain, Size: 153 bytes --]

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2019-03-07 13:31 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-07  9:15 [PATCH] drm/amdgpu: enable bo priority setting from user space Chunming Zhou
     [not found] ` <20190307091528.22788-1-david1.zhou-5C7GfCeVMHo@public.gmane.org>
2019-03-07  9:55   ` Michel Dänzer
     [not found]     ` <a8803c5e-d911-992e-2b67-13ed6ca29ccf-otUistvHUpPR7s880joybQ@public.gmane.org>
2019-03-07 10:48       ` zhoucm1
     [not found]         ` <1d4f0b7d-f726-3cad-13c3-36e670f35baf-5C7GfCeVMHo@public.gmane.org>
2019-03-07 11:33           ` Michel Dänzer
2019-03-07 11:36   ` Christian König
     [not found]     ` <a1efec4e-0cb9-f92f-2688-ecfd4ed7ad12-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2019-03-07 13:09       ` Zhou, David(ChunMing)
     [not found]         ` <-o8xodt-v7ma50s620vm-x3ufrzt16m3ru4l9qc4l8rct-ppumfj-lgzfos2xnj696p97zq-q88klx-1xor439yr648-3s2lfc-pglvz8-9du7dn8goc66-3zd1sv-cy6o2qkurchc-gpwxlg-c9iov0a657ue.1551963984191-2ueSQiBKiTY7tOexoI0I+QC/G2K4zDHf@public.gmane.org>
2019-03-07 13:15           ` [PATCH] " Koenig, Christian
     [not found]             ` <b2fed38f-bcc1-07df-625c-fa912022bdd4-5C7GfCeVMHo@public.gmane.org>
2019-03-07 13:31               ` Zhou, David(ChunMing)

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.