<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Mon, Nov 26, 2018 at 8:46 AM Bas Nieuwenhuizen <<a href="mailto:basni@chromium.org">basni@chromium.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">patches 4-7 are<br>
<br>
Reviewed-by: Bas Nieuwenhuizen <<a href="mailto:bas@basnieuwenhuizen.nl" target="_blank">bas@basnieuwenhuizen.nl</a>><br>
<br>
though I agree with Christian that it would be nice to get a case<br>
where 7 improves things before we submit it.<br>
<br>
For patches 1-3 I need to dive into the slab allocator before I have<br>
enough knowledge to review.<br></blockquote><div><br></div><div>It's actually pretty simple. Each slab buffer contains suballocations of the same size. E.g. one 2M slab can only have 16 128K suballocations. If you want a 64K buffer, you have to allocate a separate 2M slab with 32 64K suballocations. If you need to allocate just 512B, you need another 2MB slab. This wastes memory in 2 ways:</div><div>1) a 129K buffer will have to be allocated as a 256K buffer, because the allocation size has to be a power of two, wasting space<br></div><div>2) there will be too many 2MB slabs, one slab for each size (from 2^9 to 2^18), each having some unused space, wasting space<br></div><div>3) having too many 2K and smaller allocations actually decreases memory usage, because the minimum kernel allocation size is 4K</div><div><br></div><div>Problem 2 is mitigated by layering slab allocators on top of each other. The top slab allocator can only allocate sizes 2^17 to 2^18, so you only need two 2M slabs to cover all your needs. The middle allocator uses the top allocator and allocates slabs of size 2^17 and uses it to allocate 2^13 to 2^16 sizes. The bottom allocator allocates slabs of size 2^13 and uses it allocate 2^9 to 2^12 sizes.</div><div><br></div><div>Marek</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On Sat, Nov 24, 2018 at 12:41 AM Marek Olšák <<a href="mailto:maraeo@gmail.com" target="_blank">maraeo@gmail.com</a>> wrote:<br>
><br>
> From: Marek Olšák <<a href="mailto:marek.olsak@amd.com" target="_blank">marek.olsak@amd.com</a>><br>
><br>
> ---<br>
>  src/gallium/winsys/amdgpu/drm/amdgpu_bo.c | 9 +++++++--<br>
>  1 file changed, 7 insertions(+), 2 deletions(-)<br>
><br>
> diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c<br>
> index a9271c33ee9..36e2c4ec0dc 100644<br>
> --- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c<br>
> +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c<br>
> @@ -449,24 +449,29 @@ static struct amdgpu_winsys_bo *amdgpu_create_bo(struct amdgpu_winsys *ws,<br>
>     r = amdgpu_bo_alloc(ws->dev, &request, &buf_handle);<br>
>     if (r) {<br>
>        fprintf(stderr, "amdgpu: Failed to allocate a buffer:\n");<br>
>        fprintf(stderr, "amdgpu:    size      : %"PRIu64" bytes\n", size);<br>
>        fprintf(stderr, "amdgpu:    alignment : %u bytes\n", alignment);<br>
>        fprintf(stderr, "amdgpu:    domains   : %u\n", initial_domain);<br>
>        goto error_bo_alloc;<br>
>     }<br>
><br>
>     va_gap_size = ws->check_vm ? MAX2(4 * alignment, 64 * 1024) : 0;<br>
> +<br>
> +   unsigned vm_alignment = alignment;<br>
> +<br>
> +   /* Increase the VM alignment for faster address translation. */<br>
>     if (size > ws->info.pte_fragment_size)<br>
> -          alignment = MAX2(alignment, ws->info.pte_fragment_size);<br>
> +      vm_alignment = MAX2(vm_alignment, ws->info.pte_fragment_size);<br>
> +<br>
>     r = amdgpu_va_range_alloc(ws->dev, amdgpu_gpu_va_range_general,<br>
> -                             size + va_gap_size, alignment, 0, &va, &va_handle,<br>
> +                             size + va_gap_size, vm_alignment, 0, &va, &va_handle,<br>
>                               (flags & RADEON_FLAG_32BIT ? AMDGPU_VA_RANGE_32_BIT : 0) |<br>
>                              AMDGPU_VA_RANGE_HIGH);<br>
>     if (r)<br>
>        goto error_va_alloc;<br>
><br>
>     unsigned vm_flags = AMDGPU_VM_PAGE_READABLE |<br>
>                         AMDGPU_VM_PAGE_EXECUTABLE;<br>
><br>
>     if (!(flags & RADEON_FLAG_READ_ONLY))<br>
>         vm_flags |= AMDGPU_VM_PAGE_WRITEABLE;<br>
> --<br>
> 2.17.1<br>
><br>
> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div></div>