sna: Check for wedged after submitting
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 30 Oct 2013 09:55:57 +0000 (09:55 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 30 Oct 2013 13:42:44 +0000 (13:42 +0000)
If we submit prior to an operation, check that we didn't just wedge the
GPU.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
src/sna/gen2_render.c
src/sna/gen3_render.c
src/sna/gen4_render.c
src/sna/gen5_render.c
src/sna/gen7_render.c
src/sna/kgem.c
src/sna/sna_blt.c

index a0ba8ca..1a4c36a 100644 (file)
@@ -2809,7 +2809,8 @@ gen2_render_fill_boxes(struct sna *sna,
 
        if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
                kgem_submit(&sna->kgem);
-               assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+               if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
+                       return false;
        }
 
        gen2_emit_fill_composite_state(sna, &tmp, pixel);
@@ -3040,10 +3041,13 @@ gen2_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
 
        if (!kgem_check_bo(&sna->kgem, bo, NULL)) {
                kgem_submit(&sna->kgem);
+
                if (gen2_render_fill_one_try_blt(sna, dst, bo, color,
                                                 x1, y1, x2, y2, alu))
                        return true;
-               assert(kgem_check_bo(&sna->kgem, bo, NULL));
+
+               if (!kgem_check_bo(&sna->kgem, bo, NULL))
+                       return false;
        }
 
        tmp.op = alu;
index cec35f4..dc20c02 100644 (file)
@@ -5949,7 +5949,8 @@ gen3_render_fill_boxes(struct sna *sna,
 
        if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
                kgem_submit(&sna->kgem);
-               assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+               if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
+                       return false;
        }
 
        gen3_align_vertex(sna, &tmp);
@@ -6095,7 +6096,8 @@ gen3_render_fill(struct sna *sna, uint8_t alu,
 
        if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
                kgem_submit(&sna->kgem);
-               assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+               if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
+                       return false;
        }
 
        tmp->blt   = gen3_render_fill_op_blt;
@@ -6176,9 +6178,13 @@ gen3_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
 
        if (!kgem_check_bo(&sna->kgem, bo, NULL)) {
                kgem_submit(&sna->kgem);
+
                if (gen3_render_fill_one_try_blt(sna, dst, bo, color,
                                                 x1, y1, x2, y2, alu))
                        return true;
+
+               if (!kgem_check_bo(&sna->kgem, bo, NULL))
+                       return false;
        }
 
        gen3_align_vertex(sna, &tmp);
index f737c33..5d95991 100644 (file)
@@ -1388,7 +1388,8 @@ gen4_render_video(struct sna *sna,
 
        if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) {
                kgem_submit(&sna->kgem);
-               assert(kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL));
+               if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
+                       return false;
        }
 
        gen4_align_vertex(sna, &tmp);
@@ -2656,7 +2657,8 @@ gen4_render_fill_boxes(struct sna *sna,
 
        if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
                kgem_submit(&sna->kgem);
-               assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+               if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
+                       return false;
        }
 
        gen4_align_vertex(sna, &tmp);
@@ -2761,7 +2763,10 @@ gen4_render_fill(struct sna *sna, uint8_t alu,
 
        if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
                kgem_submit(&sna->kgem);
-               assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+               if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
+                       kgem_bo_destroy(&sna->kgem, op->base.src.bo);
+                       return false;
+               }
        }
 
        gen4_align_vertex(sna, &op->base);
index f9dd6ae..e20b0d0 100644 (file)
@@ -1386,7 +1386,8 @@ gen5_render_video(struct sna *sna,
 
        if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) {
                kgem_submit(&sna->kgem);
-               assert(kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL));
+               if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
+                       return false;
        }
 
        gen5_align_vertex(sna, &tmp);
@@ -2686,7 +2687,10 @@ gen5_render_fill_boxes(struct sna *sna,
 
        if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
                kgem_submit(&sna->kgem);
-               assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+               if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
+                       kgem_bo_destroy(&sna->kgem, tmp.src.bo);
+                       return false;
+               }
        }
 
        gen5_align_vertex(sna, &tmp);
