[PATCH 2/2] drm/amdgpu: restructure amdgpu_fill_buffer
Christian König
ckoenig.leichtzumerken at gmail.com
Mon Jan 31 13:39:03 UTC 2022
Am 28.01.22 um 16:55 schrieb Felix Kuehling:
>
> Am 2022-01-28 um 10:16 schrieb Christian König:
>> [SNIP]
>> - if (bo->tbo.resource->mem_type == AMDGPU_PL_PREEMPT) {
>
> As far as I can see, you didn't add this check back elsewhere. The
> promise for preemptible BOs is, that we never have to wait for the GPU
> to finish accessing the BOs because the context using it is
> preemptible. This was a necessary condition to disable GTT usage
> accounting for such BOs. If you allow filling such BOs with this
> function, you're breaking that promise.
That's now part of amdgpu_ttm_map_buffer(), but unfortunately as
BUG_ON(). I've added a patch to change that into a warning.
[SNIP]
>> + cur_size = min_t(u64, dst.size, AMDGPU_GTT_MAX_TRANSFER_BYTES);
>
> For VRAM, the cur_size could be much bigger because we're not limited
> by the GART transfer window. I'm pretty sure that 2MB is going to add
> too much overhead. For the extreme 60GB BO example, it would require
> 30-thousand IBs and IB frames to fill the entire buffer. That's a lot
> of VMID-switching, IB execution, fence signalling, interrupts, etc.
I've restructured the mapping function so that we can now copy/fill in
256MiB chunks when no GART window is involved.
>
>
>> +
>> + r = amdgpu_ttm_map_buffer(&bo->tbo, bo->tbo.resource, &dst,
>> + PFN_UP(cur_size), 1, ring, false,
>> + &to);
>> + if (r)
>> + goto error;
>> +
>> + r = amdgpu_ttm_fill_mem(ring, src_data, to, cur_size, resv,
>> + &next, false);
>
> If amdgpu_ttm_map_buffer updated the page tables, shouldn't the
> vm_needs_flush parameter be true? This flag should probably be
> returned by amdgpu_ttm_map_buffer.
Ah, yes. That's indeed a typo. For now I've didn't added the
vm_needs_flush parameter, but that's something we could optimize.
Regards,
Christian.
>
> Regards,
> Felix
>
>
>> + if (r)
>> + goto error;
>> +
>> + dma_fence_put(fence);
>> + fence = next;
>> +
>> + amdgpu_res_next(&dst, cur_size);
>> + }
>> +error:
>> + mutex_unlock(&adev->mman.gtt_window_lock);
>> + if (f)
>> + *f = dma_fence_get(fence);
>> + dma_fence_put(fence);
>> + return r;
>> +}
>> +
>> /**
>> * amdgpu_ttm_evict_resources - evict memory buffers
>> * @adev: amdgpu device object
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
>> index d9691f262f16..bcd34592e45d 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
>> @@ -35,6 +35,8 @@
>> #define AMDGPU_GTT_MAX_TRANSFER_SIZE 512
>> #define AMDGPU_GTT_NUM_TRANSFER_WINDOWS 2
>> +#define AMDGPU_GTT_MAX_TRANSFER_BYTES (AMDGPU_GTT_MAX_TRANSFER_SIZE * \
>> + AMDGPU_GPU_PAGE_SIZE)
>> #define AMDGPU_POISON 0xd0bed0be
More information about the amd-gfx
mailing list