[Mesa-dev] [PATCH 1/3] i965: Fix cache pollution race during L3 partitioning set-up.
Martin Peres
martin.peres at free.fr
Fri Jan 15 02:51:06 PST 2016
On 15/01/16 04:37, Francisco Jerez wrote:
> We need to split the stalling flush from the RO cache invalidation
> into a different PIPE_CONTROL command to make sure that the top of the
> pipe invalidation happens after any previous rendering is complete.
> Otherwise it's possible for previous rendering to pollute the L3 cache
> in the short window of time between RO invalidation and the completion
> of the stalling flush. Fixes rendering artifacts on Unigine Heaven,
> Metro Last Light Redux and Metro 2033 Redux.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93540
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93599
> Tested-by: Darius Spitznagel <d.spitznagel at goodbytez.de>
Tested-by: Martin Peres <martin.peres at linux.intel.com>
Thanks for the fix!
> ---
> src/mesa/drivers/dri/i965/gen7_l3_state.c | 31 +++++++++++++++++++++++--------
> 1 file changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/gen7_l3_state.c b/src/mesa/drivers/dri/i965/gen7_l3_state.c
> index b63e61c..85f18d0 100644
> --- a/src/mesa/drivers/dri/i965/gen7_l3_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_l3_state.c
> @@ -330,20 +330,35 @@ setup_l3_config(struct brw_context *brw, const struct brw_l3_config *cfg)
>
> /* According to the hardware docs, the L3 partitioning can only be changed
> * while the pipeline is completely drained and the caches are flushed,
> - * which involves a first PIPE_CONTROL flush which stalls the pipeline and
> - * initiates invalidation of the relevant caches...
> + * which involves a first PIPE_CONTROL flush which stalls the pipeline...
> */
> brw_emit_pipe_control_flush(brw,
> - PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE |
> - PIPE_CONTROL_CONST_CACHE_INVALIDATE |
> - PIPE_CONTROL_INSTRUCTION_INVALIDATE |
> PIPE_CONTROL_DATA_CACHE_INVALIDATE |
> PIPE_CONTROL_NO_WRITE |
> PIPE_CONTROL_CS_STALL);
>
> - /* ...followed by a second stalling flush which guarantees that
> - * invalidation is complete when the L3 configuration registers are
> - * modified.
> + /* ...followed by a second pipelined PIPE_CONTROL that initiates
> + * invalidation of the relevant caches. Note that because RO invalidation
> + * happens at the top of the pipeline (i.e. right away as the PIPE_CONTROL
> + * command is processed by the CS) we cannot combine it with the previous
> + * stalling flush as the hardware documentation suggests, because that
> + * would cause the CS to stall on previous rendering *after* RO
> + * invalidation and wouldn't prevent the RO caches from being polluted by
> + * concurrent rendering before the stall completes. This intentionally
> + * doesn't implement the SKL+ hardware workaround suggesting to enable CS
> + * stall on PIPE_CONTROLs with the texture cache invalidation bit set for
> + * GPGPU workloads because the previous and subsequent PIPE_CONTROLs
> + * already guarantee that there is no concurrent GPGPU kernel execution
> + * (see SKL HSD 2132585).
> + */
> + brw_emit_pipe_control_flush(brw,
> + PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE |
> + PIPE_CONTROL_CONST_CACHE_INVALIDATE |
> + PIPE_CONTROL_INSTRUCTION_INVALIDATE |
> + PIPE_CONTROL_NO_WRITE);
> +
> + /* Now send a third stalling flush to make sure that invalidation is
> + * complete when the L3 configuration registers are modified.
> */
> brw_emit_pipe_control_flush(brw,
> PIPE_CONTROL_DATA_CACHE_INVALIDATE |
More information about the mesa-dev
mailing list