@@ -2856,7 +2860,10 @@ gen5_render_fill(struct sna *sna, uint8_t alu,
 
        if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
                kgem_submit(&sna->kgem);
-               assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+               if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
+                       kgem_bo_destroy(&sna->kgem, op->base.src.bo);
+                       return false;
+               }
        }
 
        gen5_align_vertex(sna, &op->base);
@@ -2951,7 +2958,6 @@ gen5_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
                        kgem_bo_destroy(&sna->kgem, tmp.src.bo);
                        return false;
                }
-               assert(kgem_check_bo(&sna->kgem, bo, NULL));
        }
 
        gen5_align_vertex(sna, &tmp);
index d597e17..b8c46c0 100644 (file)
@@ -1868,7 +1868,9 @@ gen7_render_video(struct sna *sna,
        kgem_set_mode(&sna->kgem, KGEM_RENDER, tmp.dst.bo);
        if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) {
                kgem_submit(&sna->kgem);
-               assert(kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL));
+               if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
+                       return false;
+
                _kgem_set_mode(&sna->kgem, KGEM_RENDER);
        }
 
@@ -3327,7 +3329,12 @@ gen7_render_fill_boxes(struct sna *sna,
        kgem_set_mode(&sna->kgem, KGEM_RENDER, dst_bo);
        if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
                kgem_submit(&sna->kgem);
-               assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+               if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
+                       kgem_bo_destroy(&sna->kgem, tmp.src.bo);
+                       if (tmp.redirect.real_bo)
+                               kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
+                       return false;
+               }
                _kgem_set_mode(&sna->kgem, KGEM_RENDER);
        }
 
@@ -3502,7 +3509,11 @@ gen7_render_fill(struct sna *sna, uint8_t alu,
        kgem_set_mode(&sna->kgem, KGEM_RENDER, dst_bo);
        if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
                kgem_submit(&sna->kgem);
-               assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+               if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
+                       kgem_bo_destroy(&sna->kgem, op->base.src.bo);
+                       return false;
+               }
+
                _kgem_set_mode(&sna->kgem, KGEM_RENDER);
        }
 
@@ -3581,7 +3592,7 @@ gen7_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
        kgem_set_mode(&sna->kgem, KGEM_RENDER, bo);
        if (!kgem_check_bo(&sna->kgem, bo, NULL)) {
                kgem_submit(&sna->kgem);
-               if (kgem_check_bo(&sna->kgem, bo, NULL)) {
+               if (!kgem_check_bo(&sna->kgem, bo, NULL)) {
                        kgem_bo_destroy(&sna->kgem, tmp.src.bo);
                        return false;
                }
index 4606dc7..6afbec7 100644 (file)
@@ -4717,6 +4717,9 @@ static bool aperture_check(struct kgem *kgem, unsigned num_pages)
 
 static inline bool kgem_flush(struct kgem *kgem, bool flush)
 {
+       if (unlikely(kgem->wedged))
+               return false;
+
        if (kgem->nreloc == 0)
                return true;
 
index 277f53e..94486bc 100644 (file)
@@ -173,6 +173,8 @@ static bool sna_blt_fill_init(struct sna *sna,
 
                if (!kgem_check_reloc(kgem, 1)) {
                        _kgem_submit(kgem);
+                       if (!kgem_check_bo_fenced(kgem, bo))
+                               return false;
                        _kgem_set_mode(kgem, KGEM_BLT);
                }
 
@@ -2734,6 +2736,8 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
 
                if (!kgem_check_reloc(kgem, 1)) {
                        _kgem_submit(kgem);
+                       if (!kgem_check_bo_fenced(&sna->kgem, bo))
+                               return false;
                        _kgem_set_mode(kgem, KGEM_BLT);
                }