mirror of https://gitee.com/openkylin/linux.git
drm/ttm: fix handling of TTM_PL_FLAG_TOPDOWN v2
bo->mem.placement is not initialized when ttm_bo_man_get_node is called, so the flag had no effect at all. v2: change nouveau and vmwgfx as well Signed-off-by: Christian König <christian.koenig@amd.com> Cc: stable@vger.kernel.org Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
4e4e7dc55a
commit
e3f202798a
|
@ -76,6 +76,7 @@ static int
|
|||
nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
|
||||
struct ttm_buffer_object *bo,
|
||||
struct ttm_placement *placement,
|
||||
uint32_t flags,
|
||||
struct ttm_mem_reg *mem)
|
||||
{
|
||||
struct nouveau_drm *drm = nouveau_bdev(man->bdev);
|
||||
|
@ -162,6 +163,7 @@ static int
|
|||
nouveau_gart_manager_new(struct ttm_mem_type_manager *man,
|
||||
struct ttm_buffer_object *bo,
|
||||
struct ttm_placement *placement,
|
||||
uint32_t flags,
|
||||
struct ttm_mem_reg *mem)
|
||||
{
|
||||
struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
|
||||
|
@ -242,6 +244,7 @@ static int
|
|||
nv04_gart_manager_new(struct ttm_mem_type_manager *man,
|
||||
struct ttm_buffer_object *bo,
|
||||
struct ttm_placement *placement,
|
||||
uint32_t flags,
|
||||
struct ttm_mem_reg *mem)
|
||||
{
|
||||
struct nouveau_mem *node;
|
||||
|
|
|
@ -784,7 +784,7 @@ static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
|
|||
int ret;
|
||||
|
||||
do {
|
||||
ret = (*man->func->get_node)(man, bo, placement, mem);
|
||||
ret = (*man->func->get_node)(man, bo, placement, 0, mem);
|
||||
if (unlikely(ret != 0))
|
||||
return ret;
|
||||
if (mem->mm_node)
|
||||
|
@ -897,7 +897,8 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
|
|||
|
||||
if (man->has_type && man->use_type) {
|
||||
type_found = true;
|
||||
ret = (*man->func->get_node)(man, bo, placement, mem);
|
||||
ret = (*man->func->get_node)(man, bo, placement,
|
||||
cur_flags, mem);
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
}
|
||||
|
@ -937,7 +938,6 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
|
|||
ttm_flag_masked(&cur_flags, placement->busy_placement[i],
|
||||
~TTM_PL_MASK_MEMTYPE);
|
||||
|
||||
|
||||
if (mem_type == TTM_PL_SYSTEM) {
|
||||
mem->mem_type = mem_type;
|
||||
mem->placement = cur_flags;
|
||||
|
|
|
@ -50,6 +50,7 @@ struct ttm_range_manager {
|
|||
static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
|
||||
struct ttm_buffer_object *bo,
|
||||
struct ttm_placement *placement,
|
||||
uint32_t flags,
|
||||
struct ttm_mem_reg *mem)
|
||||
{
|
||||
struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv;
|
||||
|
@ -67,7 +68,7 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
|
|||
if (!node)
|
||||
return -ENOMEM;
|
||||
|
||||
if (bo->mem.placement & TTM_PL_FLAG_TOPDOWN)
|
||||
if (flags & TTM_PL_FLAG_TOPDOWN)
|
||||
aflags = DRM_MM_CREATE_TOP;
|
||||
|
||||
spin_lock(&rman->lock);
|
||||
|
|
|
@ -47,6 +47,7 @@ struct vmwgfx_gmrid_man {
|
|||
static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man,
|
||||
struct ttm_buffer_object *bo,
|
||||
struct ttm_placement *placement,
|
||||
uint32_t flags,
|
||||
struct ttm_mem_reg *mem)
|
||||
{
|
||||
struct vmwgfx_gmrid_man *gman =
|
||||
|
|
|
@ -182,6 +182,7 @@ struct ttm_mem_type_manager_func {
|
|||
* @man: Pointer to a memory type manager.
|
||||
* @bo: Pointer to the buffer object we're allocating space for.
|
||||
* @placement: Placement details.
|
||||
* @flags: Additional placement flags.
|
||||
* @mem: Pointer to a struct ttm_mem_reg to be filled in.
|
||||
*
|
||||
* This function should allocate space in the memory type managed
|
||||
|
@ -206,6 +207,7 @@ struct ttm_mem_type_manager_func {
|
|||
int (*get_node)(struct ttm_mem_type_manager *man,
|
||||
struct ttm_buffer_object *bo,
|
||||
struct ttm_placement *placement,
|
||||
uint32_t flags,
|
||||
struct ttm_mem_reg *mem);
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue