[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#724944: Patch



Control: tags -1 + patch

First of all, I can see how you're busy, but if you think my problem is
trivial, please just tell me so.  If I'm sending a message saying "I
don't know how to continue", even explicitly saying that I know this may
not be what you need, a reply only saying "this is not what we need" is
totally unhelpful.  It shouldn't be too much effort to type the extra
sentence "what you describe you did should have worked, did you try
restarting the server?" (which I thought I did, but I suppose I didn't).
A line like that helps more than you might think; it confirms that I was
on the right track.  Since I don't know much about the code or how it's
supposed to work, that is good to know.

Anyway, a server which is unable to play any video 5 minutes after
starting gives quite a strong motivation to fix things.  So after I got
a backtrace, I debugged the thing.  The problem was that the result of
intel_get_pixmap_private() could be NULL, but that wasn't checked.  So I
grepped for it and added checks to all calls of that function.  The
patch is attached.  You will want to check if I'm handling it the right
way everywhere, because I just guessed the proper course of action.
Then again, most code would segfault without handling it, so perhaps
most of these can't ever be triggered anyay (but I'm not too sure about
that; it certainly can set it to NULL when calloc fails).

Thanks,
Bas
Index: xserver-xorg-video-intel-2.21.15/src/uxa/intel.h
===================================================================
--- xserver-xorg-video-intel-2.21.15.orig/src/uxa/intel.h	2013-10-11 00:30:38.343948391 -0400
+++ xserver-xorg-video-intel-2.21.15/src/uxa/intel.h	2013-10-11 00:30:38.335948384 -0400
@@ -130,12 +130,17 @@
 
 static inline Bool intel_pixmap_is_dirty(PixmapPtr pixmap)
 {
-	return pixmap && intel_get_pixmap_private(pixmap)->dirty;
+	struct intel_pixmap *priv;
+	if (!pixmap)
+		return FALSE;
+	priv = intel_get_pixmap_private(pixmap);
+	return priv && priv->dirty;
 }
 
 static inline Bool intel_pixmap_tiled(PixmapPtr pixmap)
 {
-	return intel_get_pixmap_private(pixmap)->tiling != I915_TILING_NONE;
+	struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
+	return priv && priv->tiling != I915_TILING_NONE;
 }
 
 dri_bo *intel_get_pixmap_bo(PixmapPtr pixmap);
Index: xserver-xorg-video-intel-2.21.15/src/uxa/i830_render.c
===================================================================
--- xserver-xorg-video-intel-2.21.15.orig/src/uxa/i830_render.c	2013-10-11 00:30:38.343948391 -0400
+++ xserver-xorg-video-intel-2.21.15/src/uxa/i830_render.c	2013-10-11 00:30:38.335948384 -0400
@@ -293,9 +293,9 @@
 	filter |= (MIPFILTER_NONE << TM0S3_MIP_FILTER_SHIFT);
 
 	if (intel_pixmap_tiled(pixmap)) {
+		struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
 		tiling_bits = TM0S1_TILED_SURFACE;
-		if (intel_get_pixmap_private(pixmap)->tiling
-				== I915_TILING_Y)
+		if (priv && priv->tiling == I915_TILING_Y)
 			tiling_bits |= TM0S1_TILE_WALK;
 	} else
 		tiling_bits = 0;
@@ -585,9 +585,9 @@
 	assert(intel->in_batch_atomic);
 
 	if (intel_pixmap_tiled(intel->render_dest)) {
+		struct intel_pixmap *priv = intel_get_pixmap_private(intel->render_dest);
 		tiling_bits = BUF_3D_TILED_SURFACE;
-		if (intel_get_pixmap_private(intel->render_dest)->tiling
-				== I915_TILING_Y)
+		if (priv && priv->tiling == I915_TILING_Y)
 			tiling_bits |= BUF_3D_TILE_WALK_Y;
 	} else
 		tiling_bits = 0;
Index: xserver-xorg-video-intel-2.21.15/src/uxa/i915_render.c
===================================================================
--- xserver-xorg-video-intel-2.21.15.orig/src/uxa/i915_render.c	2013-10-11 00:30:38.343948391 -0400
+++ xserver-xorg-video-intel-2.21.15/src/uxa/i915_render.c	2013-10-11 00:30:38.339948386 -0400
@@ -351,9 +351,9 @@
 
 	/* offset filled in at emit time */
 	if (intel_pixmap_tiled(pixmap)) {
+		struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
 		tiling_bits = MS3_TILED_SURFACE;
-		if (intel_get_pixmap_private(pixmap)->tiling
-				== I915_TILING_Y)
+		if (priv && priv->tiling == I915_TILING_Y)
 			tiling_bits |= MS3_TILE_WALK;
 	} else
 		tiling_bits = 0;
