Merge tag 'drm-misc-next-2022-02-23' of git://anongit.freedesktop.org/drm/drm-misc...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_vram_mgr.c
index fce9a13a6ba1cdecdb2c5a5f89422ea599557343..0a76116485738e25bac8c8876100e0a91a71be21 100644 (file)
@@ -96,9 +96,9 @@ static ssize_t amdgpu_mem_info_vram_used_show(struct device *dev,
 {
        struct drm_device *ddev = dev_get_drvdata(dev);
        struct amdgpu_device *adev = drm_to_adev(ddev);
+       struct ttm_resource_manager *man = &adev->mman.vram_mgr.manager;
 
-       return sysfs_emit(buf, "%llu\n",
-                         amdgpu_vram_mgr_usage(&adev->mman.vram_mgr));
+       return sysfs_emit(buf, "%llu\n", ttm_resource_manager_usage(man));
 }
 
 /**
@@ -253,7 +253,9 @@ static void amdgpu_vram_mgr_do_reserve(struct ttm_resource_manager *man)
 
                vis_usage = amdgpu_vram_mgr_vis_size(adev, &rsv->mm_node);
                atomic64_add(vis_usage, &mgr->vis_usage);
-               atomic64_add(rsv->mm_node.size << PAGE_SHIFT, &mgr->usage);
+               spin_lock(&man->bdev->lru_lock);
+               man->usage += rsv->mm_node.size << PAGE_SHIFT;
+               spin_unlock(&man->bdev->lru_lock);
                list_move(&rsv->node, &mgr->reserved_pages);
        }
 }
@@ -378,19 +380,13 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
 
        lpfn = place->lpfn;
        if (!lpfn)
-               lpfn = man->size;
+               lpfn = man->size >> PAGE_SHIFT;
 
        max_bytes = adev->gmc.mc_vram_size;
        if (tbo->type != ttm_bo_type_kernel)
                max_bytes -= AMDGPU_VM_RESERVED_VRAM;
 
-       /* bail out quickly if there's likely not enough VRAM for this BO */
        mem_bytes = tbo->base.size;
-       if (atomic64_add_return(mem_bytes, &mgr->usage) > max_bytes) {
-               r = -ENOSPC;
-               goto error_sub;
-       }
-
        if (place->flags & TTM_PL_FLAG_CONTIGUOUS) {
                pages_per_node = ~0ul;
                num_nodes = 1;
@@ -408,13 +404,17 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
 
        node = kvmalloc(struct_size(node, mm_nodes, num_nodes),
                        GFP_KERNEL | __GFP_ZERO);
-       if (!node) {
-               r = -ENOMEM;
-               goto error_sub;
-       }
+       if (!node)
+               return -ENOMEM;
 
        ttm_resource_init(tbo, place, &node->base);
 
+       /* bail out quickly if there's likely not enough VRAM for this BO */
+       if (ttm_resource_manager_usage(man) > max_bytes) {
+               r = -ENOSPC;
+               goto error_fini;
+       }
+
        mode = DRM_MM_INSERT_BEST;
        if (place->flags & TTM_PL_FLAG_TOPDOWN)
                mode = DRM_MM_INSERT_HIGH;
@@ -472,11 +472,10 @@ error_free:
        while (i--)
                drm_mm_remove_node(&node->mm_nodes[i]);
        spin_unlock(&mgr->lock);
+error_fini:
        ttm_resource_fini(man, &node->base);
        kvfree(node);
 
-error_sub:
-       atomic64_sub(mem_bytes, &mgr->usage);
        return r;
 }
 
@@ -494,7 +493,7 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man,
        struct ttm_range_mgr_node *node = to_ttm_range_mgr_node(res);
        struct amdgpu_vram_mgr *mgr = to_vram_mgr(man);
        struct amdgpu_device *adev = to_amdgpu_device(mgr);
-       uint64_t usage = 0, vis_usage = 0;
+       uint64_t vis_usage = 0;
        unsigned i, pages;
 
        spin_lock(&mgr->lock);
@@ -503,13 +502,11 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man,
                struct drm_mm_node *mm = &node->mm_nodes[i];
 
                drm_mm_remove_node(mm);
-               usage += mm->size << PAGE_SHIFT;
                vis_usage += amdgpu_vram_mgr_vis_size(adev, mm);
        }
        amdgpu_vram_mgr_do_reserve(man);
        spin_unlock(&mgr->lock);
 
-       atomic64_sub(usage, &mgr->usage);
        atomic64_sub(vis_usage, &mgr->vis_usage);
 
        ttm_resource_fini(man, res);
@@ -627,18 +624,6 @@ void amdgpu_vram_mgr_free_sgt(struct device *dev,
        kfree(sgt);
 }
 
-/**
- * amdgpu_vram_mgr_usage - how many bytes are used in this domain
- *
- * @mgr: amdgpu_vram_mgr pointer
- *
- * Returns how many bytes are used in this domain.
- */
-uint64_t amdgpu_vram_mgr_usage(struct amdgpu_vram_mgr *mgr)
-{
-       return atomic64_read(&mgr->usage);
-}
-
 /**
  * amdgpu_vram_mgr_vis_usage - how many bytes are used in the visible part
  *
@@ -664,13 +649,12 @@ static void amdgpu_vram_mgr_debug(struct ttm_resource_manager *man,
 {
        struct amdgpu_vram_mgr *mgr = to_vram_mgr(man);
 
+       drm_printf(printer, "  vis usage:%llu\n",
+                  amdgpu_vram_mgr_vis_usage(mgr));
+
        spin_lock(&mgr->lock);
        drm_mm_print(&mgr->mm, printer);
        spin_unlock(&mgr->lock);
-
-       drm_printf(printer, "man size:%llu pages, ram usage:%lluMB, vis usage:%lluMB\n",
-                  man->size, amdgpu_vram_mgr_usage(mgr) >> 20,
-                  amdgpu_vram_mgr_vis_usage(mgr) >> 20);
 }
 
 static const struct ttm_resource_manager_func amdgpu_vram_mgr_func = {
@@ -692,11 +676,11 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)
        struct ttm_resource_manager *man = &mgr->manager;
 
        ttm_resource_manager_init(man, &adev->mman.bdev,
-                                 adev->gmc.real_vram_size >> PAGE_SHIFT);
+                                 adev->gmc.real_vram_size);
 
        man->func = &amdgpu_vram_mgr_func;
 
-       drm_mm_init(&mgr->mm, 0, man->size);
+       drm_mm_init(&mgr->mm, 0, man->size >> PAGE_SHIFT);
        spin_lock_init(&mgr->lock);
        INIT_LIST_HEAD(&mgr->reservations_pending);
        INIT_LIST_HEAD(&mgr->reserved_pages);