Skip to content

Commit ae80122

Browse files
committed
drm/ttm: use gpu mm stats to track gpu memory allocations. (v4)
This uses the newly introduced per-node gpu tracking stats, to track GPU memory allocated via TTM and reclaimable memory in the TTM page pools. These stats will be useful later for system information and later when mem cgroups are integrated. Cc: Christian Koenig <christian.koenig@amd.com> Cc: Matthew Brost <matthew.brost@intel.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: linux-mm@kvack.org Cc: Andrew Morton <akpm@linux-foundation.org> Acked-by: Christian König <christian.koenig@amd.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
1 parent 2232ba9 commit ae80122

1 file changed

Lines changed: 15 additions & 6 deletions

File tree

drivers/gpu/drm/ttm/ttm_pool.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,10 @@ static struct page *ttm_pool_alloc_page(struct ttm_pool *pool, gfp_t gfp_flags,
159159

160160
if (!ttm_pool_uses_dma_alloc(pool)) {
161161
p = alloc_pages_node(pool->nid, gfp_flags, order);
162-
if (p)
162+
if (p) {
163163
p->private = order;
164+
mod_lruvec_page_state(p, NR_GPU_ACTIVE, 1 << order);
165+
}
164166
return p;
165167
}
166168

@@ -195,7 +197,7 @@ static struct page *ttm_pool_alloc_page(struct ttm_pool *pool, gfp_t gfp_flags,
195197

196198
/* Reset the caching and pages of size 1 << order */
197199
static void ttm_pool_free_page(struct ttm_pool *pool, enum ttm_caching caching,
198-
unsigned int order, struct page *p)
200+
unsigned int order, struct page *p, bool reclaim)
199201
{
200202
unsigned long attr = DMA_ATTR_FORCE_CONTIGUOUS;
201203
struct ttm_pool_dma *dma;
@@ -210,6 +212,8 @@ static void ttm_pool_free_page(struct ttm_pool *pool, enum ttm_caching caching,
210212
#endif
211213

212214
if (!pool || !ttm_pool_uses_dma_alloc(pool)) {
215+
mod_lruvec_page_state(p, reclaim ? NR_GPU_RECLAIM : NR_GPU_ACTIVE,
216+
-(1 << order));
213217
__free_pages(p, order);
214218
return;
215219
}
@@ -297,6 +301,9 @@ static void ttm_pool_type_give(struct ttm_pool_type *pt, struct page *p)
297301
list_add(&p->lru, &pt->pages);
298302
spin_unlock(&pt->lock);
299303
atomic_long_add(1 << pt->order, &allocated_pages);
304+
305+
mod_lruvec_page_state(p, NR_GPU_ACTIVE, -num_pages);
306+
mod_lruvec_page_state(p, NR_GPU_RECLAIM, num_pages);
300307
}
301308

302309
/* Take pages from a specific pool_type, return NULL when nothing available */
@@ -308,6 +315,8 @@ static struct page *ttm_pool_type_take(struct ttm_pool_type *pt)
308315
p = list_first_entry_or_null(&pt->pages, typeof(*p), lru);
309316
if (p) {
310317
atomic_long_sub(1 << pt->order, &allocated_pages);
318+
mod_lruvec_page_state(p, NR_GPU_ACTIVE, (1 << pt->order));
319+
mod_lruvec_page_state(p, NR_GPU_RECLAIM, -(1 << pt->order));
311320
list_del(&p->lru);
312321
}
313322
spin_unlock(&pt->lock);
@@ -340,7 +349,7 @@ static void ttm_pool_type_fini(struct ttm_pool_type *pt)
340349
spin_unlock(&shrinker_lock);
341350

342351
while ((p = ttm_pool_type_take(pt)))
343-
ttm_pool_free_page(pt->pool, pt->caching, pt->order, p);
352+
ttm_pool_free_page(pt->pool, pt->caching, pt->order, p, true);
344353
}
345354

346355
/* Return the pool_type to use for the given caching and order */
@@ -392,7 +401,7 @@ static unsigned int ttm_pool_shrink(void)
392401

393402
p = ttm_pool_type_take(pt);
394403
if (p) {
395-
ttm_pool_free_page(pt->pool, pt->caching, pt->order, p);
404+
ttm_pool_free_page(pt->pool, pt->caching, pt->order, p, true);
396405
num_pages = 1 << pt->order;
397406
} else {
398407
num_pages = 0;
@@ -484,7 +493,7 @@ static pgoff_t ttm_pool_unmap_and_free(struct ttm_pool *pool, struct page *page,
484493
if (pt)
485494
ttm_pool_type_give(pt, page);
486495
else
487-
ttm_pool_free_page(pool, caching, order, page);
496+
ttm_pool_free_page(pool, caching, order, page, false);
488497

489498
return nr;
490499
}
@@ -792,7 +801,7 @@ static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
792801
return 0;
793802

794803
error_free_page:
795-
ttm_pool_free_page(pool, page_caching, order, p);
804+
ttm_pool_free_page(pool, page_caching, order, p, false);
796805

797806
error_free_all:
798807
if (tt->restore)

0 commit comments

Comments
 (0)