linux/drivers/gpu/drm/i915
Chris Wilson 09cf7c9a12 drm/i915: Insert a flush between batches if the breadcrumb was dropped
If we drop the breadcrumb request after a batch due to a signal for
example we aim to fix it up at the next opportunity. In this case we
emit a second batchbuffer with no waits upon the first and so no
opportunity to insert the missing request, so we need to emit the
missing flush for coherency. (Note that that invalidating the render
cache is the same as flushing it, so there should have been no
observable corruption.)

Note that beside simply adding the missing flush, avoiding potential
render corruption, this will also fix at least parts of the problem
introduced by some funny interaction of these two commits:

commit de2b998552
Author: Daniel Vetter <daniel.vetter@ffwll.ch>
Date:   Wed Jul 4 22:52:50 2012 +0200

    drm/i915: don't return a spurious -EIO from intel_ring_begin

which allowed intel_ring_begin to return -ERESTARTSYS and

commit cc889e0f6c
Author: Daniel Vetter <daniel.vetter@ffwll.ch>
Date:   Wed Jun 13 20:45:19 2012 +0200

    drm/i915: disable flushing_list/gpu_write_list

which essentially disabled the flushing list.

The issue happens when we submit a batch & emit it, but get
interrupted (thanks to the first patch) while trying to emit the
flush. On the next batch we still assume that the full gpu domain
handling is in effect and hence compute the invalidate&flushing
domains. But thanks to the 2nd patch we totally ignore these and only
invalidate all gpu domains, presuming that any required flushes have
been issued already.  Which is wrong and eventually results in us
updating the new write_domain values with the computed
pending_write_domain values, which leaves an object with write_domain
== 0 on the gpu_write_list.

As soon as we try to unbind that object, things blow up.

Fix this by emitting the missing flush according to the new
ring->gpu_caches_dirty flag.

