linux/drivers/gpu/drm
Chris Wilson d23db88c3a drm/i915: Prevent negative relocation deltas from wrapping
This is pure evil. Userspace, I'm looking at you SNA, repacks batch
buffers on the fly after generation as they are being passed to the
kernel for execution. These batches also contain self-referenced
relocations as a single buffer encompasses the state commands, kernels,
vertices and sampler. During generation the buffers are placed at known
offsets within the full batch, and then the relocation deltas (as passed
to the kernel) are tweaked as the batch is repacked into a smaller buffer.
This means that userspace is passing negative relocations deltas, which
subsequently wrap to large values if the batch is at a low address. The
GPU hangs when it then tries to use the large value as a base for its
address offsets, rather than wrapping back to the real value (as one
would hope). As the GPU uses positive offsets from the base, we can
treat the relocation address as the minimum address read by the GPU.
For the upper bound, we trust that userspace will not read beyond the
end of the buffer.

So, how do we fix negative relocations from wrapping? We can either
check that every relocation looks valid when we write it, and then
position each object such that we prevent the offset wraparound, or we
just special-case the self-referential behaviour of SNA and force all
batches to be above 256k. Daniel prefers the latter approach.

This fixes a GPU hang when it tries to use an address (relocation +
offset) greater than the GTT size. The issue would occur quite easily
with full-ppgtt as each fd gets its own VM space, so low offsets would
often be handed out. However, with the rearrangement of the low GTT due
to capturing the BIOS framebuffer, it is already affecting kernels 3.15
onwards. I think only IVB+ is susceptible to this bug, but the workaround
should only kick in rarely, so it seems sensible to always apply it.

v3: Use a bias for batch buffers to prevent small negative delta relocations
from wrapping.

v4 from Daniel:
- s/BIAS/BATCH_OFFSET_BIAS/
- Extract eb_vma_misplaced/i915_vma_misplaced since the conditions
  were growing rather cumbersome.
- Add a comment to eb_get_batch explaining why we do this.
- Apply the batch offset bias everywhere but mention that we've only
  observed it on gen7 gpus.
- Drop PIN_OFFSET_FIX for now, that slipped in from a feature patch.

v5: Add static to eb_get_batch, spotted by 0-day tester.

