Re: [Mesa-dev] [PATCH] radv/winsys: Fail early on overgrown cs.

2016-10-16 Thread Bas Nieuwenhuizen
Pushed, thanks.

- Bas

On Thu, Oct 13, 2016 at 10:54 PM, Gustaw Smolarczyk
 wrote:
> When !use_ib_bos, we can't easily chain ibs one to another. If the
> required cs size grows over 1Mi - 8 dwords just fail the cs so that we
> won't assert-fail in radv_amdgpu_winsys_cs_submit later on.
> ---
> Please, push the patch after it has been reviewed.
>
>  src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 18 ++
>  1 file changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c 
> b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
> index 41dfcd3..b8558fa 100644
> --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
> +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
> @@ -187,12 +187,22 @@ static void radv_amdgpu_cs_grow(struct radeon_winsys_cs 
> *_cs, size_t min_size)
> }
>
> if (!cs->ws->use_ib_bos) {
> -   uint64_t ib_size = MAX2((cs->base.cdw + min_size) * 4 + 16,
> -   cs->base.max_dw * 4 * 2);
> -   uint32_t *new_buf = realloc(cs->base.buf, ib_size);
> +   const uint64_t limit_dws = 0x8;
> +   uint64_t ib_dws = MAX2(cs->base.cdw + min_size,
> +  MIN2(cs->base.max_dw * 2, limit_dws));
> +
> +   /* The total ib size cannot exceed limit_dws dwords. */
> +   if (ib_dws > limit_dws)
> +   {
> +   cs->failed = true;
> +   cs->base.cdw = 0;
> +   return;
> +   }
> +
> +   uint32_t *new_buf = realloc(cs->base.buf, ib_dws * 4);
> if (new_buf) {
> cs->base.buf = new_buf;
> -   cs->base.max_dw = ib_size / 4;
> +   cs->base.max_dw = ib_dws;
> } else {
> cs->failed = true;
> cs->base.cdw = 0;
> --
> 2.10.0
>
> ___
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] radv/winsys: Fail early on overgrown cs.

2016-10-13 Thread Gustaw Smolarczyk
When !use_ib_bos, we can't easily chain ibs one to another. If the
required cs size grows over 1Mi - 8 dwords just fail the cs so that we
won't assert-fail in radv_amdgpu_winsys_cs_submit later on.
---
Please, push the patch after it has been reviewed.

 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 18 ++
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c 
b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
index 41dfcd3..b8558fa 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
@@ -187,12 +187,22 @@ static void radv_amdgpu_cs_grow(struct radeon_winsys_cs 
*_cs, size_t min_size)
}
 
if (!cs->ws->use_ib_bos) {
-   uint64_t ib_size = MAX2((cs->base.cdw + min_size) * 4 + 16,
-   cs->base.max_dw * 4 * 2);
-   uint32_t *new_buf = realloc(cs->base.buf, ib_size);
+   const uint64_t limit_dws = 0x8;
+   uint64_t ib_dws = MAX2(cs->base.cdw + min_size,
+  MIN2(cs->base.max_dw * 2, limit_dws));
+
+   /* The total ib size cannot exceed limit_dws dwords. */
+   if (ib_dws > limit_dws)
+   {
+   cs->failed = true;
+   cs->base.cdw = 0;
+   return;
+   }
+
+   uint32_t *new_buf = realloc(cs->base.buf, ib_dws * 4);
if (new_buf) {
cs->base.buf = new_buf;
-   cs->base.max_dw = ib_size / 4;
+   cs->base.max_dw = ib_dws;
} else {
cs->failed = true;
cs->base.cdw = 0;
-- 
2.10.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev