Files
linux/Documentation
David Herrmann fe3078fa5c drm: add unified vma offset manager
If we want to map GPU memory into user-space, we need to linearize the
addresses to not confuse mm-core. Currently, GEM and TTM both implement
their own offset-managers to assign a pgoff to each object for user-space
CPU access. GEM uses a hash-table, TTM uses an rbtree.

This patch provides a unified implementation that can be used to replace
both. TTM allows partial mmaps with a given offset, so we cannot use
hashtables as the start address may not be known at mmap time. Hence, we
use the rbtree-implementation of TTM.

We could easily update drm_mm to use an rbtree instead of a linked list
for it's object list and thus drop the rbtree from the vma-manager.
However, this would slow down drm_mm object allocation for all other
use-cases (rbtree insertion) and add another 4-8 bytes to each mm node.
Hence, use the separate tree but allow for later migration.

This is a rewrite of the 2012-proposal by David Airlie <airlied@linux.ie>

v2:
 - fix Docbook integration
 - drop drm_mm_node_linked() and use drm_mm_node_allocated()
 - remove unjustified likely/unlikely usage (but keep for rbtree paths)
 - remove BUG_ON() as drm_mm already does that
 - clarify page-based vs. byte-based addresses
 - use drm_vma_node_reset() for initialization, too
v4:
 - allow external locking via drm_vma_offset_un/lock_lookup()
 - add locked lookup helper drm_vma_offset_lookup_locked()
v5:
 - fix drm_vma_offset_lookup() to correctly validate range-mismatches
   (fix (offset > start + pages))
 - fix drm_vma_offset_exact_lookup() to actually do what it says
 - remove redundant vm_pages member (add drm_vma_node_size() helper)
 - remove unneeded goto
 - fix documentation

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Dave Airlie <airlied@gmail.com>
2013-07-25 20:47:04 +10:00
..
2011-09-27 18:08:04 +02:00
2012-04-03 13:09:18 +02:00
2011-09-27 18:08:04 +02:00
2012-12-14 08:48:59 +01:00
2013-04-02 09:39:55 -07:00
2011-03-31 11:26:23 -03:00
2013-01-10 01:27:46 +01:00
2013-06-28 13:01:40 +02:00
2013-07-03 16:08:05 -07:00
2013-06-03 14:31:39 -07:00
2013-07-10 18:11:34 -07:00
2013-06-18 15:41:03 -07:00
2013-06-10 23:54:14 +02:00
2011-03-31 11:26:23 -03:00
2013-07-03 16:08:03 -07:00
2012-07-29 21:11:05 -03:00
2013-04-16 18:47:19 +09:00
2012-12-05 23:52:10 +00:00
2011-03-31 11:26:23 -03:00
2011-09-27 18:08:04 +02:00
2013-02-19 08:42:37 +01:00
2012-02-28 16:05:06 +01:00
2013-06-21 11:32:51 +02:00
2011-09-27 18:08:04 +02:00
2011-03-31 11:26:23 -03:00
2012-01-02 13:04:55 +01:00