aubinator.c: In function ‘parse_commands’:
aubinator.c:768:19: warning: suggest parentheses around comparison in operand 
of ‘&’ [-Wparentheses]
          if (p[0] & (1 << 22) == 0)

-----Original Message-----
From: mesa-dev [mailto:mesa-dev-boun...@lists.freedesktop.org] On Behalf Of 
Jason Ekstrand
Sent: Thursday, September 08, 2016 9:12 PM
To: mesa-dev@lists.freedesktop.org
Cc: Ekstrand, Jason <jason.ekstr...@intel.com>
Subject: [Mesa-dev] [PATCH] intel/aubinator: Properly handle batch buffer 
chaining

The original aubinator that Kristian wrote had a bug in the handling of 
MI_BATCH_BUFFER_START that propagated into the version in upstream mesa.
Say you have two batch buffers A and B where A calls MI_BATCH_BUFFER_START to 
jump to B.  Now suppose that A and B are placed consecutively in the address 
space with A before B.  What can happen is that aubinator will process A, and 
start processing B when it should.  When it gets done with B, it returns and 
continues to process A.  Because A doesn't have any more data after the 
MI_BATCH_BUFFER_START, it will just process a bunch of NOPs until it gets to 
the next buffer in memory which is B again.  In this scenario B gets processed 
twice which can be very confusing.  If you place things in memory just right, 
you can also end up with infinite loops which are all sorts of fun.

The root problem here is that it continues to process commands even after an 
MI_BATCH_BUFFER_START.  By simply checking the 2nd level we can detect whether 
or not the command buffer we are jumping to will return here and stop 
processing commands if it won't.

Signed-off-by: Jason Ekstrand 
<ja...@jlekstrand.net<mailto:ja...@jlekstrand.net>>
---
 src/intel/tools/aubinator.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/intel/tools/aubinator.c b/src/intel/tools/aubinator.c index 
fe1f369..73a7f21 100644
--- a/src/intel/tools/aubinator.c
+++ b/src/intel/tools/aubinator.c
@@ -766,6 +766,13 @@ parse_commands(struct gen_spec *spec, uint32_t *cmds, int 
size, int engine)
             start = p[1];

          parse_commands(spec, gtt + start, 1 << 20, engine);
+
+         /* MI_BATCH_BUFFER_START with "2nd Level Batch Buffer" unset acts
+          * like a goto.  No commands after such a MI_BATCH_BUFFER_START will
+          * get processed so we should bail as well.
+          */
+         if (p[0] & (1 << 22) == 0)

[SG]: The above line might need extra pair of parenthesis around comparison to 
get rid of the compile time warning I was seeing as below. Otherwise, Patch 
looks good to me.
aubinator.c: In function ‘parse_commands’:
aubinator.c:768:19: warning: suggest parentheses around comparison in operand 
of ‘&’ [-Wparentheses]
          if (p[0] & (1 << 22) == 0)

+            break;
       } else if ((p[0] & 0xffff0000) == AUB_MI_BATCH_BUFFER_END) {
          break;
       }
--
2.5.0.400.gff86faf

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org<mailto: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

Reply via email to