diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2010-07-02 10:02:16 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-07-06 22:29:51 -0400 |
commit | 709ea97145c125b3811ff70429e90ebdb0e832e5 (patch) | |
tree | 222c5cafcae50f06e0e2c2591ab09f3bd1e89827 /include/drm | |
parent | 7a6b2896f261894dde287d3faefa4b432cddca53 (diff) |
drm: implement helper functions for scanning lru list
These helper functions can be used to efficiently scan lru list
for eviction. Eviction becomes a three stage process:
1. Scanning through the lru list until a suitable hole has been found.
2. Scan backwards to restore drm_mm consistency and find out which
objects fall into the hole.
3. Evict the objects that fall into the hole.
These helper functions don't allocate any memory (at the price of
not allowing any other concurrent operations). Hence this can also be
used for ttm (which does lru scanning under a spinlock).
Evicting objects in this fashion should be more fair than the current
approach by i915 (scan the lru for a object large enough to contain
the new object). It's also more efficient than the current approach used
by ttm (uncoditionally evict objects from the lru until there's enough
free space).
Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Acked-by: Thomas Hellstrom <thellstrom@vmwgfx.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'include/drm')
-rw-r--r-- | include/drm/drm_mm.h | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index e8740cc185cf..bf01531193d5 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h | |||
@@ -44,7 +44,10 @@ | |||
44 | struct drm_mm_node { | 44 | struct drm_mm_node { |
45 | struct list_head free_stack; | 45 | struct list_head free_stack; |
46 | struct list_head node_list; | 46 | struct list_head node_list; |
47 | int free; | 47 | unsigned free : 1; |
48 | unsigned scanned_block : 1; | ||
49 | unsigned scanned_prev_free : 1; | ||
50 | unsigned scanned_next_free : 1; | ||
48 | unsigned long start; | 51 | unsigned long start; |
49 | unsigned long size; | 52 | unsigned long size; |
50 | struct drm_mm *mm; | 53 | struct drm_mm *mm; |
@@ -59,6 +62,11 @@ struct drm_mm { | |||
59 | struct list_head unused_nodes; | 62 | struct list_head unused_nodes; |
60 | int num_unused; | 63 | int num_unused; |
61 | spinlock_t unused_lock; | 64 | spinlock_t unused_lock; |
65 | unsigned scan_alignment; | ||
66 | unsigned long scan_size; | ||
67 | unsigned long scan_hit_start; | ||
68 | unsigned scan_hit_size; | ||
69 | unsigned scanned_blocks; | ||
62 | }; | 70 | }; |
63 | 71 | ||
64 | /* | 72 | /* |
@@ -135,6 +143,11 @@ static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) | |||
135 | return block->mm; | 143 | return block->mm; |
136 | } | 144 | } |
137 | 145 | ||
146 | void drm_mm_init_scan(struct drm_mm *mm, unsigned long size, | ||
147 | unsigned alignment); | ||
148 | int drm_mm_scan_add_block(struct drm_mm_node *node); | ||
149 | int drm_mm_scan_remove_block(struct drm_mm_node *node); | ||
150 | |||
138 | extern void drm_mm_debug_table(struct drm_mm *mm, const char *prefix); | 151 | extern void drm_mm_debug_table(struct drm_mm *mm, const char *prefix); |
139 | #ifdef CONFIG_DEBUG_FS | 152 | #ifdef CONFIG_DEBUG_FS |
140 | int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm); | 153 | int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm); |