xf86-video-intel: src/sna/kgem.c src/sna/sna_blt.c

Chris Wilson ickle at kemper.freedesktop.org
Tue Jun 7 11:18:30 PDT 2011


 src/sna/kgem.c    |    2 ++
 src/sna/sna_blt.c |    2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

New commits:
commit 038f29c259c1463c0bff12f5f8f0b228c02e45b3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jun 7 19:16:01 2011 +0100

    sna/blt: Flush batch before overwrite surface data
    
    A left-over from before the surface was embedded into the tail of the
    batch, we were only checking for room against the total size of the
    batch buffer. So under the wrong set of circumstances we ended up
    overwriting surface data with batch and triggering a GPU hang on gen4+.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index fdc2108..46cd474 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -736,6 +736,7 @@ void _kgem_submit(struct kgem *kgem)
 
 	assert(kgem->nbatch);
 	assert(kgem->nbatch <= KGEM_BATCH_SIZE(kgem));
+	assert(kgem->nbatch <= kgem->surface);
 
 	sna_kgem_context_switch(kgem, KGEM_NONE);
 
@@ -747,6 +748,7 @@ void _kgem_submit(struct kgem *kgem)
 	     kgem->nreloc, kgem->nexec, kgem->nfence, kgem->aperture));
 
 	assert(kgem->nbatch <= ARRAY_SIZE(kgem->batch));
+	assert(kgem->nbatch <= kgem->surface);
 	assert(kgem->nreloc <= ARRAY_SIZE(kgem->reloc));
 	assert(kgem->nexec < ARRAY_SIZE(kgem->exec));
 	assert(kgem->nfence <= kgem->fence_max);
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index cdcfc3b..d82f417 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -281,7 +281,7 @@ static void sna_blt_copy_one(struct sna *sna,
 		return;
 	}
 
-	if (kgem->nbatch + 8 > KGEM_BATCH_SIZE(kgem) ||
+	if (kgem->nbatch + 8 + KGEM_BATCH_RESERVED > kgem->surface ||
 	    kgem->nreloc + 2 > KGEM_RELOC_SIZE(kgem))
 		_kgem_submit(kgem);
 


More information about the xorg-commit mailing list