From d3ae85dd01952ecff7b780e30a43571146aa61ea Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 10 Oct 2012 17:27:38 +0100 Subject: [PATCH] sna: Use high/low watermarks for fenced aperture counting This helps with fitting larger operations into the small apertures of gen2, which due to the lax accounting could trigger ENOSPC. Signed-off-by: Chris Wilson --- src/sna/kgem.c | 57 +++++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 4b29dcba..8382a0b5 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -3688,27 +3688,36 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo) size = kgem->aperture_fenced; size += kgem_bo_fenced_size(kgem, bo); - if (size > kgem->aperture_mappable) + if (4*size > 3*kgem->aperture_mappable) return false; } return true; } - if (kgem->aperture > kgem->aperture_low) - return false; - if (kgem->nexec >= KGEM_EXEC_SIZE(kgem) - 1) return false; - if (kgem->gen < 40 && - bo->tiling != I915_TILING_NONE && - kgem->nfence >= kgem->fence_max) + if (kgem->aperture > kgem->aperture_low) return false; - size = kgem->aperture; - size += num_pages(bo); - return size <= kgem->aperture_high; + if (kgem->aperture + num_pages(bo) > kgem->aperture_high) + return false; + + if (kgem->gen < 40 && bo->tiling != I915_TILING_NONE) { + if (kgem->nfence >= kgem->fence_max) + return false; + + if (2*kgem->aperture_fenced > kgem->aperture_mappable) + return false; + + size = kgem->aperture_fenced; + size += kgem_bo_fenced_size(kgem, bo); + if (4*size > 3*kgem->aperture_mappable) + return false; + } + + return true; } bool kgem_check_many_bo_fenced(struct kgem *kgem, ...) @@ -3748,23 +3757,27 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...) } va_end(ap); - if (fenced_size + kgem->aperture_fenced > kgem->aperture_mappable) - return false; + if (num_fence) { + if (kgem->nfence + num_fence > kgem->fence_max) + return false; - if (kgem->nfence + num_fence > kgem->fence_max) - return false; + if (2*kgem->aperture_fenced > kgem->aperture_mappable) + return false; - if (!num_pages) - return true; + if (4*(fenced_size + kgem->aperture_fenced) > 3*kgem->aperture_mappable) + return false; + } - if (kgem->aperture > kgem->aperture_low) - return false; + if (num_pages) { + if (kgem->aperture > kgem->aperture_low) + return false; - if (num_pages + kgem->aperture > kgem->aperture_high) - return false; + if (num_pages + kgem->aperture > kgem->aperture_high) + return false; - if (kgem->nexec + num_exec >= KGEM_EXEC_SIZE(kgem)) - return false; + if (kgem->nexec + num_exec >= KGEM_EXEC_SIZE(kgem)) + return false; + } return true; }