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;
signature.asc
Description: Digital signature