[PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on demand

Christian König ckoenig.leichtzumerken at gmail.com
Tue Mar 12 15:09:02 UTC 2019


Yeah, same problem here.

I removed libhsakmt package and installed it manually and now it seems 
to work.

Doing some testing now, but at least of hand I can't seem to reproduce 
the VM fault on a Vega10.

Christian.

Am 12.03.19 um 16:01 schrieb Russell, Kent:
> Oh right, I remember that issue. I had that happen to me once, where my installed libhsakmt didn't match up with the latest source code, so I ended up having to remove the libhsakmt package and pointing it to the folders instead.
>
>   Kent
>
>> -----Original Message-----
>> From: Koenig, Christian
>> Sent: Tuesday, March 12, 2019 10:49 AM
>> To: Russell, Kent <Kent.Russell at amd.com>; Kuehling, Felix
>> <Felix.Kuehling at amd.com>; amd-gfx at lists.freedesktop.org
>> Subject: Re: [PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on demand
>>
>> Yeah, the problem is I do have the libhsakmt installed.
>>
>> Going to give it a try to specify the directory directly.
>>
>> Christian.
>>
>> Am 12.03.19 um 15:47 schrieb Russell, Kent:
>>> The README.txt file inside the tests/kfdtest folder has instructions on how
>> to do it if you don't have the libhsakmt package installed on your system:
>>> export LIBHSAKMT_PATH=/*your local libhsakmt folder*/ With that, the
>>> headers and libraries are searched under LIBHSAKMT_PATH/include and
>>> LIBHSAKMT_PATH/lib respectively.
>>>
>>> So if you try export LIBHSAKMT_PATH as the root ROCT folder (the one
>> containing include, src, tests, etc), then that should cover it.
>>>    Kent
>>>
>>>
>>>> -----Original Message-----
>>>> From: Christian König <ckoenig.leichtzumerken at gmail.com>
>>>> Sent: Tuesday, March 12, 2019 9:13 AM
>>>> To: Russell, Kent <Kent.Russell at amd.com>; Kuehling, Felix
>>>> <Felix.Kuehling at amd.com>; Koenig, Christian
>>>> <Christian.Koenig at amd.com>; amd-gfx at lists.freedesktop.org
>>>> Subject: Re: [PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on demand
>>>>
>>>> Hi guys,
>>>>
>>>> so found a few minutes today to compile kfdtest.
>>>>
>>>> Problem is that during the compile I get a lots of this:
>>>>> CMakeFiles/kfdtest.dir/src/BaseQueue.cpp.o: In Funktion
>>>>> »BaseQueue::Create(unsigned int, unsigned int, unsigned long*)«:
>>>>> /usr/src/ROCT-Thunk-Interface/tests/kfdtest/src/BaseQueue.cpp:57:
>>>>> Warnung: undefinierter Verweis auf »hsaKmtCreateQueue«
>>>> Any idea?
>>>>
>>>> Christian.
>>>>
>>>> Am 11.03.19 um 17:55 schrieb Christian König:
>>>>> Hi guys,
>>>>>
>>>>> well it's most likely some missing handling in the KFD, so I'm
>>>>> rather reluctant to revert the change immediately.
>>>>>
>>>>> Problem is that I don't have time right now to look into it
>>>>> immediately. So Kent can you continue to take a look?
>>>>>
>>>>> Sounds like its crashing immediately, so it should be something obvious.
>>>>>
>>>>> Christian.
>>>>>
>>>>> Am 11.03.19 um 10:49 schrieb Russell, Kent:
>>>>>>    From what I've been able to dig through, the VM Fault seems to
>>>>>> occur right after a doorbell mmap, but that's as far as I got. I
>>>>>> can try to revert it in today's merge and see how things go.
>>>>>>
>>>>>>     Kent
>>>>>>
>>>>>>> -----Original Message-----
>>>>>>> From: Kuehling, Felix
>>>>>>> Sent: Friday, March 08, 2019 11:16 PM
>>>>>>> To: Koenig, Christian <Christian.Koenig at amd.com>; Russell, Kent
>>>>>>> <Kent.Russell at amd.com>; amd-gfx at lists.freedesktop.org
>>>>>>> Subject: RE: [PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on
>> demand
>>>>>>> My concerns were related to eviction fence handing. It would
>>>>>>> manifest by unnecessary eviction callbacks into KFD that aren't
>>>>>>> cause by real evictions. I addressed that with a previous patch
>>>>>>> series that removed the need to remove eviction fences and add
>>>>>>> them back around page table updates in amdgpu_amdkfd_gpuvm.c.
>>>>>>>
>>>>>>> I don't know what's going on here. I can probably take a look on
>>>>>>> Monday. I haven't considered what changed with respect to PD
>>>>>>> updates.
>>>>>>>
>>>>>>> Kent, can we temporarily revert the offending change in
>>>>>>> amd-kfd-staging just to unblock the merge?
>>>>>>>
>>>>>>> Christian, I think KFD is currently broken on amd-staging-drm-next.
>>>>>>> If we're
>>>>>>> serious about supporting KFD upstream, you may also want to
>>>>>>> consider reverting your change there for now. Also consider
>>>>>>> building the Thunk and kfdtest so you can do quick smoke tests
>>>>>>> locally whenever you make amdgpu_vm changes that can affect KFD.
>>>>>>> https://github.com/RadeonOpenCompute/ROCT-Thunk-Interface
>>>>>>>
>>>>>>> Regards,
>>>>>>>      Felix
>>>>>>>
>>>>>>> -----Original Message-----
>>>>>>> From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On Behalf
>> Of
>>>>>>> Christian König
>>>>>>> Sent: Friday, March 08, 2019 9:14 AM
>>>>>>> To: Russell, Kent <Kent.Russell at amd.com>;
>>>>>>> amd-gfx at lists.freedesktop.org
>>>>>>> Subject: Re: [PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on
>> demand
>>>>>>> My best guess is that we forget somewhere to update the PDs. What
>>>>>>> hardware is that on?
>>>>>>>
>>>>>>> Felix already mentioned that this could be problematic for the KFD.
>>>>>>>
>>>>>>> Maybe he has an idea,
>>>>>>> Christian.
>>>>>>>
>>>>>>> Am 08.03.19 um 15:04 schrieb Russell, Kent:
>>>>>>>> Hi Christian,
>>>>>>>>
>>>>>>>> This patch ended up causing a VM Fault in KFDTest. Reverting just
>>>>>>>> this
>>>>>>> patch addressed the issue:
>>>>>>>> [   82.703503] amdgpu 0000:0c:00.0: GPU fault detected: 146
>>>>>>>> 0x0000480c for
>>>>>>> process  pid 0 thread  pid 0
>>>>>>>> [   82.703512] amdgpu 0000:0c:00.0:
>>>>>>> VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x00001000
>>>>>>>> [   82.703516] amdgpu 0000:0c:00.0:
>>>>>>> VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x1004800C
>>>>>>>> [   82.703522] amdgpu 0000:0c:00.0: VM fault (0x0c, vmid 8, pasid
>>>>>>>> 32769) at
>>>>>>> page 4096, read from 'TC0' (0x54433000) (72)
>>>>>>>> [   82.703585] Evicting PASID 32769 queues
>>>>>>>>
>>>>>>>> I am looking into it, but if you have any insight that would be
>>>>>>>> great in
>>>>>>> helping to resolve it quickly.
>>>>>>>>      Kent
>>>>>>>>> -----Original Message-----
>>>>>>>>> From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On
>> Behalf
>>>> Of
>>>>>>>>> Christian König
>>>>>>>>> Sent: Tuesday, February 26, 2019 7:47 AM
>>>>>>>>> To: amd-gfx at lists.freedesktop.org
>>>>>>>>> Subject: [PATCH 3/6] drm/amdgpu: allocate VM PDs/PTs on
>> demand
>>>>>>>>> Let's start to allocate VM PDs/PTs on demand instead of
>>>>>>>>> pre-allocating them during mapping.
>>>>>>>>>
>>>>>>>>> Signed-off-by: Christian König <christian.koenig at amd.com>
>>>>>>>>> Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
>>>>>>>>> ---
>>>>>>>>>      .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  |  10 +-
>>>>>>>>>      drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c       |   9 --
>>>>>>>>>      drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c       |  10 --
>>>>>>>>>      drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c        | 136
>>>>>>>>> +++++------------
>>>>>>> -
>>>>>>>>> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h        |   3 -
>>>>>>>>>      5 files changed, 39 insertions(+), 129 deletions(-)
>>>>>>>>>
>>>>>>>>> diff --git
>> a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>>>>>>>> index 31e3953dcb6e..088e9b6b765b 100644
>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>>>>>>>> @@ -410,15 +410,7 @@ static int add_bo_to_vm(struct
>>>> amdgpu_device
>>>>>>>>> *adev, struct kgd_mem *mem,
>>>>>>>>>          if (p_bo_va_entry)
>>>>>>>>>              *p_bo_va_entry = bo_va_entry;
>>>>>>>>>
>>>>>>>>> -    /* Allocate new page tables if needed and validate
>>>>>>>>> -     * them.
>>>>>>>>> -     */
>>>>>>>>> -    ret = amdgpu_vm_alloc_pts(adev, vm, va,
>>>>>>>>> amdgpu_bo_size(bo));
>>>>>>>>> -    if (ret) {
>>>>>>>>> -        pr_err("Failed to allocate pts, err=%d\n", ret);
>>>>>>>>> -        goto err_alloc_pts;
>>>>>>>>> -    }
>>>>>>>>> -
>>>>>>>>> +    /* Allocate validate page tables if needed */
>>>>>>>>>          ret = vm_validate_pt_pd_bos(vm);
>>>>>>>>>          if (ret) {
>>>>>>>>>              pr_err("validate_pt_pd_bos() failed\n"); diff --git
>>>>>>>>> a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
>>>>>>>>> index 7e22be7ca68a..54dd02a898b9 100644
>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
>>>>>>>>> @@ -92,15 +92,6 @@ int amdgpu_map_static_csa(struct
>>>> amdgpu_device
>>>>>>>>> *adev, struct amdgpu_vm *vm,
>>>>>>>>>              return -ENOMEM;
>>>>>>>>>          }
>>>>>>>>>
>>>>>>>>> -    r = amdgpu_vm_alloc_pts(adev, (*bo_va)->base.vm, csa_addr,
>>>>>>>>> -                size);
>>>>>>>>> -    if (r) {
>>>>>>>>> -        DRM_ERROR("failed to allocate pts for static CSA,
>>>>>>>>> err=%d\n", r);
>>>>>>>>> -        amdgpu_vm_bo_rmv(adev, *bo_va);
>>>>>>>>> -        ttm_eu_backoff_reservation(&ticket, &list);
>>>>>>>>> -        return r;
>>>>>>>>> -    }
>>>>>>>>> -
>>>>>>>>>          r = amdgpu_vm_bo_map(adev, *bo_va, csa_addr, 0, size,
>>>>>>>>>                       AMDGPU_PTE_READABLE | AMDGPU_PTE_WRITEABLE
>>>>>>>>> |
>>>>>>>>>                       AMDGPU_PTE_EXECUTABLE); diff --git
>>>>>>>>> a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
>>>>>>>>> index 555285e329ed..fcaaac30e84b 100644
>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
>>>>>>>>> @@ -625,11 +625,6 @@ int amdgpu_gem_va_ioctl(struct
>> drm_device
>>>>>>> *dev,
>>>>>>>>> void *data,
>>>>>>>>>
>>>>>>>>>          switch (args->operation) {
>>>>>>>>>          case AMDGPU_VA_OP_MAP:
>>>>>>>>> -        r = amdgpu_vm_alloc_pts(adev, bo_va->base.vm, args-
>>>>>>>>>> va_address,
>>>>>>>>> -                    args->map_size);
>>>>>>>>> -        if (r)
>>>>>>>>> -            goto error_backoff;
>>>>>>>>> -
>>>>>>>>>              va_flags = amdgpu_gmc_get_pte_flags(adev,
>>>>>>>>> args->flags);
>>>>>>>>>              r = amdgpu_vm_bo_map(adev, bo_va, args->va_address,
>>>>>>>>>                           args->offset_in_bo, args->map_size, @@
>>>>>>>>> -
>>>>>>>>> 645,11 +640,6 @@ int amdgpu_gem_va_ioctl(struct drm_device
>> *dev,
>>>>>>> void
>>>>>>>>> *data,
>>>>>>>>>                              args->map_size);
>>>>>>>>>              break;
>>>>>>>>>          case AMDGPU_VA_OP_REPLACE:
>>>>>>>>> -        r = amdgpu_vm_alloc_pts(adev, bo_va->base.vm, args-
>>>>>>>>>> va_address,
>>>>>>>>> -                    args->map_size);
>>>>>>>>> -        if (r)
>>>>>>>>> -            goto error_backoff;
>>>>>>>>> -
>>>>>>>>>              va_flags = amdgpu_gmc_get_pte_flags(adev,
>>>>>>>>> args->flags);
>>>>>>>>>              r = amdgpu_vm_bo_replace_map(adev, bo_va, args-
>>>>>>>>>> va_address,
>>>>>>>>>                               args->offset_in_bo, args-
>>>>>>>>>> map_size, diff --git
>> a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>>>>>>>>> index 362436f4e856..dfad543fc000 100644
>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>>>>>>>>> @@ -504,47 +504,6 @@ static void amdgpu_vm_pt_next(struct
>>>>>>>>> amdgpu_device *adev,
>>>>>>>>>          }
>>>>>>>>>      }
>>>>>>>>>
>>>>>>>>> -/**
>>>>>>>>> - * amdgpu_vm_pt_first_leaf - get first leaf PD/PT
>>>>>>>>> - *
>>>>>>>>> - * @adev: amdgpu_device pointer
>>>>>>>>> - * @vm: amdgpu_vm structure
>>>>>>>>> - * @start: start addr of the walk
>>>>>>>>> - * @cursor: state to initialize
>>>>>>>>> - *
>>>>>>>>> - * Start a walk and go directly to the leaf node.
>>>>>>>>> - */
>>>>>>>>> -static void amdgpu_vm_pt_first_leaf(struct amdgpu_device
>> *adev,
>>>>>>>>> -                    struct amdgpu_vm *vm, uint64_t start,
>>>>>>>>> -                    struct amdgpu_vm_pt_cursor *cursor) -{
>>>>>>>>> -    amdgpu_vm_pt_start(adev, vm, start, cursor);
>>>>>>>>> -    while (amdgpu_vm_pt_descendant(adev, cursor)); -}
>>>>>>>>> -
>>>>>>>>> -/**
>>>>>>>>> - * amdgpu_vm_pt_next_leaf - get next leaf PD/PT
>>>>>>>>> - *
>>>>>>>>> - * @adev: amdgpu_device pointer
>>>>>>>>> - * @cursor: current state
>>>>>>>>> - *
>>>>>>>>> - * Walk the PD/PT tree to the next leaf node.
>>>>>>>>> - */
>>>>>>>>> -static void amdgpu_vm_pt_next_leaf(struct amdgpu_device
>> *adev,
>>>>>>>>> -                   struct amdgpu_vm_pt_cursor *cursor) -{
>>>>>>>>> -    amdgpu_vm_pt_next(adev, cursor);
>>>>>>>>> -    if (cursor->pfn != ~0ll)
>>>>>>>>> -        while (amdgpu_vm_pt_descendant(adev, cursor)); -}
>>>>>>>>> -
>>>>>>>>> -/**
>>>>>>>>> - * for_each_amdgpu_vm_pt_leaf - walk over all leaf PDs/PTs in
>>>>>>>>> the hierarchy
>>>>>>>>> - */
>>>>>>>>> -#define for_each_amdgpu_vm_pt_leaf(adev, vm, start, end,
>>>>>>>>> cursor)
>>>>>>>>>       \
>>>>>>>>> -    for (amdgpu_vm_pt_first_leaf((adev), (vm), (start),
>>>>>>>>> &(cursor));
>>>>>>>>>           \
>>>>>>>>> -         (cursor).pfn <= end; amdgpu_vm_pt_next_leaf((adev),
>>>>>>>>> &(cursor)))
>>>>>>>>> -
>>>>>>>>>      /**
>>>>>>>>>       * amdgpu_vm_pt_first_dfs - start a deep first search
>>>>>>>>>       *
>>>>>>>>> @@ -915,74 +874,51 @@ static void amdgpu_vm_bo_param(struct
>>>>>>>>> amdgpu_device *adev, struct amdgpu_vm *vm,
>>>>>>>>>       * Returns:
>>>>>>>>>       * 0 on success, errno otherwise.
>>>>>>>>>       */
>>>>>>>>> -int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
>>>>>>>>> -            struct amdgpu_vm *vm,
>>>>>>>>> -            uint64_t saddr, uint64_t size)
>>>>>>>>> +static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
>>>>>>>>> +                   struct amdgpu_vm *vm,
>>>>>>>>> +                   struct amdgpu_vm_pt_cursor *cursor)
>>>>>>>>>      {
>>>>>>>>> -    struct amdgpu_vm_pt_cursor cursor;
>>>>>>>>> +    struct amdgpu_vm_pt *entry = cursor->entry;
>>>>>>>>> +    struct amdgpu_bo_param bp;
>>>>>>>>>          struct amdgpu_bo *pt;
>>>>>>>>> -    uint64_t eaddr;
>>>>>>>>>          int r;
>>>>>>>>>
>>>>>>>>> -    /* validate the parameters */
>>>>>>>>> -    if (saddr & AMDGPU_GPU_PAGE_MASK || size &
>>>>>>>>> AMDGPU_GPU_PAGE_MASK)
>>>>>>>>> -        return -EINVAL;
>>>>>>>>> +    if (cursor->level < AMDGPU_VM_PTB && !entry->entries) {
>>>>>>>>> +        unsigned num_entries;
>>>>>>>>>
>>>>>>>>> -    eaddr = saddr + size - 1;
>>>>>>>>> -
>>>>>>>>> -    saddr /= AMDGPU_GPU_PAGE_SIZE;
>>>>>>>>> -    eaddr /= AMDGPU_GPU_PAGE_SIZE;
>>>>>>>>> -
>>>>>>>>> -    if (eaddr >= adev->vm_manager.max_pfn) {
>>>>>>>>> -        dev_err(adev->dev, "va above limit (0x%08llX >=
>>>>>>>>> 0x%08llX)\n",
>>>>>>>>> -            eaddr, adev->vm_manager.max_pfn);
>>>>>>>>> -        return -EINVAL;
>>>>>>>>> +        num_entries = amdgpu_vm_num_entries(adev, cursor-
>>>>>>>>>> level);
>>>>>>>>> +        entry->entries = kvmalloc_array(num_entries,
>>>>>>>>> +                        sizeof(*entry->entries),
>>>>>>>>> +                        GFP_KERNEL | __GFP_ZERO);
>>>>>>>>> +        if (!entry->entries)
>>>>>>>>> +            return -ENOMEM;
>>>>>>>>>          }
>>>>>>>>>
>>>>>>>>> -    for_each_amdgpu_vm_pt_leaf(adev, vm, saddr, eaddr, cursor)
>>>>>>>>> {
>>>>>>>>> -        struct amdgpu_vm_pt *entry = cursor.entry;
>>>>>>>>> -        struct amdgpu_bo_param bp;
>>>>>>>>> -
>>>>>>>>> -        if (cursor.level < AMDGPU_VM_PTB) {
>>>>>>>>> -            unsigned num_entries;
>>>>>>>>> -
>>>>>>>>> -            num_entries = amdgpu_vm_num_entries(adev,
>>>>>>>>> cursor.level);
>>>>>>>>> -            entry->entries = kvmalloc_array(num_entries,
>>>>>>>>> -                            sizeof(*entry-
>>>>>>>>>> entries),
>>>>>>>>> -                            GFP_KERNEL |
>>>>>>>>> -                            __GFP_ZERO);
>>>>>>>>> -            if (!entry->entries)
>>>>>>>>> -                return -ENOMEM;
>>>>>>>>> -        }
>>>>>>>>> -
>>>>>>>>> -
>>>>>>>>> -        if (entry->base.bo)
>>>>>>>>> -            continue;
>>>>>>>>> -
>>>>>>>>> -        amdgpu_vm_bo_param(adev, vm, cursor.level, &bp);
>>>>>>>>> -
>>>>>>>>> -        r = amdgpu_bo_create(adev, &bp, &pt);
>>>>>>>>> -        if (r)
>>>>>>>>> -            return r;
>>>>>>>>> -
>>>>>>>>> -        if (vm->use_cpu_for_update) {
>>>>>>>>> -            r = amdgpu_bo_kmap(pt, NULL);
>>>>>>>>> -            if (r)
>>>>>>>>> -                goto error_free_pt;
>>>>>>>>> -        }
>>>>>>>>> +    if (entry->base.bo)
>>>>>>>>> +        return 0;
>>>>>>>>>
>>>>>>>>> -        /* Keep a reference to the root directory to avoid
>>>>>>>>> -        * freeing them up in the wrong order.
>>>>>>>>> -        */
>>>>>>>>> -        pt->parent = amdgpu_bo_ref(cursor.parent->base.bo);
>>>>>>>>> +    amdgpu_vm_bo_param(adev, vm, cursor->level, &bp);
>>>>>>>>>
>>>>>>>>> -        amdgpu_vm_bo_base_init(&entry->base, vm, pt);
>>>>>>>>> +    r = amdgpu_bo_create(adev, &bp, &pt);
>>>>>>>>> +    if (r)
>>>>>>>>> +        return r;
>>>>>>>>>
>>>>>>>>> -        r = amdgpu_vm_clear_bo(adev, vm, pt);
>>>>>>>>> +    if (vm->use_cpu_for_update) {
>>>>>>>>> +        r = amdgpu_bo_kmap(pt, NULL);
>>>>>>>>>              if (r)
>>>>>>>>>                  goto error_free_pt;
>>>>>>>>>          }
>>>>>>>>>
>>>>>>>>> +    /* Keep a reference to the root directory to avoid
>>>>>>>>> +     * freeing them up in the wrong order.
>>>>>>>>> +     */
>>>>>>>>> +    pt->parent = amdgpu_bo_ref(cursor->parent->base.bo);
>>>>>>>>> +    amdgpu_vm_bo_base_init(&entry->base, vm, pt);
>>>>>>>>> +
>>>>>>>>> +    r = amdgpu_vm_clear_bo(adev, vm, pt);
>>>>>>>>> +    if (r)
>>>>>>>>> +        goto error_free_pt;
>>>>>>>>> +
>>>>>>>>>          return 0;
>>>>>>>>>
>>>>>>>>>      error_free_pt:
>>>>>>>>> @@ -1627,6 +1563,7 @@ static int
>> amdgpu_vm_update_ptes(struct
>>>>>>>>> amdgpu_pte_update_params *params,
>>>>>>>>>          struct amdgpu_vm_pt_cursor cursor;
>>>>>>>>>          uint64_t frag_start = start, frag_end;
>>>>>>>>>          unsigned int frag;
>>>>>>>>> +    int r;
>>>>>>>>>
>>>>>>>>>          /* figure out the initial fragment */
>>>>>>>>>          amdgpu_vm_fragment(params, frag_start, end, flags,
>>>>>>>>> &frag, &frag_end); @@ -1634,12 +1571,15 @@ static int
>>>>>>>>> amdgpu_vm_update_ptes(struct amdgpu_pte_update_params
>>>> *params,
>>>>>>>>>          /* walk over the address space and update the PTs */
>>>>>>>>>          amdgpu_vm_pt_start(adev, params->vm, start, &cursor);
>>>>>>>>>          while (cursor.pfn < end) {
>>>>>>>>> -        struct amdgpu_bo *pt = cursor.entry->base.bo;
>>>>>>>>>              unsigned shift, parent_shift, mask;
>>>>>>>>>              uint64_t incr, entry_end, pe_start;
>>>>>>>>> +        struct amdgpu_bo *pt;
>>>>>>>>>
>>>>>>>>> -        if (!pt)
>>>>>>>>> -            return -ENOENT;
>>>>>>>>> +        r = amdgpu_vm_alloc_pts(params->adev, params->vm,
>>>>>>>>> &cursor);
>>>>>>>>> +        if (r)
>>>>>>>>> +            return r;
>>>>>>>>> +
>>>>>>>>> +        pt = cursor.entry->base.bo;
>>>>>>>>>
>>>>>>>>>              /* The root level can't be a huge page */
>>>>>>>>>              if (cursor.level == adev->vm_manager.root_level) {
>>>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>>>>>>>>> index 81ff8177f092..116605c038d2 100644
>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>>>>>>>>> @@ -303,9 +303,6 @@ bool amdgpu_vm_ready(struct amdgpu_vm
>>>> *vm);
>>>>>>> int
>>>>>>>>> amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct
>>>>>>>>> amdgpu_vm *vm,
>>>>>>>>>                        int (*callback)(void *p, struct amdgpu_bo
>>>>>>>>> *bo),
>>>>>>>>>                        void *param); -int
>>>>>>>>> amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
>>>>>>>>> -            struct amdgpu_vm *vm,
>>>>>>>>> -            uint64_t saddr, uint64_t size);
>>>>>>>>>      int amdgpu_vm_flush(struct amdgpu_ring *ring, struct
>>>>>>>>> amdgpu_job *job, bool need_pipe_sync);  int
>>>>>>>>> amdgpu_vm_update_directories(struct
>>>>>>>>> amdgpu_device *adev,
>>>>>>>>>                       struct amdgpu_vm *vm);
>>>>>>>>> --
>>>>>>>>> 2.17.1
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> amd-gfx mailing list
>>>>>>>>> amd-gfx at lists.freedesktop.org
>>>>>>>>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>>>>>>> _______________________________________________
>>>>>>> amd-gfx mailing list
>>>>>>> amd-gfx at lists.freedesktop.org
>>>>>>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>>>>>> _______________________________________________
>>>>>> amd-gfx mailing list
>>>>>> amd-gfx at lists.freedesktop.org
>>>>>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
> _______________________________________________
> 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