Note that this does _not_ fix all the current cases where we end up
with an object on the flushing_list that can't be flushed.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=52040
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
[danvet: Add bug explanation to commit message.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2012-07-20 12:21:40 +02:00
..
dvo_ch7xxx.c Drivers: i915: Fix all space related issues. 2011-09-19 18:01:47 -07:00
dvo_ch7017.c Drivers: i915: Fix all space related issues. 2011-09-19 18:01:47 -07:00
dvo_ivch.c Drivers: i915: Fix all space related issues. 2011-09-19 18:01:47 -07:00
dvo_sil164.c Drivers: i915: Fix all space related issues. 2011-09-19 18:01:47 -07:00
dvo_tfp410.c Drivers: i915: Fix all space related issues. 2011-09-19 18:01:47 -07:00
dvo.h drm: Make the .mode_fixup() operations mode argument a const pointer 2012-07-19 21:52:38 -04:00
i915_debugfs.c drm/i915: Add comments to explain the BSD tail write workaround 2012-07-20 12:21:37 +02:00
i915_dma.c drm/i915: get rid of dev_priv->info->has_pch_split 2012-07-05 09:56:05 +02:00
i915_drv.c drm: kill reclaim_buffers callback 2012-07-19 22:50:28 -04:00
i915_drv.h drm/i915: Add comments to explain the BSD tail write workaround 2012-07-20 12:21:37 +02:00
i915_gem_context.c drm/i915/context/: s/CTX/CXT 2012-07-20 12:21:35 +02:00
i915_gem_debug.c drm/i915: stop using dev->agp->base 2012-06-12 22:18:06 +02:00
i915_gem_dmabuf.c i915: add dma-buf vmap support for exporting vmapped buffer 2012-05-31 14:13:57 +01:00
i915_gem_evict.c drm: Add colouring to the range allocator 2012-07-16 05:59:37 +10:00
i915_gem_execbuffer.c drm/i915: Insert a flush between batches if the breadcrumb was dropped 2012-07-20 12:21:40 +02:00
i915_gem_gtt.c i915: add dmabuf/prime buffer sharing support. 2012-05-23 10:47:10 +01:00
i915_gem_stolen.c drm/i915: Split the stolen handling for GEM out of i915_dma.c 2012-05-03 11:18:11 +02:00
i915_gem_tiling.c drm/i915: Only the zap the VMA after updating the tiling parameters 2012-05-03 11:18:07 +02:00
i915_gem.c drm/i915: Disable the BLT on pre-production SNB hardware 2012-07-20 12:21:37 +02:00
i915_ioc32.c drm/i915: [sparse] trivial sparse fixes 2012-04-18 10:34:49 +02:00
i915_irq.c drm/i915: Add comments to explain the BSD tail write workaround 2012-07-20 12:21:37 +02:00
i915_reg.h drm/i915: fix up PCH backlight #define mixup 2012-07-20 12:21:38 +02:00
i915_suspend.c drm/i915: wrap up gt powersave enabling functions 2012-06-25 21:07:03 +02:00
i915_sysfs.c drm/i915: simplify sysfs setup code 2012-06-01 10:00:57 +02:00
i915_trace_points.c drm/i915: [sparse] trivial sparse fixes 2012-04-18 10:34:49 +02:00
i915_trace.h drm/i915: improve i915_wait_request_begin trace 2012-05-25 09:55:15 +02:00
intel_acpi.c drm/i915: [sparse] trivial sparse fixes 2012-04-18 10:34:49 +02:00
intel_bios.c drm/i915/bios: cleanup return type of intel_parse_bios() 2012-06-27 10:17:51 +01:00
intel_bios.h drm/i915/bios: cleanup return type of intel_parse_bios() 2012-06-27 10:17:51 +01:00
intel_crt.c drm/i915: check whether we actually received an edid in detect_ddc 2012-07-20 12:21:38 +02:00
intel_ddi.c drm/i915: program FDI_RX TP and FDI delays 2012-07-05 15:09:03 +02:00
intel_display.c drm/i915: initialize power wells in modeset_init_hw 2012-07-20 12:21:36 +02:00
intel_dp.c drm/i915: try to train DP even harder 2012-07-20 12:21:39 +02:00
intel_drv.h drm/i915: kill intel_ddc_probe 2012-07-20 12:21:39 +02:00
intel_dvo.c drm: Make the .mode_fixup() operations mode argument a const pointer 2012-07-19 21:52:38 -04:00
intel_fb.c drm/i915: Zero initialize mode_cmd 2012-07-05 13:27:58 +02:00
intel_hdmi.c drm: Make the .mode_fixup() operations mode argument a const pointer 2012-07-19 21:52:38 -04:00
intel_i2c.c drm/i915: be more careful when returning -ENXIO in gmbus transfer 2012-05-21 21:04:21 +02:00
intel_lvds.c drm: Make the .mode_fixup() operations mode argument a const pointer 2012-07-19 21:52:38 -04:00
intel_modes.c drm/i915: kill intel_ddc_probe 2012-07-20 12:21:39 +02:00
intel_opregion.c drm/i915: [sparse] __iomem fixes for opregion 2012-05-03 11:18:00 +02:00
intel_overlay.c drm/i915: s/i915_wait_request/i915_wait_seqno/g 2012-05-25 14:18:42 +02:00
intel_panel.c drm/i915: properly enable the blc controller on the right pipe 2012-06-12 19:27:58 +02:00
intel_pm.c drm/i915: initialize power wells in modeset_init_hw 2012-07-20 12:21:36 +02:00
intel_ringbuffer.c drm/i915: missing error case in init status page 2012-07-20 12:21:40 +02:00
intel_ringbuffer.h drm/i915: disable flushing_list/gpu_write_list 2012-06-20 13:54:28 +02:00
intel_sdvo_regs.h drm/i915: properly handle interlaced bit for sdvo dtd conversion 2012-05-24 17:53:52 +02:00
intel_sdvo.c drm: Make the .mode_fixup() operations mode argument a const pointer 2012-07-19 21:52:38 -04:00
intel_sprite.c drm/i915: mask tiled bit when updating ILK sprites 2012-07-20 12:21:40 +02:00
intel_tv.c drm: Make the .mode_fixup() operations mode argument a const pointer 2012-07-19 21:52:38 -04:00
Makefile drm/i915: preliminary context support 2012-06-14 17:36:16 +02:00