diff --git a/drm-invalidate-relocation-presumed_offsets-along-slow-patch.patch b/drm-invalidate-relocation-presumed_offsets-along-slow-patch.patch new file mode 100644 index 000000000..be557dc9d --- /dev/null +++ b/drm-invalidate-relocation-presumed_offsets-along-slow-patch.patch @@ -0,0 +1,67 @@ +commit 262b6d363fcff16359c93bd58c297f961f6e6273 +Author: Chris Wilson +Date: Tue Jan 15 16:17:54 2013 +0000 + + drm/i915: Invalidate the relocation presumed_offsets along the slow path + + In the slow path, we are forced to copy the relocations prior to + acquiring the struct mutex in order to handle pagefaults. We forgo + copying the new offsets back into the relocation entries in order to + prevent a recursive locking bug should we trigger a pagefault whilst + holding the mutex for the reservations of the execbuffer. Therefore, we + need to reset the presumed_offsets just in case the objects are rebound + back into their old locations after relocating for this exexbuffer - if + that were to happen we would assume the relocations were valid and leave + the actual pointers to the kernels dangling, instant hang. + + Fixes regression from commit bcf50e2775bbc3101932d8e4ab8c7902aa4163b4 + Author: Chris Wilson + Date: Sun Nov 21 22:07:12 2010 +0000 + + drm/i915: Handle pagefaults in execbuffer user relocations + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=55984 + Signed-off-by: Chris Wilson + Cc: Daniel Vetter + Cc: stable@vger.kernel.org + Signed-off-by: Daniel Vetter + +diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c +index d6a994a..26d08bb 100644 +--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c ++++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c +@@ -539,6 +539,8 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev, + total = 0; + for (i = 0; i < count; i++) { + struct drm_i915_gem_relocation_entry __user *user_relocs; ++ u64 invalid_offset = (u64)-1; ++ int j; + + user_relocs = (void __user *)(uintptr_t)exec[i].relocs_ptr; + +@@ -549,6 +551,25 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev, + goto err; + } + ++ /* As we do not update the known relocation offsets after ++ * relocating (due to the complexities in lock handling), ++ * we need to mark them as invalid now so that we force the ++ * relocation processing next time. Just in case the target ++ * object is evicted and then rebound into its old ++ * presumed_offset before the next execbuffer - if that ++ * happened we would make the mistake of assuming that the ++ * relocations were valid. ++ */ ++ for (j = 0; j < exec[i].relocation_count; j++) { ++ if (copy_to_user(&user_relocs[j].presumed_offset, ++ &invalid_offset, ++ sizeof(invalid_offset))) { ++ ret = -EFAULT; ++ mutex_lock(&dev->struct_mutex); ++ goto err; ++ } ++ } ++ + reloc_offset[i] = total; + total += exec[i].relocation_count; + } diff --git a/kernel.spec b/kernel.spec index 978579b98..638621485 100644 --- a/kernel.spec +++ b/kernel.spec @@ -54,7 +54,7 @@ Summary: The Linux kernel # For non-released -rc kernels, this will be appended after the rcX and # gitX tags, so a 3 here would become part of release "0.rcX.gitX.3" # -%global baserelease 102 +%global baserelease 103 %global fedora_build %{baserelease} # base_sublevel is the kernel version we're starting with and patching @@ -749,6 +749,9 @@ Patch21241: iwlegacy-fix-IBSS-cleanup.patch #rhbz 902523 Patch21236: libata-replace-sata_settings-with-devslp_timing.patch +#i915 hang fixes +Patch21237: drm-invalidate-relocation-presumed_offsets-along-slow-patch.patch + # END OF PATCH DEFINITIONS %endif @@ -1445,6 +1448,9 @@ ApplyPatch iwlegacy-fix-IBSS-cleanup.patch #rhbz 902523 ApplyPatch libata-replace-sata_settings-with-devslp_timing.patch +#i915 +ApplyPatch drm-invalidate-relocation-presumed_offsets-along-slow-patch.patch + # END OF PATCH APPLICATIONS %endif @@ -2293,6 +2299,9 @@ fi # '-' | | # '-' %changelog +* Tue Jan 22 2013 Justin M. Forbes +- Add i915 bugfix from airlied + * Tue Jan 22 2013 Josh Boyer - Fix libata settings bug (rhbz 902523)