[PATCH 2/3] drm/amdgpu: introduce kfd user flag for amdgpu_bo

Nirmoy nirmodas at amd.com
Tue Mar 2 13:36:14 UTC 2021


On 3/2/21 2:06 PM, Christian König wrote:
> Am 02.03.21 um 14:01 schrieb Nirmoy:
>>
>> On 3/2/21 1:40 PM, Christian König wrote:
>>>
>>>
>>> Am 02.03.21 um 12:33 schrieb Nirmoy Das:
>>>> Introduce a new flag for amdgpu_bo->flags to identify if
>>>> a BO is created by KFD.
>>>>
>>>> Signed-off-by: Nirmoy Das <nirmoy.das at amd.com>
>>>> ---
>>>>   .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c       |  3 +-
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.c    | 48 
>>>> ++++++++++++++++++-
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.h    |  3 ++
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c       |  2 +-
>>>>   include/uapi/drm/amdgpu_drm.h                 |  5 ++
>>>>   6 files changed, 59 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>>> index 89d0e4f7c6a8..57798707cd5f 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>>> @@ -1227,7 +1227,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>>>>       bp.flags = alloc_flags;
>>>>       bp.type = bo_type;
>>>>       bp.resv = NULL;
>>>> -    ret = amdgpu_bo_create(adev, &bp, &bo);
>>>> +    ret = amdgpu_kfd_bo_create(adev, &bp, &bo);
>>>>       if (ret) {
>>>>           pr_debug("Failed to create BO on domain %s. ret %d\n",
>>>>                   domain_string(alloc_domain), ret);
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
>>>> index 8e9b8a6e6ef0..97d19f6b572d 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
>>>> @@ -234,7 +234,8 @@ int amdgpu_gem_create_ioctl(struct drm_device 
>>>> *dev, void *data,
>>>>                 AMDGPU_GEM_CREATE_VRAM_CLEARED |
>>>>                 AMDGPU_GEM_CREATE_VM_ALWAYS_VALID |
>>>>                 AMDGPU_GEM_CREATE_EXPLICIT_SYNC |
>>>> -              AMDGPU_GEM_CREATE_ENCRYPTED))
>>>> +              AMDGPU_GEM_CREATE_ENCRYPTED |
>>>> +              AMDGPU_GEM_USER_KFD))
>>>
>>> Please stick with the naming here. And why _USER_KFD and not just _KFD?
>>
>> Ok, I will rename it to AMDGPU_GEM_KFD which sounds much better.
>
> No. When you want to use those flags you should probably call this 
> AMDGPU_GEM_CREATE_KFD.


Ah I see.


Nirmoy


