winsys/amdgpu: reduce max_alloc_size based on GTT limits
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Sun, 19 Feb 2017 09:42:57 +0000 (10:42 +0100)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Tue, 21 Feb 2017 09:43:38 +0000 (10:43 +0100)
Allocating huge buffers in VRAM is not a problem, but when those buffers
start being migrated, the kernel runs into errors because it cannot split
those buffer up for moving through GTT.

This should fix intermittent failures of
GL45-CTS.texture_buffer.texture_buffer_max_size

Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c

index 6511c4855d8240840b8fa240d32b068b99d4be7d..da9371deea08d75fcd6961882509f7289ee49423 100644 (file)
@@ -331,8 +331,10 @@ static bool do_winsys_init(struct amdgpu_winsys *ws, int fd)
    ws->info.gart_size = gtt.heap_size;
    ws->info.vram_size = vram.heap_size;
    ws->info.vram_vis_size = vram_vis.heap_size;
-   /* The kernel can split large buffers, so we can do large allocations. */
-   ws->info.max_alloc_size = MAX2(ws->info.vram_size, ws->info.gart_size) * 0.9;
+   /* The kernel can split large buffers in VRAM but not in GTT, so large
+    * allocations can fail or cause buffer movement failures in the kernel.
+    */
+   ws->info.max_alloc_size = MIN2(ws->info.vram_size * 0.9, ws->info.gart_size * 0.7);
    /* convert the shader clock from KHz to MHz */
    ws->info.max_shader_clock = ws->amdinfo.max_engine_clk / 1000;
    ws->info.max_se = ws->amdinfo.num_shader_engines;