summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/svga/drm
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2019-10-03 12:44:42 +0200
committerThomas Hellstrom <thellstrom@vmware.com>2019-10-24 15:08:43 +0200
commit91146c07967b1d531a38f724ad91e7a0fc0769ef (patch)
tree387eeaa4bcdf580dba0540700c1eb1e12832b6b6 /src/gallium/winsys/svga/drm
parent00db976905b7fcd615ccee0c13dcbf9dfe29f5ec (diff)
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 <thellstrom@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Charmaine Lee <charmainel@vmware.com> Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Diffstat (limited to 'src/gallium/winsys/svga/drm')
-rw-r--r--src/gallium/winsys/svga/drm/vmw_screen_svga.c5
1 files changed, 4 insertions, 1 deletions
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);