linux/drivers/gpu/drm
Roland Dreier a35f2e2b83 drm/i915: Fix potential AB-BA deadlock in i915_gem_execbuffer()
Lockdep warns that i915_gem_execbuffer() can trigger a page fault (which
takes mmap_sem) while holding dev->struct_mutex, while drm_vm_open()
(which is called with mmap_sem already held) takes dev->struct_mutex.
So this is a potential AB-BA deadlock.

The way that i915_gem_execbuffer() triggers a page fault is by doing
copy_to_user() when returning new buffer offsets back to userspace;
however there is no reason to hold the struct_mutex when doing this
copy, since what is being copied is the contents of an array private to
i915_gem_execbuffer() anyway.  So we can fix the potential deadlock (and
get rid of the lockdep warning) by simply moving the copy_to_user()
outside of where struct_mutex is held.

This fixes <http://bugzilla.kernel.org/show_bug.cgi?id=12491>.

Reported-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@linux.ie>
2009-02-20 12:21:10 +10:00
..
i810 drm: reorganise drm tree to be more future proof. 2008-07-14 10:45:01 +10:00
i830 drm: reorganise drm tree to be more future proof. 2008-07-14 10:45:01 +10:00
i915 drm/i915: Fix potential AB-BA deadlock in i915_gem_execbuffer() 2009-02-20 12:21:10 +10:00
mga drm: move drm vblank initialization/cleanup to driver load/unload 2008-11-25 09:49:03 +10:00
r128 drm: move drm vblank initialization/cleanup to driver load/unload 2008-11-25 09:49:03 +10:00
radeon drm/radeon: fix ioremap conflict with AGP mappings 2009-02-08 21:37:24 +10:00
savage drm: reorganise drm tree to be more future proof. 2008-07-14 10:45:01 +10:00
sis SiS DRM: fix a pointer cast warning 2008-10-18 07:10:10 +10:00
tdfx drm: reorganise drm tree to be more future proof. 2008-07-14 10:45:01 +10:00
via drm: move drm vblank initialization/cleanup to driver load/unload 2008-11-25 09:49:03 +10:00
ati_pcigart.c drm: reorganise drm tree to be more future proof. 2008-07-14 10:45:01 +10:00
drm_agpsupport.c drm: stash AGP include under the do-we-have-AGP ifdef 2009-01-22 22:27:11 +10:00
drm_auth.c drm: move to kref per-master structures. 2008-12-29 17:47:22 +10:00
drm_bufs.c drm/radeon: use locked rmmap to remove sarea mapping. 2008-12-29 17:47:24 +10:00
drm_cache.c drm: wbinvd is cache coherent. 2008-10-18 07:10:53 +10:00
drm_context.c drm: move to kref per-master structures. 2008-12-29 17:47:22 +10:00
drm_crtc_helper.c drm: handle depth & bpp changes correctly 2009-01-16 18:40:57 +10:00
drm_crtc.c drm: create mode_config idr lock 2009-01-22 17:53:05 +10:00
drm_dma.c drm: reorganise drm tree to be more future proof. 2008-07-14 10:45:01 +10:00
drm_drawable.c drm: Avoid oops in DRM_IOCTL_RM_DRAW if a bad handle is supplied. 2008-10-23 13:46:54 +10:00
drm_drv.c drm: fix leak of device mappings since multi-master changes. 2009-01-19 17:17:58 +10:00
drm_edid.c drm: don't whine about not reading EDID data 2009-01-22 22:23:53 +10:00
drm_fops.c Check fops_get() return value 2009-01-06 15:59:11 -08:00
drm_gem.c drm: Free the object ref on error. 2009-02-20 12:21:08 +10:00
drm_hashtab.c drm: GEM mmap support 2008-12-29 17:47:22 +10:00
drm_ioc32.c drm: Add 32-bit compatibility for DRM_IOCTL_UPDATE_DRAW. 2008-10-23 13:46:33 +10:00
drm_ioctl.c drm: fix leak of uninitialized data to userspace 2008-12-29 17:47:22 +10:00
drm_irq.c drm/i915: capture last_vblank count at IRQ uninstall time too 2009-02-08 21:40:51 +10:00
drm_lock.c drm: move to kref per-master structures. 2008-12-29 17:47:22 +10:00
drm_memory.c drm/radeon: fix ioremap conflict with AGP mappings 2009-02-08 21:37:24 +10:00
drm_mm.c DRM: add mode setting support 2008-12-29 17:47:23 +10:00
drm_modes.c DRM: add mode setting support 2008-12-29 17:47:23 +10:00
drm_pci.c drm: reorganise drm tree to be more future proof. 2008-07-14 10:45:01 +10:00
drm_proc.c drm: Add a debug node for vblank state. 2008-12-29 17:47:27 +10:00
drm_scatter.c drm: reorganise drm tree to be more future proof. 2008-07-14 10:45:01 +10:00
drm_sman.c drm: reorganise drm tree to be more future proof. 2008-07-14 10:45:01 +10:00
drm_stub.c drm: fix leak of device mappings since multi-master changes. 2009-01-19 17:17:58 +10:00
drm_sysfs.c gpu: struct device - replace bus_id with dev_name(), dev_set_name() 2009-01-06 10:44:41 -08:00
drm_vm.c drm: GEM mmap support 2008-12-29 17:47:22 +10:00
Kconfig fbdev/drm: fix Kconfig submenu mess in "Graphics support" 2009-02-18 15:37:56 -08:00
Makefile DRM: add mode setting support 2008-12-29 17:47:23 +10:00
README.drm drm: reorganise drm tree to be more future proof. 2008-07-14 10:45:01 +10:00

************************************************************
* 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