[Mesa-dev] [PATCH] anv: don't crash when creating a huge image
Chad Versace
chadversary at chromium.org
Fri Nov 10 00:23:33 UTC 2017
On Wed 08 Nov 2017, Jason Ekstrand wrote:
> On Wed, Nov 8, 2017 at 1:34 AM, Samuel Iglesias Gonsálvez <[1]
> siglesias at igalia.com> wrote:
>
> The HW has some limits but, according to the spec, we can create
> the image as it has not yet any memory backing it. When we allocate
> that memory, then we fail following what Vulkan spec, "10.2. Device
> Memory" says when talking about vkAllocateMemory():
>
> "Some platforms may have a limit on the maximum size of a single
> allocation. For example, certain systems may fail to create
> allocations with a size greater than or equal to 4GB. Such a limit is
> implementation-dependent, and if such a failure occurs then the error
> VK_ERROR_OUT_OF_DEVICE_MEMORY must be returned."
>
> Fixes the crashes on BDW for the following tests:
>
> dEQP-VK.pipeline.render_to_image.core.2d_array.huge.*
> dEQP-VK.pipeline.render_to_image.core.cube_array.huge.*
>
> Signed-off-by: Samuel Iglesias Gonsálvez <[2]siglesias at igalia.com>
> ---
>
> Jason, I was tempted to move this piece of code to anv_AllocateMemory()
> but then I found the kernel relocation limitation of 32-bit... Is that
> limitation still applicable? Or was it from the BDW age and we forgot
> to update that limitation for gen9+?
>
>
> We're still using relocations on all hardware so it applies to everything
> today. One of my 2018 projects is to fix that and get rid of relocations on
> gen8+.
>
>
> Sam
>
> src/intel/isl/isl.c | 22 ----------------------
> 1 file changed, 22 deletions(-)
>
> diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c
> index 59f512fc050..aaadcbaf991 100644
> --- a/src/intel/isl/isl.c
> +++ b/src/intel/isl/isl.c
> @@ -1472,28 +1472,6 @@ isl_surf_init_s(const struct isl_device *dev,
> base_alignment = MAX(info->min_alignment, tile_size);
> }
>
> - if (ISL_DEV_GEN(dev) < 9) {
> - /* From the Broadwell PRM Vol 5, Surface Layout:
> - *
> - * "In addition to restrictions on maximum height, width, and
> depth,
> - * surfaces are also restricted to a maximum size in bytes. This
> - * maximum is 2 GB for all products and all surface types."
> - *
> - * This comment is applicable to all Pre-gen9 platforms.
> - */
> - if (size > (uint64_t) 1 << 31)
> - return false;
> - } else {
> - /* From the Skylake PRM Vol 5, Maximum Surface Size in Bytes:
> - * "In addition to restrictions on maximum height, width, and
> depth,
> - * surfaces are also restricted to a maximum size of 2^38 bytes.
> - * All pixels within the surface must be contained within 2^38
> bytes
> - * of the base address."
> - */
> - if (size > (uint64_t) 1 << 38)
> - return false;
> - }
I think it very unwise to delete code that enforces requirements defined
by the hardware spec. Deleting the code doesn't make the hardware
requirements go away :)
> I'm not sure how I feel about removing this from ISL. There are really two
> limitations going on here. One is a limitation imposed by relocations, and the
> other is some sort of fundamental hardware surface size limitation. Most
> likely, the surface size limitation has to do with how many bits they use for
> image address computations in the hardware. Most likely, on gen8, they do all
> of the internal calculations in 32 bits and only convert to 48 at the end when
> they need to add it to Surface Base Address.
>
> If my understanding is correct then we will still have this limitation on gen8
> even after we get rid of relocations and remove the BO size limitation. I see
> a couple of options, neither of which I like very much:
>
> 1) Take something like this patch and then keep the BO size limitation on BDW
> to 2GiB when we get rid of relocations even though it's artificial.
> 2) "Gracefully" handle isl_surf_init failure by doing a debug_log and
> succeeding but setting the image size (that will be returned by
> vkGetImageMemoryRequirements) to UINT64_MAX so that the client won't ever be
> able to find memory for it.
>
> My feeling is that 1) above is probably the better of the two as 2) seems to be
> a twisting of the spec. That said, I would like to keep the restriction in ISL
> somehow and we need to make sure it still gets applied in GL.
I dislike both. I originally designed isl to mimic the VkImage API, so
let's continue that trend.
Option 3) Change isl_surf_init() to return a meaningful result code:
ISL_SUCCESS = 0
ISL_ERROR_SOMETHING_SOMETHING_THE_USUAL_FAILURES = -1
ISL_ERROR_SURFACE_SIZE_TOO_LARGE = -2
I like option 3 because it avoids secret implicit contracts between isl
and anvil, and thus avoids hidden hacks.
More information about the mesa-dev
mailing list