@@ -883,9 +883,9 @@
 		uint32_t tiling_bits;
 
 		if (intel_pixmap_tiled(dest)) {
+			struct intel_pixmap *priv = intel_get_pixmap_private(dest);
 			tiling_bits = BUF_3D_TILED_SURFACE;
-			if (intel_get_pixmap_private(dest)->tiling
-			    == I915_TILING_Y)
+			if (priv && priv->tiling == I915_TILING_Y)
 				tiling_bits |= BUF_3D_TILE_WALK_Y;
 		} else
 			tiling_bits = 0;
Index: xserver-xorg-video-intel-2.21.15/src/uxa/i915_video.c
===================================================================
--- xserver-xorg-video-intel-2.21.15.orig/src/uxa/i915_video.c	2013-10-11 00:30:38.343948391 -0400
+++ xserver-xorg-video-intel-2.21.15/src/uxa/i915_video.c	2013-10-11 00:30:38.339948386 -0400
@@ -154,8 +154,9 @@
 
 		/* front buffer, pitch, offset */
 		if (intel_pixmap_tiled(target)) {
+			struct intel_pixmap *priv = intel_get_pixmap_private(target);
 			tiling = BUF_3D_TILED_SURFACE;
-			if (intel_get_pixmap_private(target)->tiling == I915_TILING_Y)
+			if (priv && priv->tiling == I915_TILING_Y)
 				tiling |= BUF_3D_TILE_WALK_Y;
 		} else
 			tiling = 0;
Index: xserver-xorg-video-intel-2.21.15/src/uxa/i965_render.c
===================================================================
--- xserver-xorg-video-intel-2.21.15.orig/src/uxa/i965_render.c	2013-10-11 00:30:38.343948391 -0400
+++ xserver-xorg-video-intel-2.21.15/src/uxa/i965_render.c	2013-10-11 00:33:10.791908109 -0400
@@ -1313,6 +1313,8 @@
 	uint32_t write_domain, read_domains;
 	int offset;
 
