[Mesa-dev] [PATCH 12/16] anv: ensure that we don't ever try to adjust relocations more than once
Jason Ekstrand
jason at jlekstrand.net
Tue Mar 7 21:22:01 UTC 2017
On Mon, Mar 6, 2017 at 11:15 PM, Iago Toral Quiroga <itoral at igalia.com>
wrote:
> There is a CTS tests that creates that situation by forcing OOM during a
> queue
> submision and then trying again without the OOM enforcement. The driver
> returns
> the appropriate out of memory error on the first try, but the relocations
> had
> already been computed and stored, so in the second attempt, we duplicate
> the
> deltas and end up with offsets outside the BO limits.
>
This is something that has come up internally within Khronos. The correct
result (once the spec change lands) will be that basically all
vkQueueSubmit errors will actually result in VK_ERROR_DEVICE_LOST precisely
because of these sorts of issues. I've been meaning to send out a patch
that makes vkQueueSubmit turn all errors into DEVICE_LOST but haven't
gotten around to it yet.
> Fixes:
> dEQP-VK.api.out_of_host_memory.complex
> ---
> src/intel/vulkan/anv_batch_chain.c | 12 ++++++++++--
> src/intel/vulkan/anv_cmd_buffer.c | 2 ++
> src/intel/vulkan/anv_private.h | 6 ++++++
> 3 files changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_batch_chain.c
> b/src/intel/vulkan/anv_batch_chain.c
> index aae5f78..7df4ef2 100644
> --- a/src/intel/vulkan/anv_batch_chain.c
> +++ b/src/intel/vulkan/anv_batch_chain.c
> @@ -1242,8 +1242,16 @@ anv_cmd_buffer_execbuf(struct anv_device *device,
> struct anv_execbuf execbuf;
> anv_execbuf_init(&execbuf);
>
> - adjust_relocations_from_state_pool(ss_pool,
> &cmd_buffer->surface_relocs,
> - cmd_buffer->last_ss_pool_center);
> + /* Remember if we have adjusted the relocation offsets so we only ever
> do
> + * this once
> + */
> + struct anv_cmd_state *state = &cmd_buffer->state;
> + if (!state->adjusted_relocation_offsets) {
> + adjust_relocations_from_state_pool(ss_pool,
> &cmd_buffer->surface_relocs,
> + cmd_buffer->last_ss_pool_
> center);
> + state->adjusted_relocation_offsets = true;
> + }
> +
> VkResult result =
> anv_execbuf_add_bo(&execbuf, &ss_pool->bo,
> &cmd_buffer->surface_relocs,
> &cmd_buffer->pool->alloc);
> diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_
> buffer.c
> index dd5e6c8..adc7c19 100644
> --- a/src/intel/vulkan/anv_cmd_buffer.c
> +++ b/src/intel/vulkan/anv_cmd_buffer.c
> @@ -142,6 +142,7 @@ anv_cmd_state_reset(struct anv_cmd_buffer *cmd_buffer)
> state->need_query_wa = true;
> state->pma_fix_enabled = false;
> state->hiz_enabled = false;
> + state->adjusted_relocation_offsets = false;
>
> if (state->attachments != NULL) {
> vk_free(&cmd_buffer->pool->alloc, state->attachments);
> @@ -198,6 +199,7 @@ static VkResult anv_create_cmd_buffer(
> cmd_buffer->pool = pool;
> cmd_buffer->level = level;
> cmd_buffer->state.attachments = NULL;
> + cmd_buffer->state.adjusted_relocation_offsets = false;
>
> result = anv_cmd_buffer_init_batch_bo_chain(cmd_buffer);
> if (result != VK_SUCCESS)
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_
> private.h
> index 46b51a9..15d1401 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -1309,6 +1309,12 @@ struct anv_cmd_state {
> */
> struct anv_state null_surface_state;
>
> + /**
> + * A flag indicating whether we have adjusted relation offsets for this
> + * command buffer.
> + */
> + bool
> adjusted_relocation_offsets;
> +
> struct {
> struct anv_buffer * index_buffer;
> uint32_t index_type; /**<
> 3DSTATE_INDEX_BUFFER.IndexFormat */
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170307/11de48bd/attachment.html>
More information about the mesa-dev
mailing list