[PATCH v2 3/3] drm/amdgpu: drm/amdkfd: add amdgpu_kfd_bo struct
Nirmoy
nirmodas at amd.com
Fri Mar 5 09:13:42 UTC 2021
On 3/5/21 1:37 AM, Felix Kuehling wrote:
> Am 2021-03-03 um 7:04 a.m. schrieb Christian König:
>> Am 03.03.21 um 10:25 schrieb Nirmoy Das:
>>> Implement a new struct based on amdgpu_bo base class
>>> for BOs created by kfd device so that kfd related memeber
>>> of amdgpu_bo can be moved there.
>> You should probably restructure which patch has which code in it here.
>>
>> The first one adds the general infrastructure and makes the necessary
>> modification to allow allocating BO structures with different
>> structure size.
>>
>> And the second then adds the amdgpu_kfd_bo structure so that the KFD
>> can use it.
>>
>> You should also double check with Felix if we don't support importing
>> BOs from elsewhere here and if that approach is correct.
> We do support importing graphics BOs into KFD processes.
Ok so this approach is not going to work then.
Thanks,
Nirmoy
>
> Regards,
> Felix
>
>
>> Regards,
>> Christian.
>>
>>> v2: rename AMDGPU_GEM_USER_KFD -> AMDGPU_GEM_CREATE_KFD
>>>
>>> Signed-off-by: Nirmoy Das <nirmoy.das at amd.com>
>>> ---
>>> .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 10 ++++--
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c | 3 +-
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 32 ++++++++++++++-----
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 8 ++++-
>>> 4 files changed, 40 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>> index 57798707cd5f..1f52ae4de609 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>> @@ -1152,6 +1152,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>>> struct sg_table *sg = NULL;
>>> uint64_t user_addr = 0;
>>> struct amdgpu_bo *bo;
>>> + struct amdgpu_kfd_bo *kbo;
>>> struct amdgpu_bo_param bp;
>>> u32 domain, alloc_domain;
>>> u64 alloc_flags;
>>> @@ -1227,17 +1228,20 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>>> bp.flags = alloc_flags;
>>> bp.type = bo_type;
>>> bp.resv = NULL;
>>> - ret = amdgpu_kfd_bo_create(adev, &bp, &bo);
>>> + ret = amdgpu_kfd_bo_create(adev, &bp, &kbo);
>>> if (ret) {
>>> pr_debug("Failed to create BO on domain %s. ret %d\n",
>>> domain_string(alloc_domain), ret);
>>> goto err_bo_create;
>>> }
>>> +
>>> + bo = &kbo->bo;
>>> if (bo_type == ttm_bo_type_sg) {
>>> bo->tbo.sg = sg;
>>> bo->tbo.ttm->sg = sg;
>>> }
>>> - bo->kfd_bo = *mem;
>>> +
>>> + kbo->kfd_bo = *mem;
>>> (*mem)->bo = bo;
>>> if (user_addr)
>>> bo->flags |= AMDGPU_AMDKFD_USERPTR_BO;
>>> @@ -1261,7 +1265,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>>>
>>> allocate_init_user_pages_failed:
>>> remove_kgd_mem_from_kfd_bo_list(*mem, avm->process_info);
>>> - amdgpu_bo_unref(&bo);
>>> + amdgpu_kfd_bo_unref(&kbo);
>>> /* Don't unreserve system mem limit twice */
>>> goto err_reserve_limit;
>>> err_bo_create:
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c
>>> index 1da67cf812b1..eaaf4940abcb 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c
>>> @@ -102,6 +102,7 @@ static bool amdgpu_mn_invalidate_hsa(struct
>>> mmu_interval_notifier *mni,
>>> unsigned long cur_seq)
>>> {
>>> struct amdgpu_bo *bo = container_of(mni, struct amdgpu_bo,
>>> notifier);
>>> + struct amdgpu_kfd_bo *kbo = container_of(bo, struct
>>> amdgpu_kfd_bo, bo);
>>> struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
>>>
>>> if (!mmu_notifier_range_blockable(range))
>>> @@ -111,7 +112,7 @@ static bool amdgpu_mn_invalidate_hsa(struct
>>> mmu_interval_notifier *mni,
>>>
>>> mmu_interval_set_seq(mni, cur_seq);
>>>
>>> - amdgpu_amdkfd_evict_userptr(bo->kfd_bo, bo->notifier.mm);
>>> + amdgpu_amdkfd_evict_userptr(kbo->kfd_bo, bo->notifier.mm);
>>> mutex_unlock(&adev->notifier_lock);
>>>
>>> return true;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>> index 1b41b4870c99..787eb99119a2 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>> @@ -551,8 +551,10 @@ static int amdgpu_bo_do_create(struct
>>> amdgpu_device *adev,
>>>
>>> acc_size = ttm_bo_dma_acc_size(&adev->mman.bdev, size,
>>> sizeof(struct amdgpu_bo));
>>> + if (bp->bo_ptr_size < sizeof(struct amdgpu_bo))
>>> + bp->bo_ptr_size = sizeof(struct amdgpu_bo);
>>>
>>> - bo = kzalloc(sizeof(struct amdgpu_bo), GFP_KERNEL);
>>> + bo = kzalloc(bp->bo_ptr_size, GFP_KERNEL);
>>> if (bo == NULL)
>>> return -ENOMEM;
>>> drm_gem_private_object_init(adev_to_drm(adev), &bo->tbo.base,
>>> size);
>>> @@ -714,35 +716,37 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
>>>
>>> int amdgpu_kfd_bo_create(struct amdgpu_device *adev,
>>> struct amdgpu_bo_param *bp,
>>> - struct amdgpu_bo **bo_ptr)
>>> + struct amdgpu_kfd_bo **kfd_bo_ptr)
>>> {
>>> + 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_CREATE_KFD;
>>> - r = amdgpu_bo_do_create(adev, bp, bo_ptr);
>>> + bp->bo_ptr_size = sizeof(struct amdgpu_kfd_bo);
>>> + r = amdgpu_bo_do_create(adev, bp, &bo_ptr);
>>> if (r)
>>> return r;
>>>
>>> + *kfd_bo_ptr = (struct amdgpu_kfd_bo *)bo_ptr;
>>> if ((flags & AMDGPU_GEM_CREATE_SHADOW) && !(adev->flags &
>>> AMD_IS_APU)) {
>>> if (!bp->resv)
>>> - WARN_ON(dma_resv_lock((*bo_ptr)->tbo.base.resv,
>>> + WARN_ON(dma_resv_lock((*kfd_bo_ptr)->bo.tbo.base.resv,
>>> NULL));
>>>
>>> - r = amdgpu_bo_create_shadow(adev, bp->size, *bo_ptr);
>>> + r = amdgpu_bo_create_shadow(adev, bp->size,
>>> &(*kfd_bo_ptr)->bo);
>>>
>>> if (!bp->resv)
>>> - dma_resv_unlock((*bo_ptr)->tbo.base.resv);
>>> + dma_resv_unlock((*kfd_bo_ptr)->bo.tbo.base.resv);
>>>
>>> if (r)
>>> - amdgpu_bo_unref(bo_ptr);
>>> + amdgpu_kfd_bo_unref(kfd_bo_ptr);
>>> }
>>>
>>> return r;
>>> }
>>>
>>> -
>>> /**
>>> * amdgpu_bo_validate - validate an &amdgpu_bo buffer object
>>> * @bo: pointer to the buffer object
>>> @@ -910,6 +914,18 @@ void amdgpu_bo_unref(struct amdgpu_bo **bo)
>>> *bo = NULL;
>>> }
>>>
>>> +void amdgpu_kfd_bo_unref(struct amdgpu_kfd_bo **kbo)
>>> +{
>>> + struct ttm_buffer_object *tbo;
>>> +
>>> + if ((*kbo) == NULL)
>>> + return;
>>> +
>>> + tbo = &((*kbo)->bo.tbo);
>>> + ttm_bo_put(tbo);
>>> + *kbo = NULL;
>>> +}
>>> +
>>> /**
>>> * amdgpu_bo_pin_restricted - pin an &amdgpu_bo buffer object
>>> * @bo: &amdgpu_bo buffer object to be pinned
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>>> index 665ee0015f06..fa98a1fe2574 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>>> @@ -43,6 +43,8 @@ struct amdgpu_bo_param {
>>> u32 domain;
>>> u32 preferred_domain;
>>> u64 flags;
>>> + /* size of a subclass using amdgpu_bo as base class */
>>> + u32 bo_ptr_size;
>>> enum ttm_bo_type type;
>>> bool no_wait_gpu;
>>> struct dma_resv *resv;
>>> @@ -109,7 +111,10 @@ struct amdgpu_bo {
>>> #endif
>>>
>>> struct list_head shadow_list;
>>> +};
>>>
>>> +struct amdgpu_kfd_bo {
>>> + struct amdgpu_bo bo;
>>> struct kgd_mem *kfd_bo;
>>> };
>>>
>>> @@ -247,7 +252,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
>>> struct amdgpu_bo **bo_ptr);
>>> int amdgpu_kfd_bo_create(struct amdgpu_device *adev,
>>> struct amdgpu_bo_param *bp,
>>> - struct amdgpu_bo **bo_ptr);
>>> + struct amdgpu_kfd_bo **bo_ptr);
>>> int amdgpu_bo_create_reserved(struct amdgpu_device *adev,
>>> unsigned long size, int align,
>>> u32 domain, struct amdgpu_bo **bo_ptr,
>>> @@ -266,6 +271,7 @@ void *amdgpu_bo_kptr(struct amdgpu_bo *bo);
>>> void amdgpu_bo_kunmap(struct amdgpu_bo *bo);
>>> struct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo);
>>> void amdgpu_bo_unref(struct amdgpu_bo **bo);
>>> +void amdgpu_kfd_bo_unref(struct amdgpu_kfd_bo **kbo);
>>> int amdgpu_bo_pin(struct amdgpu_bo *bo, u32 domain);
>>> int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
>>> u64 min_offset, u64 max_offset);
>>> --
>>> 2.30.1
>>>
>>> _______________________________________________
>>> amd-gfx mailing list
>>> amd-gfx at lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list