Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Christian König and committed by
Dave Airlie
e3f20279 4e4e7dc5

+11 -4
+3
drivers/gpu/drm/nouveau/nouveau_ttm.c
··· 76 76 nouveau_vram_manager_new(struct ttm_mem_type_manager *man, 77 77 struct ttm_buffer_object *bo, 78 78 struct ttm_placement *placement, 79 + uint32_t flags, 79 80 struct ttm_mem_reg *mem) 80 81 { 81 82 struct nouveau_drm *drm = nouveau_bdev(man->bdev); ··· 163 162 nouveau_gart_manager_new(struct ttm_mem_type_manager *man, 164 163 struct ttm_buffer_object *bo, 165 164 struct ttm_placement *placement, 165 + uint32_t flags, 166 166 struct ttm_mem_reg *mem) 167 167 { 168 168 struct nouveau_drm *drm = nouveau_bdev(bo->bdev); ··· 244 242 nv04_gart_manager_new(struct ttm_mem_type_manager *man, 245 243 struct ttm_buffer_object *bo, 246 244 struct ttm_placement *placement, 245 + uint32_t flags, 247 246 struct ttm_mem_reg *mem) 248 247 { 249 248 struct nouveau_mem *node;
+3 -3
drivers/gpu/drm/ttm/ttm_bo.c
··· 784 784 int ret; 785 785 786 786 do { 787 - ret = (*man->func->get_node)(man, bo, placement, mem); 787 + ret = (*man->func->get_node)(man, bo, placement, 0, mem); 788 788 if (unlikely(ret != 0)) 789 789 return ret; 790 790 if (mem->mm_node) ··· 897 897 898 898 if (man->has_type && man->use_type) { 899 899 type_found = true; 900 - ret = (*man->func->get_node)(man, bo, placement, mem); 900 + ret = (*man->func->get_node)(man, bo, placement, 901 + cur_flags, mem); 901 902 if (unlikely(ret)) 902 903 return ret; 903 904 } ··· 937 936 */ 938 937 ttm_flag_masked(&cur_flags, placement->busy_placement[i], 939 938 ~TTM_PL_MASK_MEMTYPE); 940 - 941 939 942 940 if (mem_type == TTM_PL_SYSTEM) { 943 941 mem->mem_type = mem_type;
+2 -1
drivers/gpu/drm/ttm/ttm_bo_manager.c
··· 50 50 static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man, 51 51 struct ttm_buffer_object *bo, 52 52 struct ttm_placement *placement, 53 + uint32_t flags, 53 54 struct ttm_mem_reg *mem) 54 55 { 55 56 struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv; ··· 68 67 if (!node) 69 68 return -ENOMEM; 70 69 71 - if (bo->mem.placement & TTM_PL_FLAG_TOPDOWN) 70 + if (flags & TTM_PL_FLAG_TOPDOWN) 72 71 aflags = DRM_MM_CREATE_TOP; 73 72 74 73 spin_lock(&rman->lock);
+1
drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
··· 47 47 static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man, 48 48 struct ttm_buffer_object *bo, 49 49 struct ttm_placement *placement, 50 + uint32_t flags, 50 51 struct ttm_mem_reg *mem) 51 52 { 52 53 struct vmwgfx_gmrid_man *gman =
+2
include/drm/ttm/ttm_bo_driver.h
··· 182 182 * @man: Pointer to a memory type manager. 183 183 * @bo: Pointer to the buffer object we're allocating space for. 184 184 * @placement: Placement details. 185 + * @flags: Additional placement flags. 185 186 * @mem: Pointer to a struct ttm_mem_reg to be filled in. 186 187 * 187 188 * This function should allocate space in the memory type managed ··· 207 206 int (*get_node)(struct ttm_mem_type_manager *man, 208 207 struct ttm_buffer_object *bo, 209 208 struct ttm_placement *placement, 209 + uint32_t flags, 210 210 struct ttm_mem_reg *mem); 211 211 212 212 /**