diff options
author | Marek Olšák <marek.olsak@amd.com> | 2014-03-01 18:56:20 -0500 |
---|---|---|
committer | Christian König <christian.koenig@amd.com> | 2014-03-03 04:57:15 -0500 |
commit | 4330441a745ea0f1fd881438a0bbdfedda65f74a (patch) | |
tree | 2fe7d08151dbdf36ebe838c858f4f469f4d7df3f | |
parent | 0bc490a8d9e0f2f54ec8f9d09a367db66605ff40 (diff) |
drm/radeon: add buffers to the LRU list from smallest to largest
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_cs.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index f28a8d82fa19..d49a3f705e49 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
@@ -24,6 +24,7 @@ | |||
24 | * Authors: | 24 | * Authors: |
25 | * Jerome Glisse <glisse@freedesktop.org> | 25 | * Jerome Glisse <glisse@freedesktop.org> |
26 | */ | 26 | */ |
27 | #include <linux/list_sort.h> | ||
27 | #include <drm/drmP.h> | 28 | #include <drm/drmP.h> |
28 | #include <drm/radeon_drm.h> | 29 | #include <drm/radeon_drm.h> |
29 | #include "radeon_reg.h" | 30 | #include "radeon_reg.h" |
@@ -290,6 +291,16 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | |||
290 | return 0; | 291 | return 0; |
291 | } | 292 | } |
292 | 293 | ||
294 | static int cmp_size_smaller_first(void *priv, struct list_head *a, | ||
295 | struct list_head *b) | ||
296 | { | ||
297 | struct radeon_bo_list *la = list_entry(a, struct radeon_bo_list, tv.head); | ||
298 | struct radeon_bo_list *lb = list_entry(b, struct radeon_bo_list, tv.head); | ||
299 | |||
300 | /* Sort A before B if A is smaller. */ | ||
301 | return (int)la->bo->tbo.num_pages - (int)lb->bo->tbo.num_pages; | ||
302 | } | ||
303 | |||
293 | /** | 304 | /** |
294 | * cs_parser_fini() - clean parser states | 305 | * cs_parser_fini() - clean parser states |
295 | * @parser: parser structure holding parsing context. | 306 | * @parser: parser structure holding parsing context. |
@@ -303,6 +314,18 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo | |||
303 | unsigned i; | 314 | unsigned i; |
304 | 315 | ||
305 | if (!error) { | 316 | if (!error) { |
317 | /* Sort the buffer list from the smallest to largest buffer, | ||
318 | * which affects the order of buffers in the LRU list. | ||
319 | * This assures that the smallest buffers are added first | ||
320 | * to the LRU list, so they are likely to be later evicted | ||
321 | * first, instead of large buffers whose eviction is more | ||
322 | * expensive. | ||
323 | * | ||
324 | * This slightly lowers the number of bytes moved by TTM | ||
325 | * per frame under memory pressure. | ||
326 | */ | ||
327 | list_sort(NULL, &parser->validated, cmp_size_smaller_first); | ||
328 | |||
306 | ttm_eu_fence_buffer_objects(&parser->ticket, | 329 | ttm_eu_fence_buffer_objects(&parser->ticket, |
307 | &parser->validated, | 330 | &parser->validated, |
308 | parser->ib.fence); | 331 | parser->ib.fence); |