[PATCH 4/6] drm/amdgpu: add limitation for dedicated vm number v2

Christian König deathsimple at vodafone.de
Wed Apr 26 08:53:43 UTC 2017


Am 26.04.2017 um 09:10 schrieb Zhang, Jerry (Junwei):
> On 04/24/2017 01:57 PM, Chunming Zhou wrote:
>> v2: move #define to amdgpu_vm.h
>>
>> Change-Id: Ie5958cf6dbdc1c8278e61d9158483472d6f5c6e3
>> Signed-off-by: Chunming Zhou <David1.Zhou at amd.com>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu.h        | 1 +
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 +
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c     | 9 +++++++++
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h     | 2 ++
>>   4 files changed, 13 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> index 0831cd2..ba9d3d0 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> @@ -1591,6 +1591,7 @@ struct amdgpu_device {
>>       struct amdgpu_dummy_page    dummy_page;
>>       struct amdgpu_vm_manager    vm_manager;
>>       struct amdgpu_vmhub             vmhub[AMDGPU_MAX_VMHUBS];
>> +    atomic_t            reserved_vmid;
>
> Perhaps it's more reasonable to belongs to vm_manager.

Yes, agree.

>
> Jerry
>
>>
>>       /* memory management */
>>       struct amdgpu_mman        mman;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> index a175dfd..9993085 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
>> @@ -1889,6 +1889,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
>>       adev->vm_manager.vm_pte_num_rings = 0;
>>       adev->gart.gart_funcs = NULL;
>>       adev->fence_context = kcl_fence_context_alloc(AMDGPU_MAX_RINGS);
>> +    atomic_set(&adev->reserved_vmid, 0);
>>
>>       adev->smc_rreg = &amdgpu_invalid_rreg;
>>       adev->smc_wreg = &amdgpu_invalid_wreg;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> index 5f4dcc9..f7113b9 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> @@ -565,6 +565,10 @@ static int amdgpu_vm_alloc_dedicated_vmid(struct 
>> amdgpu_device *adev,
>>       unsigned vmhub;
>>       int r;
>>
>> +    if (atomic_read(&adev->reserved_vmid) >= 
>> AMDGPU_VM_MAX_RESERVED_VMID) {
>> +        DRM_ERROR("Over limitation of reserved vmid\n");
>> +        return -EINVAL;
>> +    }
>>       for (vmhub = 0; vmhub < AMDGPU_MAX_VMHUBS; vmhub++) {
>>           id_mgr = &adev->vm_manager.id_mgr[vmhub];
>>
>> @@ -580,6 +584,7 @@ static int amdgpu_vm_alloc_dedicated_vmid(struct 
>> amdgpu_device *adev,
>>           if (r)
>>               goto err;
>>       }
>> +    atomic_inc(&adev->reserved_vmid);

That's not atomic at all, two threads could try to reserve a VMID at the 
same time and race.

You need to use atomic_inc_return for this before allocating the IDs and 
properly clean up if allocating them fails.

>>
>>       return 0;
>>   err:
>> @@ -2302,6 +2307,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, 
>> struct amdgpu_vm *vm)
>>   {
>>       struct amdgpu_bo_va_mapping *mapping, *tmp;
>>       bool prt_fini_needed = !!adev->gart.gart_funcs->set_prt;
>> +    bool dedicated = false;
>>       int i;
>>
>>       if (vm->is_kfd_vm) {
>> @@ -2354,9 +2360,12 @@ void amdgpu_vm_fini(struct amdgpu_device 
>> *adev, struct amdgpu_vm *vm)
>>               list_add(&vm->dedicated_vmid[i]->list,
>>                    &id_mgr->ids_lru);
>>               vm->dedicated_vmid[i] = NULL;
>> +            dedicated = true;
>>           }
>>           mutex_unlock(&id_mgr->lock);
>>       }
>> +    if (dedicated)
>> +        atomic_dec(&adev->reserved_vmid);
>>   }
>>
>>   /**
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> index 23981ee..2d3e6ed 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> @@ -83,6 +83,8 @@
>>
>>   /* hardcode that limit for now */
>>   #define AMDGPU_VA_RESERVED_SIZE            (8 << 20)
>> +/* max vmids dedicated for process */
>> +#define AMDGPU_VM_MAX_RESERVED_VMID 2

This should be 1 instead of 2, or did I miss something?

Regards,
Christian.

>>
>>   struct amdgpu_vm_pt {
>>       struct amdgpu_bo    *bo;
>>
> _______________________________________________
> 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