xf86-video-intel: 2 commits - src/i830_driver.c src/i965_render.c

Kristian Høgsberg krh at kemper.freedesktop.org
Wed Mar 4 14:35:57 PST 2009


 src/i830_driver.c |   16 ++++++++++++++++
 src/i965_render.c |   17 ++++++++++++++---
 2 files changed, 30 insertions(+), 3 deletions(-)

New commits:
commit d4c64f01b9429a8fb314e43f40d1f02bb8aab30f
Author: Lukas Hejtmanek <xhejtman at ics.muni.cz>
Date:   Wed Mar 4 17:33:27 2009 -0500

    Fix serious memory leak at Enter/LeaveVT
    
    This fixes huge memory leak at each VT switch (about 600 BOs + 6MB
    of RSS of Xserver).

diff --git a/src/i965_render.c b/src/i965_render.c
index de1c8b3..ab7f7d2 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -1715,7 +1715,7 @@ gen4_render_state_cleanup(ScrnInfoPtr pScrn)
 {
     I830Ptr pI830 = I830PTR(pScrn);
     struct gen4_render_state *render_state= pI830->gen4_render_state;
-    int i;
+    int i, j, k, l, m;
 
     if (render_state->vertex_buffer_bo) {
 	dri_bo_unreference (render_state->vertex_buffer_bo);
@@ -1728,12 +1728,23 @@ gen4_render_state_cleanup(ScrnInfoPtr pScrn)
     render_state->sf_state_bo = NULL;
     drm_intel_bo_unreference(render_state->sf_mask_state_bo);
     render_state->sf_mask_state_bo = NULL;
-    drm_intel_bo_unreference(render_state->cc_state_bo);
-    render_state->cc_state_bo = NULL;
+
     for (i = 0; i < WM_KERNEL_COUNT; i++) {
 	drm_intel_bo_unreference(render_state->wm_kernel_bo[i]);
 	render_state->wm_kernel_bo[i] = NULL;
     }
+
+    for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++)
+	for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++)
+	    for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++)
+		for (l = 0; l < SAMPLER_STATE_EXTEND_COUNT; l++)
+		    for (m = 0; m < WM_KERNEL_COUNT; m++) {
+			drm_intel_bo_unreference(render_state->wm_state_bo[m][i][j][k][l]);
+			render_state->wm_state_bo[m][i][j][k][l] = NULL;
+		    }
+
+    drm_intel_bo_unreference(render_state->cc_state_bo);
+    render_state->cc_state_bo = NULL;
     drm_intel_bo_unreference(render_state->sip_kernel_bo);
     render_state->sip_kernel_bo = NULL;
 }
commit 095a001f755201d3c19335b67a84c57b1d080a83
Author: Kristian Høgsberg <krh at redhat.com>
Date:   Wed Mar 4 17:10:24 2009 -0500

    Use drmSetMaster() and drmDropMaster() in enter/leave VT
    
    This allows multiple X server to use DRI and makes it possible to run
    multiple X servers under KMS.  This requires a 2.6.29 kernel to work.
    On older kernels it will just log a warning and DRI will fail to
    initialize for the second X server.

diff --git a/src/i830_driver.c b/src/i830_driver.c
index 342a059..f80ca69 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -3536,6 +3536,7 @@ I830LeaveVT(int scrnIndex, int flags)
 {
    ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
    I830Ptr pI830 = I830PTR(pScrn);
+   int ret;
 #ifndef HAVE_FREE_SHADOW
    xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
    int o;
@@ -3629,6 +3630,13 @@ I830LeaveVT(int scrnIndex, int flags)
 
    if (pI830->AccelInfoRec)
       pI830->AccelInfoRec->NeedToSync = FALSE;
+
+#ifdef XF86DRI
+   ret = drmDropMaster(pI830->drmSubFD);
+   if (ret)
+      xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+		 "drmDropMaster failed: %s\n", strerror(ret));
+#endif
 }
 
 /*
@@ -3639,9 +3647,17 @@ I830EnterVT(int scrnIndex, int flags)
 {
    ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
    I830Ptr  pI830 = I830PTR(pScrn);
+   int ret;
 
    DPRINTF(PFX, "Enter VT\n");
 
+#ifdef XF86DRI
+   ret = drmSetMaster(pI830->drmSubFD);
+   if (ret)
+      xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+		 "drmDropMaster failed: %s\n", strerror(ret));
+#endif
+
    /*
     * Only save state once per server generation since that's what most
     * drivers do.  Could change this to save state at each VT enter.


More information about the xorg-commit mailing list