+	if (!priv)
+		return intel->surface_used;
 	if (is_dst) {
 		write_domain = I915_GEM_DOMAIN_RENDER;
 		read_domains = I915_GEM_DOMAIN_RENDER;
@@ -1365,6 +1367,8 @@
 	uint32_t write_domain, read_domains;
 	int offset;
 
+	if (!priv)
+		return intel->surface_used;
 	if (is_dst) {
 		write_domain = I915_GEM_DOMAIN_RENDER;
 		read_domains = I915_GEM_DOMAIN_RENDER;
Index: xserver-xorg-video-intel-2.21.15/src/uxa/intel_batchbuffer.h
===================================================================
--- xserver-xorg-video-intel-2.21.15.orig/src/uxa/intel_batchbuffer.h	2013-10-11 00:30:38.343948391 -0400
+++ xserver-xorg-video-intel-2.21.15/src/uxa/intel_batchbuffer.h	2013-10-11 00:30:38.339948386 -0400
@@ -144,6 +144,8 @@
 			      uint32_t delta, int needs_fence)
 {
 	struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
+	if (!priv)
+		return;
 
 	intel_batch_mark_pixmap_domains(intel, priv, read_domains, write_domain);
 
Index: xserver-xorg-video-intel-2.21.15/src/uxa/intel_dri.c
===================================================================
--- xserver-xorg-video-intel-2.21.15.orig/src/uxa/intel_dri.c	2013-10-11 00:30:38.343948391 -0400
+++ xserver-xorg-video-intel-2.21.15/src/uxa/intel_dri.c	2013-10-11 00:30:38.339948386 -0400
@@ -147,12 +147,13 @@
 	intel_set_pixmap_private(old, priv);
 	old->refcnt++;
 
-	screen->ModifyPixmapHeader(old,
-				   drawable->width,
-				   drawable->height,
-				   0, 0,
-				   priv->stride,
-				   NULL);
+	if (priv)
+		screen->ModifyPixmapHeader(old,
+					   drawable->width,
+					   drawable->height,
+					   0, 0,
+					   priv->stride,
+					   NULL);
 	screen->DestroyPixmap(pixmap);
 	intel_get_screen_private(xf86ScreenToScrn(screen))->needs_flush = TRUE;
 	return old;
@@ -758,8 +759,10 @@
 	new_back = intel_get_pixmap_private(front);
 	intel_set_pixmap_private(front, new_front);
 	intel_set_pixmap_private(back, new_back);
-	new_front->busy = 1;
-	new_back->busy = -1;
+	if (new_front)
+		new_front->busy = 1;
+	if (new_back)
+		new_back->busy = -1;
 
 	intel_glamor_exchange_buffers(intel, front, back);
 
@@ -980,7 +983,7 @@
 #endif
 
 	/* prevent an implicit tiling mode change */
-	if (front_intel->tiling != back_intel->tiling)
+	if (front_intel && back_intel && front_intel->tiling != back_intel->tiling)
 		return FALSE;
 
 	return TRUE;
Index: xserver-xorg-video-intel-2.21.15/src/uxa/intel_glamor.c
===================================================================
--- xserver-xorg-video-intel-2.21.15.orig/src/uxa/intel_glamor.c	2013-10-11 00:30:38.343948391 -0400
+++ xserver-xorg-video-intel-2.21.15/src/uxa/intel_glamor.c	2013-10-11 00:33:52.651896993 -0400
@@ -147,7 +147,7 @@
 		return TRUE;
 
 	priv = intel_get_pixmap_private(pixmap);
-	if (glamor_egl_create_textured_pixmap(pixmap, priv->bo->handle,
+	if (priv && glamor_egl_create_textured_pixmap(pixmap, priv->bo->handle,
 					      priv->stride)) {
 		drm_intel_bo_disable_reuse(priv->bo);
 		priv->pinned |= PIN_GLAMOR;
Index: xserver-xorg-video-intel-2.21.15/src/uxa/intel_uxa.c
===================================================================
--- xserver-xorg-video-intel-2.21.15.orig/src/uxa/intel_uxa.c	2013-10-11 00:30:38.343948391 -0400
+++ xserver-xorg-video-intel-2.21.15/src/uxa/intel_uxa.c	2013-10-11 00:30:57.019943465 -0400
@@ -689,9 +689,11 @@
 	ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
-	dri_bo *bo = priv->bo;
+	dri_bo *bo;
 	int ret;
-
+	if (!priv)
+		return FALSE;
+	bo = priv->bo;
 	/* Transitioning to glamor acceleration, we need to flush all pending
 	 * usage by UXA. */
 	if (access == UXA_GLAMOR_ACCESS_RW || access == UXA_GLAMOR_ACCESS_RO) {
@@ -780,7 +782,7 @@
 	struct intel_pixmap *priv;
 
 	priv = intel_get_pixmap_private(pixmap);
-	if (!intel_pixmap_is_busy(priv)) {
+	if (!priv || !intel_pixmap_is_busy(priv)) {
 		/* bo is not busy so can be replaced without a stall, upload in-place. */
 		return intel_uxa_pixmap_put_image(pixmap, src, src_pitch, x, y, w, h);
 	} else {
@@ -866,6 +868,8 @@
 	int stride = intel_pixmap_pitch(pixmap);
 	int cpp = pixmap->drawable.bitsPerPixel/8;
 
+	if (!priv)
+		return FALSE;
 	/* assert(priv->tiling == I915_TILING_NONE); */
 	if (h == 1 || (dst_pitch == stride && w == pixmap->drawable.width)) {
 		return drm_intel_bo_get_subdata(priv->bo, y*stride + x*cpp, (h-1)*stride + w*cpp, dst) == 0;
@@ -906,7 +910,7 @@
 	 */
 
 	priv = intel_get_pixmap_private(pixmap);
-	if (intel_pixmap_is_busy(priv) || priv->tiling != I915_TILING_NONE) {
+	if (priv && (intel_pixmap_is_busy(priv) || priv->tiling != I915_TILING_NONE)) {
 		ScreenPtr screen = pixmap->drawable.pScreen;
 		GCPtr gc;
 
@@ -1149,6 +1153,7 @@
 	PixmapPtr pixmap;
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	dri_bo *bo = intel->front_buffer;
+	struct intel_pixmap *priv;
 
 	if (!uxa_resources_init(screen))
 		return FALSE;
@@ -1158,7 +1163,10 @@
 
 	pixmap = screen->GetScreenPixmap(screen);
 	intel_set_pixmap_bo(pixmap, bo);
-	intel_get_pixmap_private(pixmap)->pinned |= PIN_SCANOUT;
+	priv = intel_get_pixmap_private(pixmap);
+	if (!priv)
+		return FALSE;
+	priv->pinned |= PIN_SCANOUT;
 	screen->ModifyPixmapHeader(pixmap,
 				   scrn->virtualX,
 				   scrn->virtualY,
@@ -1191,7 +1199,7 @@
 	drm_intel_bo_get_tiling(bo, &tiling, &swizzle);
 
 	if (tiling == I915_TILING_X) {
-		if (priv->pinned & ~PIN_DRI)
+		if (priv && (priv->pinned & ~PIN_DRI))
 			return FALSE;
 
 	        tiling = I915_TILING_NONE;
@@ -1204,8 +1212,10 @@
 
 		if (tiling != I915_TILING_NONE)
 			drm_intel_bo_set_tiling(newbo, &tiling, stride);
-		priv->stride = stride;
-		priv->tiling = tiling;
+		if (priv) {
+			priv->stride = stride;
+			priv->tiling = tiling;
+		}
 		intel_set_pixmap_bo(ppix, newbo);
 
 		ppix->drawable.pScreen->ModifyPixmapHeader(ppix, ppix->drawable.width,
@@ -1215,7 +1225,8 @@
 	}
 	drm_intel_bo_get_tiling(bo, &tiling, &swizzle);
 	drm_intel_bo_gem_export_to_prime(bo, &handle);
-	priv->pinned |= PIN_DRI;
+	if (priv)
+		priv->pinned |= PIN_DRI;
 
 	*fd_handle = (void *)(long)handle;
 	return TRUE;

Attachment: signature.asc
Description: Digital signature


Reply to: