Date: Thursday, February 11, 2010 @ 03:19:14 Author: thomas Revision: 68164
Fix intel bugs that made the 2.10 driver unusable This adds the following 3 commits from upstream libdrm master: 973d8d6bd04230da801a8bc19af41dbc60e1918d: intel: check return value for calloc fdcde592c2c48e143251672cf2e82debb07606bd: intel: Account for potential pinned buffers hogging fences 4f0f871730b76730ca58209181d16725b0c40184: intel: Handle resetting of input params after EINTR during SET_TILING Added: libdrm/trunk/intel_gitupdate.diff Modified: libdrm/trunk/PKGBUILD ----------------------+ PKGBUILD | 3 ++ intel_gitupdate.diff | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) Modified: PKGBUILD =================================================================== --- PKGBUILD 2010-02-11 08:00:48 UTC (rev 68163) +++ PKGBUILD 2010-02-11 08:19:14 UTC (rev 68164) @@ -13,16 +13,19 @@ source=(http://dri.freedesktop.org/${pkgname}/${pkgname}-${pkgver}.tar.bz2 no-pthread-stubs.patch nouveau_gitupdate.diff + intel_gitupdate.diff COPYING) md5sums=('667d81f993f7fd8a1b1b1b830a28a748' '9b5ec3bbebe86921e2057694c42f65b8' 'f83babf7dc9d2a698b94d46b090ed674' + '3ebf954a427746af68330d2fa2da4e47' 'ba65e71c481b94ef0fb6c23c7f21ffa1') build() { cd "${srcdir}/${pkgname}-${pkgver}" patch -Np1 -i "${srcdir}/no-pthread-stubs.patch" || return 1 patch -Np0 -i "${srcdir}/nouveau_gitupdate.diff" || return 1 + patch -Np1 -i "${srcdir}/intel_gitupdate.diff" || return 1 libtoolize --force || return 1 aclocal || return 1 autoconf || return 1 Added: intel_gitupdate.diff =================================================================== --- intel_gitupdate.diff (rev 0) +++ intel_gitupdate.diff 2010-02-11 08:19:14 UTC (rev 68164) @@ -0,0 +1,64 @@ +diff -u b/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c +--- b/intel/intel_bufmgr_gem.c ++++ b/intel/intel_bufmgr_gem.c +@@ -1423,18 +1423,15 @@ + + memset(&set_tiling, 0, sizeof(set_tiling)); + set_tiling.handle = bo_gem->gem_handle; +- set_tiling.tiling_mode = *tiling_mode; +- set_tiling.stride = stride; + + do { ++ set_tiling.tiling_mode = *tiling_mode; ++ set_tiling.stride = stride; ++ + ret = ioctl(bufmgr_gem->fd, + DRM_IOCTL_I915_GEM_SET_TILING, + &set_tiling); + } while (ret == -1 && errno == EINTR); +- if (ret != 0) { +- *tiling_mode = bo_gem->tiling_mode; +- return -errno; +- } + bo_gem->tiling_mode = set_tiling.tiling_mode; + bo_gem->swizzle_mode = set_tiling.swizzle_mode; + +@@ -1445,7 +1442,7 @@ + drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem); + + *tiling_mode = bo_gem->tiling_mode; +- return 0; ++ return ret == 0 ? 0 : -errno; + } + + static int +@@ -1727,6 +1724,9 @@ + unsigned long size; + + bufmgr_gem = calloc(1, sizeof(*bufmgr_gem)); ++ if (bufmgr_gem == NULL) ++ return NULL; ++ + bufmgr_gem->fd = fd; + + if (pthread_mutex_init(&bufmgr_gem->lock, NULL) != 0) { +@@ -1766,6 +1766,19 @@ + fprintf(stderr, "param: %d, val: %d\n", gp.param, + *gp.value); + bufmgr_gem->available_fences = 0; ++ } else { ++ /* XXX The kernel reports the total number of fences, ++ * including any that may be pinned. ++ * ++ * We presume that there will be at least one pinned ++ * fence for the scanout buffer, but there may be more ++ * than one scanout and the user may be manually ++ * pinning buffers. Let's move to execbuffer2 and ++ * thereby forget the insanity of using fences... ++ */ ++ bufmgr_gem->available_fences -= 2; ++ if (bufmgr_gem->available_fences < 0) ++ bufmgr_gem->available_fences = 0; + } + } +
