From 91146c07967b1d531a38f724ad91e7a0fc0769ef Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Thu, 3 Oct 2019 12:44:42 +0200 Subject: [PATCH] winsys/svga: Limit the maximum DMA hardware buffer size The kernel total GMR/DMA size is limited, but it's definitely possible for the kernel to allow a larger buffer allocation to succeed, but command submission using that buffer as a GMR would fail typically causing an application crash. So have the winsys limit the size of GMR/DMA buffers. The pipe driver will then resort to allocating smaller buffers and perform the DMA transfer in multiple bands, also allowing for the pre-flush mechanism to kick in. This avoids the related application crashes. Fixes: e7843273fae ("winsys/svga: Update to vmwgfx kernel module 2.1") Signed-off-by: Thomas Hellstrom Reviewed-by: Brian Paul Reviewed-by: Charmaine Lee Reviewed-by: Roland Scheidegger --- src/gallium/winsys/svga/drm/vmw_screen_svga.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gallium/winsys/svga/drm/vmw_screen_svga.c b/src/gallium/winsys/svga/drm/vmw_screen_svga.c index cd3f21f6033..fb0bee77822 100644 --- a/src/gallium/winsys/svga/drm/vmw_screen_svga.c +++ b/src/gallium/winsys/svga/drm/vmw_screen_svga.c @@ -80,8 +80,11 @@ vmw_svga_winsys_buffer_create(struct svga_winsys_screen *sws, provider = vws->pools.query_fenced; } else if (usage == SVGA_BUFFER_USAGE_SHADER) { provider = vws->pools.mob_shader_slab_fenced; - } else + } else { + if (size > VMW_GMR_POOL_SIZE) + return NULL; provider = vws->pools.gmr_fenced; + } assert(provider); buffer = provider->create_buffer(provider, size, &desc.pb_desc); -- 2.30.2