linux/drivers/gpu/drm
Daniel Vetter 01ce605a7b drm/prime: remove cargo-cult locking from map_sg helper
I've checked both implementations (radeon/nouveau) and they both grab
the page array from ttm simply by dereferencing it and then wrapping
it up with drm_prime_pages_to_sg in the callback and map it with
dma_map_sg (in the helper).

Only the grabbing of the underlying page array is anything we need to
be concerned about, and either those pages are pinned independently,
or we're screwed no matter what.

And indeed, nouveau/radeon pin the backing storage in their
attach/detach functions.

Since I've created this patch cma prime support for dma_buf was added.
drm_gem_cma_prime_get_sg_table only calls kzalloc and the creates&maps
the sg table with dma_get_sgtable. It doesn't touch any gem object
state otherwise. So the cma helpers also look safe.

The only thing we might claim it does is prevent concurrent mapping of
dma_buf attachments. But a) that's not allowed and b) the current code
is racy already since it checks whether the sg mapping exists _before_
grabbing the lock.

So the dev->struct_mutex locking here does absolutely nothing useful,
but only distracts. Remove it.

This should also help Maarten's work to eventually pin the backing
storage more dynamically by preventing locking inversions around
dev->struct_mutex.

v2: Add analysis for recently added cma helper prime code.

Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2013-08-19 10:46:16 +10:00
..
ast drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
cirrus drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
exynos drm/exynos: explicit store base gem object in dma_buf->priv 2013-08-19 10:45:38 +10:00
gma500 drm/gma500: use gem get/put page helpers 2013-08-19 10:36:08 +10:00
i2c drm/i2c: tda998x: prepare for broken sync workaround 2013-08-19 09:10:48 +10:00
i810 drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
i915 drm: use common drm_gem_dmabuf_release in i915/exynos drivers 2013-08-19 10:44:58 +10:00
mga drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
mgag200 drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
nouveau drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
omapdrm drm/omap: kill omap_gem_helpers.c 2013-08-19 10:36:16 +10:00
qxl drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
r128 drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
radeon drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
rcar-du drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
savage drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
shmobile drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
sis drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
tdfx drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
tilcdc drm/tilcdc: use flip-work helper 2013-08-19 10:33:36 +10:00
ttm drm/ttm: kill unused functions 2013-08-19 09:36:12 +10:00
udl drm/udl: use gem get/put page helpers 2013-08-19 10:36:12 +10:00
via drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
vmwgfx drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
ati_pcigart.c
drm_agpsupport.c drm/agp: move AGP cleanup paths to drm_agpsupport.c 2013-08-07 10:14:24 +10:00
drm_auth.c
drm_buffer.c
drm_bufs.c drm: rip out DRIVER_FB_DMA and related code 2013-08-19 10:05:19 +10:00
drm_cache.c lib/scatterlist: sg_page_iter: support sg lists w/o backing pages 2013-03-27 17:13:44 +01:00
drm_context.c drm: mark context support as a legacy subsystem 2013-08-19 10:04:48 +10:00
drm_crtc_helper.c drm/crtc-helper: explicit DPMS on after modeset 2013-07-22 09:55:17 +10:00
drm_crtc.c drm: use ida to allocate connector ids 2013-08-19 10:40:31 +10:00
drm_debugfs.c
drm_dma.c drm: mark dma setup/teardown as legacy systems 2013-08-19 10:04:21 +10:00
drm_dp_helper.c
drm_drv.c drm: use ida to allocate connector ids 2013-08-19 10:40:31 +10:00
drm_edid_load.c drm: avoid warning in drm_load_edid_firmware() 2013-07-10 14:21:46 -07:00
drm_edid.c drm: add assertion for checking null edid to drm_edid_block_valid 2013-07-04 10:52:50 +10:00
drm_encoder_slave.c drm: refactor call to request_module 2013-05-10 14:46:03 +10:00
drm_fb_cma_helper.c treewide: Fix typo in printk 2013-05-28 12:02:13 +02:00
drm_fb_helper.c drm/fb-helper: Make load_lut and gamma_set/gamma_get hooks optional 2013-06-17 19:42:47 +10:00
drm_flip_work.c drm: add flip-work helper 2013-08-19 10:32:26 +10:00
drm_fops.c drm: remove FASYNC support 2013-08-19 10:05:17 +10:00
drm_gem_cma_helper.c drm/gem: create drm_gem_dumb_destroy 2013-08-07 09:59:24 +10:00
drm_gem.c drm/gem: add shmem get/put page helpers 2013-08-19 10:36:04 +10:00
drm_global.c
drm_hashtab.c hlist: drop the node parameter from iterators 2013-02-27 19:10:24 -08:00
drm_info.c
drm_ioc32.c
drm_ioctl.c drm: no-op out GET_STATS ioctl 2013-08-19 10:06:24 +10:00
drm_irq.c drm: fix a use-after-free when GPU acceleration disabled 2013-06-03 19:12:04 +10:00
drm_lock.c
drm_memory.c drm/memory: don't export agp helpers 2013-08-19 10:05:53 +10:00
drm_mm.c drm/mm: remove unused API 2013-08-07 10:16:50 +10:00
drm_modes.c drm: Remove drm_mode_validate_clocks 2013-08-19 10:30:11 +10:00
drm_pci.c drm/agp: move AGP cleanup paths to drm_agpsupport.c 2013-08-07 10:14:24 +10:00
drm_platform.c
drm_prime.c drm/prime: remove cargo-cult locking from map_sg helper 2013-08-19 10:46:16 +10:00
drm_proc.c drm: proc: Use remove_proc_subtree() 2013-05-01 17:29:44 -04:00
drm_rect.c drm: Add drm_rect_debug_print() 2013-04-30 22:20:00 +02:00
drm_scatter.c drm: disallow legacy sg ioctls for modesetting drivers 2013-08-19 10:04:06 +10:00
drm_stub.c drm: mark context support as a legacy subsystem 2013-08-19 10:04:48 +10:00
drm_sysfs.c drm: Convert drm class driver from legacy pm ops to dev_pm_ops 2013-07-04 10:50:26 +10:00
drm_trace_points.c
drm_trace.h drm: fix print format of sequence in trace point 2013-07-04 10:55:27 +10:00
drm_usb.c drm/usb: bind driver to correct device 2013-02-07 12:37:41 +10:00
drm_vm.c drm: io_remap_pfn_range() sets VM_IO... 2013-06-29 12:46:39 +04:00
drm_vma_manager.c drm/mm: add "best_match" flag to drm_mm_insert_node() 2013-08-07 10:08:58 +10:00
Kconfig drm: DRM should depend on HAS_DMA 2013-08-19 09:09:10 +10:00
Makefile drm: add flip-work helper 2013-08-19 10:32:26 +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