mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
drm/ttm: implement LRU add callbacks v2
This allows fine grained control for the driver where to add a BO into the LRU. v2: fix typo in comment Reviewed-by: Sinclair Yeh <syeh@vmware.com> Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
c3ea576e05
commit
98c2872ae9
12 changed files with 49 additions and 9 deletions
|
@ -922,6 +922,8 @@ static struct ttm_bo_driver amdgpu_bo_driver = {
|
||||||
.fault_reserve_notify = &amdgpu_bo_fault_reserve_notify,
|
.fault_reserve_notify = &amdgpu_bo_fault_reserve_notify,
|
||||||
.io_mem_reserve = &amdgpu_ttm_io_mem_reserve,
|
.io_mem_reserve = &amdgpu_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &amdgpu_ttm_io_mem_free,
|
.io_mem_free = &amdgpu_ttm_io_mem_free,
|
||||||
|
.lru_tail = &ttm_bo_default_lru_tail,
|
||||||
|
.swap_lru_tail = &ttm_bo_default_swap_lru_tail,
|
||||||
};
|
};
|
||||||
|
|
||||||
int amdgpu_ttm_init(struct amdgpu_device *adev)
|
int amdgpu_ttm_init(struct amdgpu_device *adev)
|
||||||
|
|
|
@ -245,6 +245,8 @@ struct ttm_bo_driver ast_bo_driver = {
|
||||||
.verify_access = ast_bo_verify_access,
|
.verify_access = ast_bo_verify_access,
|
||||||
.io_mem_reserve = &ast_ttm_io_mem_reserve,
|
.io_mem_reserve = &ast_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &ast_ttm_io_mem_free,
|
.io_mem_free = &ast_ttm_io_mem_free,
|
||||||
|
.lru_tail = &ttm_bo_default_lru_tail,
|
||||||
|
.swap_lru_tail = &ttm_bo_default_swap_lru_tail,
|
||||||
};
|
};
|
||||||
|
|
||||||
int ast_mm_init(struct ast_private *ast)
|
int ast_mm_init(struct ast_private *ast)
|
||||||
|
|
|
@ -212,6 +212,8 @@ struct ttm_bo_driver bochs_bo_driver = {
|
||||||
.verify_access = bochs_bo_verify_access,
|
.verify_access = bochs_bo_verify_access,
|
||||||
.io_mem_reserve = &bochs_ttm_io_mem_reserve,
|
.io_mem_reserve = &bochs_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &bochs_ttm_io_mem_free,
|
.io_mem_free = &bochs_ttm_io_mem_free,
|
||||||
|
.lru_tail = &ttm_bo_default_lru_tail,
|
||||||
|
.swap_lru_tail = &ttm_bo_default_swap_lru_tail,
|
||||||
};
|
};
|
||||||
|
|
||||||
int bochs_mm_init(struct bochs_device *bochs)
|
int bochs_mm_init(struct bochs_device *bochs)
|
||||||
|
|
|
@ -245,6 +245,8 @@ struct ttm_bo_driver cirrus_bo_driver = {
|
||||||
.verify_access = cirrus_bo_verify_access,
|
.verify_access = cirrus_bo_verify_access,
|
||||||
.io_mem_reserve = &cirrus_ttm_io_mem_reserve,
|
.io_mem_reserve = &cirrus_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &cirrus_ttm_io_mem_free,
|
.io_mem_free = &cirrus_ttm_io_mem_free,
|
||||||
|
.lru_tail = &ttm_bo_default_lru_tail,
|
||||||
|
.swap_lru_tail = &ttm_bo_default_swap_lru_tail,
|
||||||
};
|
};
|
||||||
|
|
||||||
int cirrus_mm_init(struct cirrus_device *cirrus)
|
int cirrus_mm_init(struct cirrus_device *cirrus)
|
||||||
|
|
|
@ -245,6 +245,8 @@ struct ttm_bo_driver mgag200_bo_driver = {
|
||||||
.verify_access = mgag200_bo_verify_access,
|
.verify_access = mgag200_bo_verify_access,
|
||||||
.io_mem_reserve = &mgag200_ttm_io_mem_reserve,
|
.io_mem_reserve = &mgag200_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &mgag200_ttm_io_mem_free,
|
.io_mem_free = &mgag200_ttm_io_mem_free,
|
||||||
|
.lru_tail = &ttm_bo_default_lru_tail,
|
||||||
|
.swap_lru_tail = &ttm_bo_default_swap_lru_tail,
|
||||||
};
|
};
|
||||||
|
|
||||||
int mgag200_mm_init(struct mga_device *mdev)
|
int mgag200_mm_init(struct mga_device *mdev)
|
||||||
|
|
|
@ -1611,6 +1611,8 @@ struct ttm_bo_driver nouveau_bo_driver = {
|
||||||
.fault_reserve_notify = &nouveau_ttm_fault_reserve_notify,
|
.fault_reserve_notify = &nouveau_ttm_fault_reserve_notify,
|
||||||
.io_mem_reserve = &nouveau_ttm_io_mem_reserve,
|
.io_mem_reserve = &nouveau_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &nouveau_ttm_io_mem_free,
|
.io_mem_free = &nouveau_ttm_io_mem_free,
|
||||||
|
.lru_tail = &ttm_bo_default_lru_tail,
|
||||||
|
.swap_lru_tail = &ttm_bo_default_swap_lru_tail,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nvkm_vma *
|
struct nvkm_vma *
|
||||||
|
|
|
@ -384,6 +384,8 @@ static struct ttm_bo_driver qxl_bo_driver = {
|
||||||
.io_mem_reserve = &qxl_ttm_io_mem_reserve,
|
.io_mem_reserve = &qxl_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &qxl_ttm_io_mem_free,
|
.io_mem_free = &qxl_ttm_io_mem_free,
|
||||||
.move_notify = &qxl_bo_move_notify,
|
.move_notify = &qxl_bo_move_notify,
|
||||||
|
.lru_tail = &ttm_bo_default_lru_tail,
|
||||||
|
.swap_lru_tail = &ttm_bo_default_swap_lru_tail,
|
||||||
};
|
};
|
||||||
|
|
||||||
int qxl_ttm_init(struct qxl_device *qdev)
|
int qxl_ttm_init(struct qxl_device *qdev)
|
||||||
|
|
|
@ -863,6 +863,8 @@ static struct ttm_bo_driver radeon_bo_driver = {
|
||||||
.fault_reserve_notify = &radeon_bo_fault_reserve_notify,
|
.fault_reserve_notify = &radeon_bo_fault_reserve_notify,
|
||||||
.io_mem_reserve = &radeon_ttm_io_mem_reserve,
|
.io_mem_reserve = &radeon_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &radeon_ttm_io_mem_free,
|
.io_mem_free = &radeon_ttm_io_mem_free,
|
||||||
|
.lru_tail = &ttm_bo_default_lru_tail,
|
||||||
|
.swap_lru_tail = &ttm_bo_default_swap_lru_tail,
|
||||||
};
|
};
|
||||||
|
|
||||||
int radeon_ttm_init(struct radeon_device *rdev)
|
int radeon_ttm_init(struct radeon_device *rdev)
|
||||||
|
|
|
@ -164,7 +164,6 @@ static void ttm_bo_release_list(struct kref *list_kref)
|
||||||
void ttm_bo_add_to_lru(struct ttm_buffer_object *bo)
|
void ttm_bo_add_to_lru(struct ttm_buffer_object *bo)
|
||||||
{
|
{
|
||||||
struct ttm_bo_device *bdev = bo->bdev;
|
struct ttm_bo_device *bdev = bo->bdev;
|
||||||
struct ttm_mem_type_manager *man;
|
|
||||||
|
|
||||||
lockdep_assert_held(&bo->resv->lock.base);
|
lockdep_assert_held(&bo->resv->lock.base);
|
||||||
|
|
||||||
|
@ -172,12 +171,11 @@ void ttm_bo_add_to_lru(struct ttm_buffer_object *bo)
|
||||||
|
|
||||||
BUG_ON(!list_empty(&bo->lru));
|
BUG_ON(!list_empty(&bo->lru));
|
||||||
|
|
||||||
man = &bdev->man[bo->mem.mem_type];
|
list_add(&bo->lru, bdev->driver->lru_tail(bo));
|
||||||
list_add_tail(&bo->lru, &man->lru);
|
|
||||||
kref_get(&bo->list_kref);
|
kref_get(&bo->list_kref);
|
||||||
|
|
||||||
if (bo->ttm && !(bo->ttm->page_flags & TTM_PAGE_FLAG_SG)) {
|
if (bo->ttm && !(bo->ttm->page_flags & TTM_PAGE_FLAG_SG)) {
|
||||||
list_add_tail(&bo->swap, &bo->glob->swap_lru);
|
list_add(&bo->swap, bdev->driver->swap_lru_tail(bo));
|
||||||
kref_get(&bo->list_kref);
|
kref_get(&bo->list_kref);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -230,7 +228,6 @@ EXPORT_SYMBOL(ttm_bo_del_sub_from_lru);
|
||||||
void ttm_bo_move_to_lru_tail(struct ttm_buffer_object *bo)
|
void ttm_bo_move_to_lru_tail(struct ttm_buffer_object *bo)
|
||||||
{
|
{
|
||||||
struct ttm_bo_device *bdev = bo->bdev;
|
struct ttm_bo_device *bdev = bo->bdev;
|
||||||
struct ttm_mem_type_manager *man;
|
|
||||||
|
|
||||||
lockdep_assert_held(&bo->resv->lock.base);
|
lockdep_assert_held(&bo->resv->lock.base);
|
||||||
|
|
||||||
|
@ -242,15 +239,29 @@ void ttm_bo_move_to_lru_tail(struct ttm_buffer_object *bo)
|
||||||
list_del_init(&bo->lru);
|
list_del_init(&bo->lru);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (bo->ttm && !(bo->ttm->page_flags & TTM_PAGE_FLAG_SG))
|
if (bo->ttm && !(bo->ttm->page_flags & TTM_PAGE_FLAG_SG)) {
|
||||||
list_move_tail(&bo->swap, &bo->glob->swap_lru);
|
list_del(&bo->swap);
|
||||||
|
list_add(&bo->swap, bdev->driver->swap_lru_tail(bo));
|
||||||
|
}
|
||||||
|
|
||||||
man = &bdev->man[bo->mem.mem_type];
|
list_del(&bo->lru);
|
||||||
list_move_tail(&bo->lru, &man->lru);
|
list_add(&bo->lru, bdev->driver->lru_tail(bo));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ttm_bo_move_to_lru_tail);
|
EXPORT_SYMBOL(ttm_bo_move_to_lru_tail);
|
||||||
|
|
||||||
|
struct list_head *ttm_bo_default_lru_tail(struct ttm_buffer_object *bo)
|
||||||
|
{
|
||||||
|
return bo->bdev->man[bo->mem.mem_type].lru.prev;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ttm_bo_default_lru_tail);
|
||||||
|
|
||||||
|
struct list_head *ttm_bo_default_swap_lru_tail(struct ttm_buffer_object *bo)
|
||||||
|
{
|
||||||
|
return bo->glob->swap_lru.prev;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ttm_bo_default_swap_lru_tail);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call bo->mutex locked.
|
* Call bo->mutex locked.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -426,6 +426,8 @@ static struct ttm_bo_driver virtio_gpu_bo_driver = {
|
||||||
.io_mem_free = &virtio_gpu_ttm_io_mem_free,
|
.io_mem_free = &virtio_gpu_ttm_io_mem_free,
|
||||||
.move_notify = &virtio_gpu_bo_move_notify,
|
.move_notify = &virtio_gpu_bo_move_notify,
|
||||||
.swap_notify = &virtio_gpu_bo_swap_notify,
|
.swap_notify = &virtio_gpu_bo_swap_notify,
|
||||||
|
.lru_tail = &ttm_bo_default_lru_tail,
|
||||||
|
.swap_lru_tail = &ttm_bo_default_swap_lru_tail,
|
||||||
};
|
};
|
||||||
|
|
||||||
int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
|
int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
|
||||||
|
|
|
@ -857,4 +857,6 @@ struct ttm_bo_driver vmw_bo_driver = {
|
||||||
.fault_reserve_notify = &vmw_ttm_fault_reserve_notify,
|
.fault_reserve_notify = &vmw_ttm_fault_reserve_notify,
|
||||||
.io_mem_reserve = &vmw_ttm_io_mem_reserve,
|
.io_mem_reserve = &vmw_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &vmw_ttm_io_mem_free,
|
.io_mem_free = &vmw_ttm_io_mem_free,
|
||||||
|
.lru_tail = &ttm_bo_default_lru_tail,
|
||||||
|
.swap_lru_tail = &ttm_bo_default_swap_lru_tail,
|
||||||
};
|
};
|
||||||
|
|
|
@ -440,6 +440,12 @@ struct ttm_bo_driver {
|
||||||
* Called with LRU lock held immediately before the removal.
|
* Called with LRU lock held immediately before the removal.
|
||||||
*/
|
*/
|
||||||
void (*lru_removal)(struct ttm_buffer_object *bo);
|
void (*lru_removal)(struct ttm_buffer_object *bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the list_head after which a BO should be inserted in the LRU.
|
||||||
|
*/
|
||||||
|
struct list_head *(*lru_tail)(struct ttm_buffer_object *bo);
|
||||||
|
struct list_head *(*swap_lru_tail)(struct ttm_buffer_object *bo);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -757,6 +763,9 @@ extern void ttm_mem_io_unlock(struct ttm_mem_type_manager *man);
|
||||||
extern void ttm_bo_del_sub_from_lru(struct ttm_buffer_object *bo);
|
extern void ttm_bo_del_sub_from_lru(struct ttm_buffer_object *bo);
|
||||||
extern void ttm_bo_add_to_lru(struct ttm_buffer_object *bo);
|
extern void ttm_bo_add_to_lru(struct ttm_buffer_object *bo);
|
||||||
|
|
||||||
|
struct list_head *ttm_bo_default_lru_tail(struct ttm_buffer_object *bo);
|
||||||
|
struct list_head *ttm_bo_default_swap_lru_tail(struct ttm_buffer_object *bo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __ttm_bo_reserve:
|
* __ttm_bo_reserve:
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue