Patch "drm/vc4: Fix termination of the initial scan for branch targets." has been added to the 4.9-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
drm/vc4: Fix termination of the initial scan for branch targets.
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-vc4-fix-termination-of-the-initial-scan-for-branch-targets.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
457e67a728696c4f8e6423c64e93def50530db9aMon Sep 17 00:00:00 2001
From: Eric Anholt <[email protected]>
Date: Thu, 20 Oct 2016 16:48:12 -0700
Subject: drm/vc4: Fix termination of the initial scan for branch targets.
From: Eric Anholt <[email protected]>
commit 457e67a728696c4f8e6423c64e93def50530db9a upstream.
The loop is scanning until the original max_ip (size of the BO), but we want to not examine any code after the PROG_END's delay slots. There was a block trying to do that, except that we had some early continue statements if the signal wasn't a PROG_END or a BRANCH.
The failure mode would be that a valid shader is rejected because some undefined memory after the PROG_END slots is parsed as a branch and the rest of its setup is illegal. I haven't seen this in the wild, but valgrind was complaining when about this up in the userland simulator mode.
--- drivers/gpu/drm/vc4/vc4_validate_shaders.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
drivers/gpu/drm/vc4/vc4_validate_shaders.c +8 -11
@@ -608,9 +608,7 @@ static bool vc4_validate_branches(struct vc4_shader_validation_state *validation_state) {uint32_t max_branch_target =0 ; -bool found_shader_end = false;int ip; -int shader_end_ip =0 ;int last_branch =-2 ;for (ip =0 ; ip < validation_state->max_ip; ip++) {
@@ -621,8 +619,13 @@ vc4_validate_branches(struct vc4_shader_uint32_t branch_target_ip;if (sig ==QPU_SIG_PROG_END ) { - shader_end_ip = ip; - found_shader_end = true; +/* There are two delay slots after program end is +* signaled that are still executed, then we're +* finished. validation_state->max_ip is the +* instruction after the last valid instruction in the +* program. +*/ + validation_state->max_ip = ip +3 ;continue ; }
@@ -676,15 +679,9 @@ vc4_validate_branches(struct vc4_shader_ }set_bit (after_delay_ip, validation_state->branch_targets); max_branch_target =max (max_branch_target, after_delay_ip); - -/* There are two delay slots after program end is signaled -* that are still executed, then we're finished. -*/ -if (found_shader_end && ip == shader_end_ip +2 ) -break ; } -if (max_branch_target > shader_end_ip) { +if (max_branch_target > validation_state->max_ip -3 ) {DRM_ERROR ("Branch landed after QPU_SIG_PROG_END" );return false; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/drm-vc4-fix-termination-of-the-initial-scan-for-branch-targets.patch queue-4.9/drm-vc4-use-runtime-autosuspend-to-avoid-thrashing-v3d-power-state.patch