intel/decoders: limit number of decoded batchbuffers
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Tue, 4 Sep 2018 14:45:32 +0000 (15:45 +0100)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Thu, 7 Mar 2019 15:08:31 +0000 (15:08 +0000)
IGT has a test to hang the GPU that works by having a batch buffer
jump back into itself, trigger an infinite loop on the command stream.
As our implementation of the decoding is "perfectly" mimicking the
hardware, our decoder also "hangs". This change limits the number of
batch buffer we'll decode before we bail to 100.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Rafael Antognolli <rafael.antognolli@intel.com>
src/intel/common/gen_batch_decoder.c
src/intel/common/gen_decoder.h
src/intel/tools/aubinator_viewer.h
src/intel/tools/aubinator_viewer_decoder.cpp

index becb708da651460ef22d97f029b09896cd8ecf17..ff898d8222cd81cc7f52d4b1cd5b56c7b71f5e3a 100644 (file)
@@ -810,6 +810,17 @@ gen_print_batch(struct gen_batch_decode_ctx *ctx,
    const uint32_t *p, *end = batch + batch_size / sizeof(uint32_t);
    int length;
    struct gen_group *inst;
+   const char *reset_color = ctx->flags & GEN_BATCH_DECODE_IN_COLOR ? NORMAL : "";
+
+   if (ctx->n_batch_buffer_start >= 100) {
+      fprintf(ctx->fp, "%s0x%08"PRIx64": Max batch buffer jumps exceeded%s\n",
+              (ctx->flags & GEN_BATCH_DECODE_IN_COLOR) ? RED_COLOR : "",
+              (ctx->flags & GEN_BATCH_DECODE_OFFSETS) ? batch_addr : 0,
+              reset_color);
+      return;
+   }
+
+   ctx->n_batch_buffer_start++;
 
    for (p = batch; p < end; p += length) {
       inst = gen_ctx_find_instruction(ctx, p);
@@ -817,8 +828,6 @@ gen_print_batch(struct gen_batch_decode_ctx *ctx,
       assert(inst == NULL || length > 0);
       length = MAX2(1, length);
 
-      const char *reset_color = ctx->flags & GEN_BATCH_DECODE_IN_COLOR ? NORMAL : "";
-
       uint64_t offset;
       if (ctx->flags & GEN_BATCH_DECODE_OFFSETS)
          offset = batch_addr + ((char *)p - (char *)batch);
@@ -908,4 +917,6 @@ gen_print_batch(struct gen_batch_decode_ctx *ctx,
          break;
       }
    }
+
+   ctx->n_batch_buffer_start--;
 }
index f5f38078442c0d2e9d7b423e0f0163ea4b4e8f82..b4c85ab0c1dd051dfebc76c6d38a17d9a6ef0b31 100644 (file)
@@ -237,6 +237,8 @@ struct gen_batch_decode_ctx {
    int max_vbo_decoded_lines;
 
    enum drm_i915_gem_engine_class engine;
+
+   int n_batch_buffer_start;
 };
 
 void gen_batch_decode_ctx_init(struct gen_batch_decode_ctx *ctx,
index 168129255156a54f4f9a330f8a55e6fe98f811db..65c679f85dea09c42c1d00f9503c7649d36a6d17 100644 (file)
@@ -82,6 +82,8 @@ struct aub_viewer_decode_ctx {
    enum aub_decode_stage stage;
    uint32_t end_urb_offset;
    struct aub_decode_urb_stage_state urb_stages[AUB_DECODE_N_STAGE];
+
+   int n_batch_buffer_start;
 };
 
 void aub_viewer_decode_ctx_init(struct aub_viewer_decode_ctx *ctx,
index b946fb33e0ceedff0c117fd08baa644c292afe71..f9586590221cc19d1b16ff9e0033b6d55aabf9b4 100644 (file)
@@ -898,6 +898,14 @@ aub_viewer_render_batch(struct aub_viewer_decode_ctx *ctx,
    const uint32_t *p, *batch = (const uint32_t *) _batch, *end = batch + batch_size / sizeof(uint32_t);
    int length;
 
+   if (ctx->n_batch_buffer_start >= 100) {
+      ImGui::TextColored(ctx->cfg->error_color,
+                         "0x%08" PRIx64 ": Max batch buffer jumps exceeded", batch_addr);
+      return;
+   }
+
+   ctx->n_batch_buffer_start++;
+
    for (p = batch; p < end; p += length) {
       inst = gen_spec_find_instruction(ctx->spec, ctx->engine, p);
       length = gen_group_get_length(inst, p);
@@ -991,4 +999,6 @@ aub_viewer_render_batch(struct aub_viewer_decode_ctx *ctx,
          break;
       }
    }
+
+   ctx->n_batch_buffer_start--;
 }