>
> Christian.
>
>>
>>
>> Thanks,
>>
>> Nirmoy
>>
>>>
>>>
>>> Christian.
>>>
>>>>             return -EINVAL;
>>>>   diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>>> index 0bd22ed1dacf..5ebce6d6784a 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>>> @@ -697,6 +697,52 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
>>>>       return r;
>>>>   }
>>>>   +/**
>>>> + * amdgpu_kfd_bo_create - create an &amdgpu_bo buffer object with 
>>>> kfd user flag
>>>> + * @adev: amdgpu device object
>>>> + * @bp: parameters to be used for the buffer object
>>>> + * @bo_ptr: pointer to the buffer object pointer
>>>> + *
>>>> + * Creates an &amdgpu_bo buffer object; and if requested, also 
>>>> creates a
>>>> + * shadow object.
>>>> + * Shadow object is used to backup the original buffer object, and 
>>>> is always
>>>> + * in GTT.
>>>> + *
>>>> + * Returns:
>>>> + * 0 for success or a negative error code on failure.
>>>> + */
>>>> +
>>>> +int amdgpu_kfd_bo_create(struct amdgpu_device *adev,
>>>> +             struct amdgpu_bo_param *bp,
>>>> +             struct amdgpu_bo **bo_ptr)
>>>> +{
>>>> +    u64 flags = bp->flags;
>>>> +    int r;
>>>> +
>>>> +    bp->flags = bp->flags & ~AMDGPU_GEM_CREATE_SHADOW;
>>>> +    bp->flags = bp->flags | AMDGPU_GEM_USER_KFD;
>>>> +    r = amdgpu_bo_do_create(adev, bp, bo_ptr);
>>>> +    if (r)
>>>> +        return r;
>>>> +
>>>> +    if ((flags & AMDGPU_GEM_CREATE_SHADOW) && !(adev->flags & 
>>>> AMD_IS_APU)) {
>>>> +        if (!bp->resv)
>>>> + WARN_ON(dma_resv_lock((*bo_ptr)->tbo.base.resv,
>>>> +                            NULL));
>>>> +
>>>> +        r = amdgpu_bo_create_shadow(adev, bp->size, *bo_ptr);
>>>> +
>>>> +        if (!bp->resv)
>>>> +            dma_resv_unlock((*bo_ptr)->tbo.base.resv);
>>>> +
>>>> +        if (r)
>>>> +            amdgpu_bo_unref(bo_ptr);
>>>> +    }
>>>> +
>>>> +    return r;
>>>> +}
>>>> +
>>>> +
>>>>   /**
>>>>    * amdgpu_bo_validate - validate an &amdgpu_bo buffer object
>>>>    * @bo: pointer to the buffer object
>>>> @@ -1309,7 +1355,7 @@ void amdgpu_bo_release_notify(struct 
>>>> ttm_buffer_object *bo)
>>>>         abo = ttm_to_amdgpu_bo(bo);
>>>>   -    if (abo->kfd_bo)
>>>> +    if (abo->flags & AMDGPU_GEM_USER_KFD)
>>>>           amdgpu_amdkfd_unreserve_memory_limit(abo);
>>>>         /* We only remove the fence if the resv has individualized. */
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>>>> index 8cd96c9330dd..665ee0015f06 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>>>> @@ -245,6 +245,9 @@ void amdgpu_bo_placement_from_domain(struct 
>>>> amdgpu_bo *abo, u32 domain);
>>>>   int amdgpu_bo_create(struct amdgpu_device *adev,
>>>>                struct amdgpu_bo_param *bp,
>>>>                struct amdgpu_bo **bo_ptr);
>>>> +int amdgpu_kfd_bo_create(struct amdgpu_device *adev,
>>>> +             struct amdgpu_bo_param *bp,
>>>> +             struct amdgpu_bo **bo_ptr);
>>>>   int amdgpu_bo_create_reserved(struct amdgpu_device *adev,
>>>>                     unsigned long size, int align,
>>>>                     u32 domain, struct amdgpu_bo **bo_ptr,
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>>> index 7b2db779f313..d36b1932db78 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>>> @@ -164,7 +164,7 @@ static int amdgpu_verify_access(struct 
>>>> ttm_buffer_object *bo, struct file *filp)
>>>>        * Don't verify access for KFD BOs. They don't have a GEM
>>>>        * object associated with them.
>>>>        */
>>>> -    if (abo->kfd_bo)
>>>> +    if (abo->flags & AMDGPU_GEM_USER_KFD)
>>>>           return 0;
>>>>         if (amdgpu_ttm_tt_get_usermm(bo->ttm))
>>>> diff --git a/include/uapi/drm/amdgpu_drm.h 
>>>> b/include/uapi/drm/amdgpu_drm.h
>>>> index 8b832f7458f2..f7157bd8a1f0 100644
>>>> --- a/include/uapi/drm/amdgpu_drm.h
>>>> +++ b/include/uapi/drm/amdgpu_drm.h
>>>> @@ -142,6 +142,11 @@ extern "C" {
>>>>    */
>>>>   #define AMDGPU_GEM_CREATE_ENCRYPTED        (1 << 10)
>>>>   +/* Flag that the allocating BO's user is KFD. It should never be 
>>>> used by
>>>> + * user space applications
>>>> + */
>>>> +#define AMDGPU_GEM_USER_KFD            (1 << 20)
>>>> +
>>>>   struct drm_amdgpu_gem_create_in  {
>>>>       /** the requested memory size */
>>>>       __u64 bo_size;
>>>
>


More information about the amd-gfx mailing list