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

Kuehling, Felix Felix.Kuehling at amd.com
Tue Mar 12 21:19:12 UTC 2019


I'm also still seeing VM faults in the eviction test even with my fix, 
and even with SDMA page table updates. There is still something else 
going wrong. :/

Thanks,
   Felix

On 2019-03-12 5:13 p.m., Yang, Philip wrote:
> 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