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

Yang, Philip Philip.Yang at amd.com
Tue Mar 12 21:13:43 UTC 2019


vm fault happens about 1/10 for KFDCWSRTest.BasicTest for me. I am using 
SDMA for page table update. I don't try CPU page table update.

Philip

On 2019-03-12 11:12 a.m., Russell, Kent wrote:
> Peculiar, I hit it immediately when I ran it . Can you try use --gtest_filter=KFDCWSRTest.BasicTest  . That one hung every time for me.
> 
>   Kent
> 
>> -----Original Message-----
>> From: Christian König <ckoenig.leichtzumerken at gmail.com>
>> Sent: Tuesday, March 12, 2019 11:09 AM
>> To: Russell, Kent <Kent.Russell at amd.com>; Koenig, Christian
>> <Christian.Koenig 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, 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
> 
> _______________________________________________
> 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