xf86-video-ati: Branch 'master'

Michel Dänzer daenzer at kemper.freedesktop.org
Tue Jan 18 02:23:11 PST 2011


 src/radeon_legacy_memory.c  |    3 +++
 src/radeon_textured_video.c |    5 ++---
 src/radeon_video.c          |   32 ++++++++++++++++++++------------
 src/radeon_video.h          |    1 +
 4 files changed, 26 insertions(+), 15 deletions(-)

New commits:
commit 6548bb9836253c586023ffe5ad1497ddabaa50fc
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Tue Jan 18 10:23:41 2011 +0100

    Fix KMS textured video leaks (bug #33193).
    
    v2: Fix radeon_legacy_free_memory() argument type error pointed out by
    Marton Balint, refactor video memory freeing logic into helper function.
    
    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=33193 .

diff --git a/src/radeon_legacy_memory.c b/src/radeon_legacy_memory.c
index 3e75291..32d8c79 100644
--- a/src/radeon_legacy_memory.c
+++ b/src/radeon_legacy_memory.c
@@ -26,6 +26,9 @@ radeon_legacy_allocate_memory(ScrnInfoPtr pScrn,
     if (info->cs) {
 	struct radeon_bo *video_bo;
 
+	if (*mem_struct)
+		radeon_legacy_free_memory(pScrn, *mem_struct);
+
 	video_bo = radeon_bo_open(info->bufmgr, 0, size, RADEON_GPU_PAGE_SIZE, domain, 0);
 
 	*mem_struct = video_bo;
diff --git a/src/radeon_textured_video.c b/src/radeon_textured_video.c
index 36bcb56..163ee48 100644
--- a/src/radeon_textured_video.c
+++ b/src/radeon_textured_video.c
@@ -314,9 +314,8 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn,
     size = dstPitch * dst_height + 2 * dstPitch2 * ((dst_height + 1) >> 1);
     size = RADEON_ALIGN(size, hw_align);
 
-    if (pPriv->video_memory != NULL && size != pPriv->size) {
-	radeon_legacy_free_memory(pScrn, pPriv->video_memory);
-	pPriv->video_memory = NULL;
+    if (size != pPriv->size) {
+	RADEONFreeVideoMemory(pScrn, pPriv);
     }
 
     if (pPriv->video_memory == NULL) {
diff --git a/src/radeon_video.c b/src/radeon_video.c
index 0bb5ab3..4355f8b 100644
--- a/src/radeon_video.c
+++ b/src/radeon_video.c
@@ -1646,6 +1646,23 @@ RADEONSetupImageVideo(ScreenPtr pScreen)
 }
 
 void
+RADEONFreeVideoMemory(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
+{
+    RADEONInfoPtr info = RADEONPTR(pScrn);
+
+    if (pPriv->video_memory != NULL) {
+	radeon_legacy_free_memory(pScrn, pPriv->video_memory);
+	pPriv->video_memory = NULL;
+
+	if (info->cs && pPriv->textured) {
+	    pPriv->src_bo[0] = NULL;
+	    radeon_legacy_free_memory(pScrn, (void*)&pPriv->src_bo[1]);
+	    pPriv->src_bo[1] = NULL;
+	}
+    }
+}
+
+void
 RADEONStopVideo(ScrnInfoPtr pScrn, pointer data, Bool cleanup)
 {
   RADEONInfoPtr info = RADEONPTR(pScrn);
@@ -1654,10 +1671,7 @@ RADEONStopVideo(ScrnInfoPtr pScrn, pointer data, Bool cleanup)
 
   if (pPriv->textured) {
       if (cleanup) {
-	  if (pPriv->video_memory != NULL) {
-	      radeon_legacy_free_memory(pScrn, pPriv->video_memory);
-	      pPriv->video_memory = NULL;
-	  }
+	  RADEONFreeVideoMemory(pScrn, pPriv);
       }
       return;
   }
@@ -1679,10 +1693,7 @@ RADEONStopVideo(ScrnInfoPtr pScrn, pointer data, Bool cleanup)
 		if(pPriv->uda1380 != NULL) xf86_uda1380_mute(pPriv->uda1380, TRUE);
         if(pPriv->i2c != NULL) RADEON_board_setmisc(pPriv);
      }
-     if (pPriv->video_memory != NULL) {
-	 radeon_legacy_free_memory(pScrn, pPriv->video_memory);
-	 pPriv->video_memory = NULL;
-     }
+     RADEONFreeVideoMemory(pScrn, pPriv);
      pPriv->videoStatus = 0;
   } else {
      if(pPriv->videoStatus & CLIENT_VIDEO_ON) {
@@ -3152,10 +3163,7 @@ RADEONVideoTimerCallback(ScrnInfoPtr pScrn, Time now)
 	    }
 	} else {  /* FREE_TIMER */
 	    if(pPriv->freeTime < now) {
-		if (pPriv->video_memory != NULL) {
-		    radeon_legacy_free_memory(pScrn, pPriv->video_memory);
-		    pPriv->video_memory = NULL;
-		}
+		RADEONFreeVideoMemory(pScrn, pPriv);
 		pPriv->videoStatus = 0;
 		info->VideoTimerCallback = NULL;
 	    }
diff --git a/src/radeon_video.h b/src/radeon_video.h
index ab0c433..c315bbb 100644
--- a/src/radeon_video.h
+++ b/src/radeon_video.h
@@ -150,6 +150,7 @@ void RADEONVIP_reset(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv);
 
 int  RADEONSetPortAttribute(ScrnInfoPtr, Atom, INT32, pointer);
 int  RADEONGetPortAttribute(ScrnInfoPtr, Atom ,INT32 *, pointer);
+void RADEONFreeVideoMemory(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv);
 void RADEONStopVideo(ScrnInfoPtr, pointer, Bool);
 void RADEONQueryBestSize(ScrnInfoPtr, Bool, short, short, short, short,
 			 unsigned int *, unsigned int *, pointer);


More information about the xorg-commit mailing list