mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-12 16:54:42 +08:00
drm/ttm: add NUMA node id to the pool
This allows backing ttm_tt structure with pages from different NUMA pools. Tested-by: Graham Sider <graham.sider@amd.com> Reviewed-by: Felix Kuehling <felix.kuehling@amd.com> Signed-off-by: Christian König <christian.koenig@amd.com> Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
c1d3f627ff
commit
4482d3c94d
@ -213,7 +213,7 @@ int ttm_device_init(struct ttm_device *bdev, struct ttm_device_funcs *funcs,
|
||||
bdev->funcs = funcs;
|
||||
|
||||
ttm_sys_man_init(bdev);
|
||||
ttm_pool_init(&bdev->pool, dev, use_dma_alloc, use_dma32);
|
||||
ttm_pool_init(&bdev->pool, dev, NUMA_NO_NODE, use_dma_alloc, use_dma32);
|
||||
|
||||
bdev->vma_manager = vma_manager;
|
||||
spin_lock_init(&bdev->lru_lock);
|
||||
|
@ -98,7 +98,7 @@ static struct page *ttm_pool_alloc_page(struct ttm_pool *pool, gfp_t gfp_flags,
|
||||
__GFP_KSWAPD_RECLAIM;
|
||||
|
||||
if (!pool->use_dma_alloc) {
|
||||
p = alloc_pages(gfp_flags, order);
|
||||
p = alloc_pages_node(pool->nid, gfp_flags, order);
|
||||
if (p)
|
||||
p->private = order;
|
||||
return p;
|
||||
@ -292,7 +292,7 @@ static struct ttm_pool_type *ttm_pool_select_type(struct ttm_pool *pool,
|
||||
enum ttm_caching caching,
|
||||
unsigned int order)
|
||||
{
|
||||
if (pool->use_dma_alloc)
|
||||
if (pool->use_dma_alloc || pool->nid != NUMA_NO_NODE)
|
||||
return &pool->caching[caching].orders[order];
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
@ -550,29 +550,32 @@ EXPORT_SYMBOL(ttm_pool_free);
|
||||
*
|
||||
* @pool: the pool to initialize
|
||||
* @dev: device for DMA allocations and mappings
|
||||
* @nid: NUMA node to use for allocations
|
||||
* @use_dma_alloc: true if coherent DMA alloc should be used
|
||||
* @use_dma32: true if GFP_DMA32 should be used
|
||||
*
|
||||
* Initialize the pool and its pool types.
|
||||
*/
|
||||
void ttm_pool_init(struct ttm_pool *pool, struct device *dev,
|
||||
bool use_dma_alloc, bool use_dma32)
|
||||
int nid, bool use_dma_alloc, bool use_dma32)
|
||||
{
|
||||
unsigned int i, j;
|
||||
|
||||
WARN_ON(!dev && use_dma_alloc);
|
||||
|
||||
pool->dev = dev;
|
||||
pool->nid = nid;
|
||||
pool->use_dma_alloc = use_dma_alloc;
|
||||
pool->use_dma32 = use_dma32;
|
||||
|
||||
if (use_dma_alloc) {
|
||||
if (use_dma_alloc || nid != NUMA_NO_NODE) {
|
||||
for (i = 0; i < TTM_NUM_CACHING_TYPES; ++i)
|
||||
for (j = 0; j < TTM_DIM_ORDER; ++j)
|
||||
ttm_pool_type_init(&pool->caching[i].orders[j],
|
||||
pool, i, j);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(ttm_pool_init);
|
||||
|
||||
/**
|
||||
* ttm_pool_fini - Cleanup a pool
|
||||
@ -586,7 +589,7 @@ void ttm_pool_fini(struct ttm_pool *pool)
|
||||
{
|
||||
unsigned int i, j;
|
||||
|
||||
if (pool->use_dma_alloc) {
|
||||
if (pool->use_dma_alloc || pool->nid != NUMA_NO_NODE) {
|
||||
for (i = 0; i < TTM_NUM_CACHING_TYPES; ++i)
|
||||
for (j = 0; j < TTM_DIM_ORDER; ++j)
|
||||
ttm_pool_type_fini(&pool->caching[i].orders[j]);
|
||||
|
@ -61,12 +61,14 @@ struct ttm_pool_type {
|
||||
* struct ttm_pool - Pool for all caching and orders
|
||||
*
|
||||
* @dev: the device we allocate pages for
|
||||
* @nid: which numa node to use
|
||||
* @use_dma_alloc: if coherent DMA allocations should be used
|
||||
* @use_dma32: if GFP_DMA32 should be used
|
||||
* @caching: pools for each caching/order
|
||||
*/
|
||||
struct ttm_pool {
|
||||
struct device *dev;
|
||||
int nid;
|
||||
|
||||
bool use_dma_alloc;
|
||||
bool use_dma32;
|
||||
@ -81,7 +83,7 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
|
||||
void ttm_pool_free(struct ttm_pool *pool, struct ttm_tt *tt);
|
||||
|
||||
void ttm_pool_init(struct ttm_pool *pool, struct device *dev,
|
||||
bool use_dma_alloc, bool use_dma32);
|
||||
int nid, bool use_dma_alloc, bool use_dma32);
|
||||
void ttm_pool_fini(struct ttm_pool *pool);
|
||||
|
||||
int ttm_pool_debugfs(struct ttm_pool *pool, struct seq_file *m);
|
||||
|
Loading…
Reference in New Issue
Block a user