intel/batch_decoder: Recurse for all 2nd level batches
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 9 Jul 2018 22:58:33 +0000 (15:58 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 9 Jul 2018 23:40:54 +0000 (16:40 -0700)
Our attempt to restart the loop with the second level batch worked at
one point but got broken at some point.  It was too fragile anyway and
we're not likely to have enough secondaries to actually overflow the
stack so we may as well recurse in both cases.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/common/gen_batch_decoder.c

index fc0ff95a47657481e8a70d660d51b8dc23c73acd..fe7536da9ec3a26adae269deb7ff4175a8e0c967 100644 (file)
@@ -856,33 +856,24 @@ gen_print_batch(struct gen_batch_decode_ctx *ctx,
          if (next_batch.map == NULL) {
             fprintf(ctx->fp, "Secondary batch at 0x%08"PRIx64" unavailable\n",
                     next_batch.addr);
+         } else {
+            gen_print_batch(ctx, next_batch.map, next_batch.size,
+                            next_batch.addr);
          }
-
          if (second_level) {
             /* MI_BATCH_BUFFER_START with "2nd Level Batch Buffer" set acts
              * like a subroutine call.  Commands that come afterwards get
              * processed once the 2nd level batch buffer returns with
              * MI_BATCH_BUFFER_END.
              */
-            if (next_batch.map) {
-               gen_print_batch(ctx, next_batch.map, next_batch.size,
-                               next_batch.addr);
-            }
+            continue;
          } else {
             /* MI_BATCH_BUFFER_START with "2nd Level Batch Buffer" unset acts
              * like a goto.  Nothing after it will ever get processed.  In
              * order to prevent the recursion from growing, we just reset the
              * loop and continue;
              */
-            if (next_batch.map) {
-               p = next_batch.map;
-               end = next_batch.map + next_batch.size;
-               length = 0;
-               continue;
-            } else {
-               /* Nothing we can do */
-               break;
-            }
+            break;
          }
       } else if (strcmp(inst_name, "MI_BATCH_BUFFER_END") == 0) {
          break;