diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2011-02-18 17:59:15 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-02-23 10:32:57 +1000 |
commit | ae0cec2880a4dc6d90c7f8392bdc6705988389ca (patch) | |
tree | 02a36c6ff5eb3e9f0554d9b5134ab374929c61fb /include/drm/drm_mm.h | |
parent | b0b7af1884b7d807a3504804f9825d472de78708 (diff) | |
download | linux-next-ae0cec2880a4dc6d90c7f8392bdc6705988389ca.tar.gz |
drm: mm: add helper to unwind scan state
With the switch to implicit free space accounting one pointer
got unused when scanning. Use it to create a single-linked list
to ensure correct unwinding of the scan state.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'include/drm/drm_mm.h')
-rw-r--r-- | include/drm/drm_mm.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index 17a070e11d3c..b1e7809e5e15 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h @@ -72,6 +72,7 @@ struct drm_mm { unsigned scanned_blocks; unsigned long scan_start; unsigned long scan_end; + struct drm_mm_node *prev_scanned_node; }; static inline bool drm_mm_node_allocated(struct drm_mm_node *node) @@ -86,6 +87,13 @@ static inline bool drm_mm_initialized(struct drm_mm *mm) #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ &(mm)->head_node.node_list, \ node_list); +#define drm_mm_for_each_scanned_node_reverse(entry, n, mm) \ + for (entry = (mm)->prev_scanned_node, \ + next = entry ? list_entry(entry->node_list.next, \ + struct drm_mm_node, node_list) : NULL; \ + entry != NULL; entry = next, \ + next = entry ? list_entry(entry->node_list.next, \ + struct drm_mm_node, node_list) : NULL) \ /* * Basic range manager support (drm_mm.c) */ |