radeonsi: add missing initialization for userptr buffers
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 12 Apr 2017 15:05:56 +0000 (17:05 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 14 Apr 2017 21:23:04 +0000 (23:23 +0200)
Fix the accounting for memory usage of userptr buffers, which has been wrong
forever (or at least for a long time).

Also initialize flags. Without this initialization, the sparse buffer flag
might end up being set, which leads to staging buffers being used unnecessarily
(and incorrectly) in transfers to or from userptr buffers.

This works around VM faults that occur with the radeon kernel module when
running piglit ./bin/amd_pinned_memory decrement-offset map-buffer -auto

Fixes: e077c5fe6579 ("gallium/radeon: transfers and invalidation for sparse buffers")
Reported-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeon/r600_buffer_common.c

index 0e93404c018563fefa3f57b17371d9df27fc1fba..b2289e26f72b11080de0c2f90ee1630bd0fec1b8 100644 (file)
@@ -612,6 +612,7 @@ r600_buffer_from_user_memory(struct pipe_screen *screen,
        struct r600_resource *rbuffer = r600_alloc_buffer_struct(screen, templ);
 
        rbuffer->domains = RADEON_DOMAIN_GTT;
+       rbuffer->flags = 0;
        util_range_add(&rbuffer->valid_buffer_range, 0, templ->width0);
 
        /* Convert a user pointer to a buffer. */
@@ -627,5 +628,8 @@ r600_buffer_from_user_memory(struct pipe_screen *screen,
        else
                rbuffer->gpu_address = 0;
 
+       rbuffer->vram_usage = 0;
+       rbuffer->gart_usage = templ->width0;
+
        return &rbuffer->b.b;
 }