Commit e3f20279 authored by Christian König's avatar Christian König Committed by Dave Airlie

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: default avatarChristian König <christian.koenig@amd.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 4e4e7dc5
...@@ -76,6 +76,7 @@ static int ...@@ -76,6 +76,7 @@ static int
nouveau_vram_manager_new(struct ttm_mem_type_manager *man, nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
struct ttm_buffer_object *bo, struct ttm_buffer_object *bo,
struct ttm_placement *placement, struct ttm_placement *placement,
uint32_t flags,
struct ttm_mem_reg *mem) struct ttm_mem_reg *mem)
{ {
struct nouveau_drm *drm = nouveau_bdev(man->bdev); struct nouveau_drm *drm = nouveau_bdev(man->bdev);
...@@ -162,6 +163,7 @@ static int ...@@ -162,6 +163,7 @@ static int
nouveau_gart_manager_new(struct ttm_mem_type_manager *man, nouveau_gart_manager_new(struct ttm_mem_type_manager *man,
struct ttm_buffer_object *bo, struct ttm_buffer_object *bo,
struct ttm_placement *placement, struct ttm_placement *placement,
uint32_t flags,
struct ttm_mem_reg *mem) struct ttm_mem_reg *mem)
{ {
struct nouveau_drm *drm = nouveau_bdev(bo->bdev); struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
...@@ -242,6 +244,7 @@ static int ...@@ -242,6 +244,7 @@ static int
nv04_gart_manager_new(struct ttm_mem_type_manager *man, nv04_gart_manager_new(struct ttm_mem_type_manager *man,
struct ttm_buffer_object *bo, struct ttm_buffer_object *bo,
struct ttm_placement *placement, struct ttm_placement *placement,
uint32_t flags,
struct ttm_mem_reg *mem) struct ttm_mem_reg *mem)
{ {
struct nouveau_mem *node; struct nouveau_mem *node;
......
...@@ -784,7 +784,7 @@ static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo, ...@@ -784,7 +784,7 @@ static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
int ret; int ret;
do { do {
ret = (*man->func->get_node)(man, bo, placement, mem); ret = (*man->func->get_node)(man, bo, placement, 0, mem);
if (unlikely(ret != 0)) if (unlikely(ret != 0))
return ret; return ret;
if (mem->mm_node) if (mem->mm_node)
...@@ -897,7 +897,8 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo, ...@@ -897,7 +897,8 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
if (man->has_type && man->use_type) { if (man->has_type && man->use_type) {
type_found = true; 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)) if (unlikely(ret))
return ret; return ret;
} }
...@@ -937,7 +938,6 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo, ...@@ -937,7 +938,6 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
ttm_flag_masked(&cur_flags, placement->busy_placement[i], ttm_flag_masked(&cur_flags, placement->busy_placement[i],
~TTM_PL_MASK_MEMTYPE); ~TTM_PL_MASK_MEMTYPE);
if (mem_type == TTM_PL_SYSTEM) { if (mem_type == TTM_PL_SYSTEM) {
mem->mem_type = mem_type; mem->mem_type = mem_type;
mem->placement = cur_flags; mem->placement = cur_flags;
......
...@@ -50,6 +50,7 @@ struct ttm_range_manager { ...@@ -50,6 +50,7 @@ struct ttm_range_manager {
static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man, static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
struct ttm_buffer_object *bo, struct ttm_buffer_object *bo,
struct ttm_placement *placement, struct ttm_placement *placement,
uint32_t flags,
struct ttm_mem_reg *mem) struct ttm_mem_reg *mem)
{ {
struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv; 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, ...@@ -67,7 +68,7 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
if (!node) if (!node)
return -ENOMEM; return -ENOMEM;
if (bo->mem.placement & TTM_PL_FLAG_TOPDOWN) if (flags & TTM_PL_FLAG_TOPDOWN)
aflags = DRM_MM_CREATE_TOP; aflags = DRM_MM_CREATE_TOP;
spin_lock(&rman->lock); spin_lock(&rman->lock);
......
...@@ -47,6 +47,7 @@ struct vmwgfx_gmrid_man { ...@@ -47,6 +47,7 @@ struct vmwgfx_gmrid_man {
static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man, static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man,
struct ttm_buffer_object *bo, struct ttm_buffer_object *bo,
struct ttm_placement *placement, struct ttm_placement *placement,
uint32_t flags,
struct ttm_mem_reg *mem) struct ttm_mem_reg *mem)
{ {
struct vmwgfx_gmrid_man *gman = struct vmwgfx_gmrid_man *gman =
......
...@@ -182,6 +182,7 @@ struct ttm_mem_type_manager_func { ...@@ -182,6 +182,7 @@ struct ttm_mem_type_manager_func {
* @man: Pointer to a memory type manager. * @man: Pointer to a memory type manager.
* @bo: Pointer to the buffer object we're allocating space for. * @bo: Pointer to the buffer object we're allocating space for.
* @placement: Placement details. * @placement: Placement details.
* @flags: Additional placement flags.
* @mem: Pointer to a struct ttm_mem_reg to be filled in. * @mem: Pointer to a struct ttm_mem_reg to be filled in.
* *
* This function should allocate space in the memory type managed * This function should allocate space in the memory type managed
...@@ -206,6 +207,7 @@ struct ttm_mem_type_manager_func { ...@@ -206,6 +207,7 @@ struct ttm_mem_type_manager_func {
int (*get_node)(struct ttm_mem_type_manager *man, int (*get_node)(struct ttm_mem_type_manager *man,
struct ttm_buffer_object *bo, struct ttm_buffer_object *bo,
struct ttm_placement *placement, struct ttm_placement *placement,
uint32_t flags,
struct ttm_mem_reg *mem); struct ttm_mem_reg *mem);
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment