[PATCH 2/2] drm/amdkfd: Release an acquired process vm

Oak zengshanjun at gmail.com
Tue Aug 28 12:37:09 UTC 2018


Good point. I also planned to do it the way you suggested.

Sent from my iPad

On 2018-08-28, at 7:21 AM, Christian König <ckoenig.leichtzumerken at gmail.com> wrote:

> Am 27.08.2018 um 22:45 schrieb Oak Zeng:
>> For compute vm acquired from amdgpu, vm.pasid is managed
>> by kfd. Decouple pasid from such vm on process destroy
>> to avoid duplicate pasid release.
>> 
>> Signed-off-by: Oak Zeng <Oak.Zeng at amd.com>
>> ---
>>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h        |  1 +
>>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c |  1 +
>>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c |  1 +
>>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c |  1 +
>>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  | 26 +++++++++++++++++++++++
>>  drivers/gpu/drm/amd/amdkfd/kfd_process.c          |  4 +++-
>>  drivers/gpu/drm/amd/include/kgd_kfd_interface.h   |  1 +
>>  7 files changed, 34 insertions(+), 1 deletion(-)
>> 
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
>> index e1f6454..b414889 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
>> @@ -165,6 +165,7 @@ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd,
>>  void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,
>>                  struct amdgpu_vm *vm);
>>  void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm);
>> +void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm);
>>  uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm);
>>  int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>>          struct kgd_dev *kgd, uint64_t va, uint64_t size,
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
>> index ea79908..03a83d3 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
>> @@ -204,6 +204,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
>>      .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
>>      .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm,
>>      .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
>> +    .release_process_vm = amdgpu_amdkfd_gpuvm_release_process_vm,
>>      .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
>>      .set_vm_context_page_table_base = set_vm_context_page_table_base,
>>      .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
>> index 19dd665..b2b9c5f 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
>> @@ -164,6 +164,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
>>      .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
>>      .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm,
>>      .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
>> +    .release_process_vm = amdgpu_amdkfd_gpuvm_release_process_vm,
>>      .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
>>      .set_vm_context_page_table_base = set_vm_context_page_table_base,
>>      .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
>> index 1db60aa..3722bbd 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
>> @@ -201,6 +201,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
>>      .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
>>      .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm,
>>      .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
>> +    .release_process_vm = amdgpu_amdkfd_gpuvm_release_process_vm,
>>      .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
>>      .set_vm_context_page_table_base = set_vm_context_page_table_base,
>>      .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>> index 0980a1f..6fd839c 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>> @@ -1117,6 +1117,32 @@ void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm)
>>      kfree(vm);
>>  }
>>  +void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm)
>> +{
>> +    struct amdgpu_device *adev = get_amdgpu_device(kgd);
>> +        struct amdgpu_vm *avm = (struct amdgpu_vm *)vm;
>> +
>> +        if (WARN_ON(!vm))
>> +                return;
>> +
>> +        pr_debug("Releasing process vm %p\n", vm);
>> +
>> +        /* The original pasid of amdgpu vm has already been
>> +         * released during making a amdgpu vm to a compute vm
>> +         * The current pasid is managed by kfd and will be
>> +         * released on kfd process destroy. Set amdgpu pasid
>> +         * to 0 to avoid duplicate release.
>> +         */
>> +    if (avm->pasid) {
>> +        unsigned long flags;
>> +
>> +        spin_lock_irqsave(&adev->vm_manager.pasid_lock, flags);
>> +        idr_remove(&adev->vm_manager.pasid_idr, avm->pasid);
>> +        spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, flags);
>> +    }
>> +    avm->pasid = 0;
> 
> Can we factor this out into a helper inside amdgpu_vm.c?
> 
> Would be nice to not manipulate VM internals here.
> 
> Christian.
> 
>> +}
>> +
>>  uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm)
>>  {
>>      struct amdgpu_vm *avm = (struct amdgpu_vm *)vm;
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>> index 5f559c5..7afeaa1 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>> @@ -320,8 +320,10 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)
>>          pr_debug("Releasing pdd (topology id %d) for process (pasid %d)\n",
>>                  pdd->dev->id, p->pasid);
>>  -        if (pdd->drm_file)
>> +        if (pdd->drm_file) {
>> +            pdd->dev->kfd2kgd->release_process_vm(pdd->dev->kgd, pdd->vm);
>>              fput(pdd->drm_file);
>> +        }
>>          else if (pdd->vm)
>>              pdd->dev->kfd2kgd->destroy_process_vm(
>>                  pdd->dev->kgd, pdd->vm);
>> diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
>> index 1632869..8fdd032 100644
>> --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
>> +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
>> @@ -352,6 +352,7 @@ struct kfd2kgd_calls {
>>              unsigned int pasid, void **vm, void **process_info,
>>              struct dma_fence **ef);
>>      void (*destroy_process_vm)(struct kgd_dev *kgd, void *vm);
>> +    void (*release_process_vm)(struct kgd_dev *kgd, void *vm);
>>      uint32_t (*get_process_page_dir)(void *vm);
>>      void (*set_vm_context_page_table_base)(struct kgd_dev *kgd,
>>              uint32_t vmid, uint32_t page_table_base);
> 


More information about the amd-gfx mailing list