From cecddcc2ff148b9e5599e1cbe6a0d00469712ce0 Mon Sep 17 00:00:00 2001 From: Konrad Rzeszutek Wilk Date: Wed, 4 Jan 2012 16:35:15 -0500 Subject: [PATCH] --- yaml --- r: 282734 b: refs/heads/master c: 2c05114d23c4fd2256eaf5645528c19fcefdb2c8 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 0cf07fec7453..1b9e68fe6ff9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 36d7c537c3082a492ff851fb0da40ae3d7c5565d +refs/heads/master: 2c05114d23c4fd2256eaf5645528c19fcefdb2c8 diff --git a/trunk/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/trunk/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c index 6c06d0b601f9..156ddcd304c3 100644 --- a/trunk/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c +++ b/trunk/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c @@ -949,7 +949,7 @@ void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev) struct dma_page *d_page, *next; enum pool_type type; bool is_cached = false; - unsigned count = 0, i; + unsigned count = 0, i, npages = 0; unsigned long irq_flags; type = ttm_to_type(ttm->page_flags, ttm->caching_state); @@ -974,8 +974,13 @@ void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev) } else { pool->npages_free += count; list_splice(&ttm_dma->pages_list, &pool->free_list); + npages = count; if (pool->npages_free > _manager->options.max_size) { - count = pool->npages_free - _manager->options.max_size; + npages = pool->npages_free - _manager->options.max_size; + /* free at least NUM_PAGES_TO_ALLOC number of pages + * to reduce calls to set_memory_wb */ + if (npages < NUM_PAGES_TO_ALLOC) + npages = NUM_PAGES_TO_ALLOC; } } spin_unlock_irqrestore(&pool->lock, irq_flags); @@ -999,9 +1004,9 @@ void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev) ttm_dma->dma_address[i] = 0; } - /* shrink pool if necessary */ - if (count) - ttm_dma_page_pool_free(pool, count); + /* shrink pool if necessary (only on !is_cached pools)*/ + if (npages) + ttm_dma_page_pool_free(pool, npages); ttm->state = tt_unpopulated; } EXPORT_SYMBOL_GPL(ttm_dma_unpopulate);