Testcase: igt/gem_bad_reloc
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=78533
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> (v3)
Cc: stable@vger.kernel.org
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2014-05-27 11:18:40 +03:00
..
armada DRM: armada: fix corruption while loading cursors 2014-04-08 10:51:03 +10:00
ast drm/ast: fix value check in cbr_scan2 2014-04-18 13:18:01 +10:00
bochs drm: bochs: drop unused struct fields 2014-04-18 13:31:50 +10:00
bridge drm/bridge: export ptn3460_init function 2014-04-04 21:24:50 +09:00
cirrus drm: cirrus: add power management support 2014-04-18 13:31:49 +10:00
exynos drm/exynos: use %pad for dma_addr_t 2014-04-30 09:48:54 +10:00
gma500 Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2014-04-08 09:52:16 -07:00
i2c drm/i2c: tda998x: always use the same device for all kernel messages 2014-02-14 20:11:12 +00:00
i810
i915 drm/i915: Prevent negative relocation deltas from wrapping 2014-05-27 11:18:40 +03:00
mga
mgag200 drm: Replace crtc fb with primary plane fb (v3) 2014-04-01 20:18:28 -04:00
msm drm/msm/mdp4: cure for the cursor blues (v2) 2014-04-25 08:58:23 -04:00
nouveau Merge branch 'drm-nouveau-next' of git://anongit.freedesktop.org/git/nouveau/linux-2.6 into drm-fixes 2014-05-22 09:14:50 +10:00
omapdrm drm/omap: fix the handling of fb ref counts 2014-04-15 16:40:01 +03:00
panel drm/panel: Changes for v3.15-rc1 2014-04-05 16:12:27 +10:00
qxl drm/ttm: Hide the implementation details of reservation 2014-04-04 08:00:59 +02:00
r128
radeon drm/radeon/pm: don't allow debugfs/sysfs access when PX card is off (v2) 2014-05-20 14:42:08 +02:00
rcar-du drm/rcar-du: Handle encoder initialization failures 2014-04-04 08:02:54 +10:00
savage
shmobile drm: Replace crtc fb with primary plane fb (v3) 2014-04-01 20:18:28 -04:00
sis
tdfx
tegra drm/tegra: Fixes for v3.15-rc3 2014-04-28 09:16:37 +10:00
tilcdc drm: Replace crtc fb with primary plane fb (v3) 2014-04-01 20:18:28 -04:00
ttm Merge tag 'ttm-next-2014-04-04' of git://people.freedesktop.org/~thomash/linux into drm-next 2014-04-05 16:07:39 +10:00
udl Merge tag 'drm-intel-fixes-2014-04-04' of git://anongit.freedesktop.org/drm-intel into drm-next 2014-04-05 16:14:21 +10:00
via
vmwgfx drm/vmwgfx: Make sure user-space can't DMA across buffer object boundaries v2 2014-04-24 08:45:25 +02:00
ati_pcigart.c
drm_agpsupport.c
drm_auth.c
drm_buffer.c
drm_bufs.c
drm_cache.c x86: Use clflushopt in drm_clflush_virt_range 2014-02-27 08:26:31 -08:00
drm_context.c
drm_crtc_helper.c drm: Split out drm_probe_helper.c from drm_crtc_helper.c 2014-04-18 13:21:17 +10:00
drm_crtc_internal.h drm: move drm_mode related functions into drm_modes.c 2014-03-13 12:48:40 +01:00
drm_crtc.c drm: Allow userspace to ask for universal plane list (v2) 2014-04-01 20:18:29 -04:00
drm_debugfs.c
drm_dma.c
drm_dp_helper.c drm/dp/i2c: Update comments about common i2c over dp assumptions (v3) 2014-04-08 16:12:39 +02:00
drm_drv.c drm: Add a function to get the ioctl flags 2014-03-28 14:19:02 +01:00
drm_edid_load.c
drm_edid.c Merge branch 'topic/core-stuff' of git://git.freedesktop.org/git/drm-intel into drm-next 2014-03-18 19:23:22 +10:00
drm_encoder_slave.c
drm_fb_cma_helper.c
drm_fb_helper.c drm: Prefer noninterlace cmdline mode unless explicitly specified 2014-04-04 10:07:03 +10:00
drm_flip_work.c
drm_fops.c Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2014-04-08 09:52:16 -07:00
drm_gem_cma_helper.c drm: gem-cma: Fix warnings due to improper printk formats 2014-04-04 10:13:48 +10:00
drm_gem.c Merge branch 'drm-docs' of ssh://people.freedesktop.org/~danvet/drm into drm-next 2014-03-18 19:09:10 +10:00
drm_global.c
drm_hashtab.c
drm_info.c
drm_ioc32.c
drm_ioctl.c drm: Allow userspace to ask for universal plane list (v2) 2014-04-01 20:18:29 -04:00
drm_irq.c
drm_lock.c
drm_memory.c
drm_mipi_dsi.c drm/mipi_dsi: create dsi devices only for nodes with reg property 2014-04-04 21:24:47 +09:00
drm_mm.c drm/mm: Don't WARN if drm_mm_reserve_node 2014-04-10 10:54:47 +03:00
drm_modes.c drm: polish function kerneldoc for drm_modes.[hc] 2014-03-13 12:48:44 +01:00
drm_panel.c
drm_pci.c Merge branch 'topic/core-stuff' of git://git.freedesktop.org/git/drm-intel into drm-next 2014-03-18 19:23:22 +10:00
drm_plane_helper.c drm/plane-helper: Don't fake-implement primary plane disabling 2014-04-18 13:18:50 +10:00
drm_platform.c drm: provide device-refcount 2014-03-16 12:25:17 +01:00
drm_prime.c Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2014-04-08 09:52:16 -07:00
drm_probe_helper.c drm: Split out drm_probe_helper.c from drm_crtc_helper.c 2014-04-18 13:21:17 +10:00
drm_rect.c
drm_scatter.c
drm_stub.c drm: Allow userspace to ask for universal plane list (v2) 2014-04-01 20:18:29 -04:00
drm_sysfs.c
drm_trace_points.c
drm_trace.h
drm_usb.c drm: provide device-refcount 2014-03-16 12:25:17 +01:00
drm_vm.c
drm_vma_manager.c
Kconfig drm/bridge: Add PTN3460 bridge driver 2014-03-24 00:36:37 +09:00
Makefile drm: Split out drm_probe_helper.c from drm_crtc_helper.c 2014-04-18 13:21:17 +10:00
README.drm

************************************************************
* For the very latest on DRI development, please see:      *
*     http://dri.freedesktop.org/                          *
************************************************************

The Direct Rendering Manager (drm) is a device-independent kernel-level
device driver that provides support for the XFree86 Direct Rendering
Infrastructure (DRI).

The DRM supports the Direct Rendering Infrastructure (DRI) in four major
ways:

    1. The DRM provides synchronized access to the graphics hardware via
       the use of an optimized two-tiered lock.

    2. The DRM enforces the DRI security policy for access to the graphics
       hardware by only allowing authenticated X11 clients access to
       restricted regions of memory.

    3. The DRM provides a generic DMA engine, complete with multiple
       queues and the ability to detect the need for an OpenGL context
       switch.

    4. The DRM is extensible via the use of small device-specific modules
       that rely extensively on the API exported by the DRM module.


Documentation on the DRI is available from:
    http://dri.freedesktop.org/wiki/Documentation
    http://sourceforge.net/project/showfiles.php?group_id=387
    http://dri.sourceforge.net/doc/

For specific information about kernel-level support, see:

    The Direct Rendering Manager, Kernel Support for the Direct Rendering
    Infrastructure
    http://dri.sourceforge.net/doc/drm_low_level.html

    Hardware Locking for the Direct Rendering Infrastructure
    http://dri.sourceforge.net/doc/hardware_locking_low_level.html

    A Security Analysis of the Direct Rendering Infrastructure
    http://dri.sourceforge.net/doc/security_low_level.html