Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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;
+3 −3
Original line number Diff line number Diff line
@@ -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;
+2 −1
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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 =
+2 −0
Original line number Diff line number Diff line
@@ -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);

	/**