These are a bit misc/bit rfc, Christian you suggested the first, the second follows on from that and are both amdgpu specifc.
These are more RFC or may ignite some better ideas, I'm not hard sold on either.
Dave.
From: Dave Airlie airlied@redhat.com
Christian suggested this and it makes sense.
Signed-off-by: Dave Airlie airlied@redhat.com --- drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 21 ++++------------- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 19 ++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 24 ++++---------------- 3 files changed, 27 insertions(+), 37 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index c847a5fe94c9..010518148ef8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c @@ -24,13 +24,6 @@
#include "amdgpu.h"
-struct amdgpu_gtt_mgr { - struct ttm_resource_manager manager; - struct drm_mm mm; - spinlock_t lock; - atomic64_t available; -}; - static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) { return container_of(man, struct amdgpu_gtt_mgr, manager); @@ -93,16 +86,11 @@ static const struct ttm_resource_manager_func amdgpu_gtt_mgr_func; */ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) { - struct ttm_resource_manager *man; - struct amdgpu_gtt_mgr *mgr; + struct amdgpu_gtt_mgr *mgr = &adev->mman.gtt_mgr; + struct ttm_resource_manager *man = &mgr->manager; uint64_t start, size; int ret;
- mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); - if (!mgr) - return -ENOMEM; - - man = &mgr->manager; man->use_tt = true; man->func = &amdgpu_gtt_mgr_func; man->available_caching = TTM_PL_MASK_CACHING; @@ -142,8 +130,8 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) */ void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev) { - struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); - struct amdgpu_gtt_mgr *mgr = to_gtt_mgr(man); + struct amdgpu_gtt_mgr *mgr = &adev->mman.gtt_mgr; + struct ttm_resource_manager *man = &mgr->manager; int ret;
ttm_resource_manager_set_used(man, false); @@ -161,7 +149,6 @@ void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev)
ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_TT, NULL); - kfree(mgr); }
/** diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 36b024fd077e..168294be276d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -41,6 +41,22 @@
#define AMDGPU_POISON 0xd0bed0be
+struct amdgpu_vram_mgr { + struct ttm_resource_manager manager; + struct drm_mm mm; + spinlock_t lock; + atomic64_t usage; + atomic64_t vis_usage; + struct amdgpu_device *adev; +}; + +struct amdgpu_gtt_mgr { + struct ttm_resource_manager manager; + struct drm_mm mm; + spinlock_t lock; + atomic64_t available; +}; + struct amdgpu_mman { struct ttm_bo_device bdev; bool mem_global_referenced; @@ -59,6 +75,9 @@ struct amdgpu_mman { struct mutex gtt_window_lock; /* Scheduler entity for buffer moves */ struct drm_sched_entity entity; + + struct amdgpu_vram_mgr vram_mgr; + struct amdgpu_gtt_mgr gtt_mgr; };
struct amdgpu_copy_mem { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 895634cbf999..a41a8abc9927 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -28,15 +28,6 @@ #include "amdgpu_atomfirmware.h" #include "atom.h"
-struct amdgpu_vram_mgr { - struct ttm_resource_manager manager; - struct drm_mm mm; - spinlock_t lock; - atomic64_t usage; - atomic64_t vis_usage; - struct amdgpu_device *adev; -}; - static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) { return container_of(man, struct amdgpu_vram_mgr, manager); @@ -177,16 +168,10 @@ static const struct ttm_resource_manager_func amdgpu_vram_mgr_func; */ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) { - struct ttm_resource_manager *man; - struct amdgpu_vram_mgr *mgr; + struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; + struct ttm_resource_manager *man = &mgr->manager; int ret;
- mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); - if (!mgr) - return -ENOMEM; - - man = &mgr->manager; - man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC; man->default_caching = TTM_PL_FLAG_WC;
@@ -219,8 +204,8 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) */ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev) { - struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM); - struct amdgpu_vram_mgr *mgr = to_vram_mgr(man); + struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; + struct ttm_resource_manager *man = &mgr->manager; int ret;
ttm_resource_manager_set_used(man, false); @@ -237,7 +222,6 @@ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev)
ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, NULL); - kfree(mgr); }
/**
Am 07.08.20 um 01:34 schrieb Dave Airlie:
From: Dave Airlie airlied@redhat.com
Christian suggested this and it makes sense.
Signed-off-by: Dave Airlie airlied@redhat.com
Reviewed-by: Christian König christian.koenig@amd.com
drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 21 ++++------------- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 19 ++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 24 ++++---------------- 3 files changed, 27 insertions(+), 37 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index c847a5fe94c9..010518148ef8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c @@ -24,13 +24,6 @@
#include "amdgpu.h"
-struct amdgpu_gtt_mgr {
- struct ttm_resource_manager manager;
- struct drm_mm mm;
- spinlock_t lock;
- atomic64_t available;
-};
- static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) { return container_of(man, struct amdgpu_gtt_mgr, manager);
@@ -93,16 +86,11 @@ static const struct ttm_resource_manager_func amdgpu_gtt_mgr_func; */ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) {
- struct ttm_resource_manager *man;
- struct amdgpu_gtt_mgr *mgr;
- struct amdgpu_gtt_mgr *mgr = &adev->mman.gtt_mgr;
- struct ttm_resource_manager *man = &mgr->manager; uint64_t start, size; int ret;
- mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
- if (!mgr)
return -ENOMEM;
- man = &mgr->manager; man->use_tt = true; man->func = &amdgpu_gtt_mgr_func; man->available_caching = TTM_PL_MASK_CACHING;
@@ -142,8 +130,8 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) */ void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev) {
- struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT);
- struct amdgpu_gtt_mgr *mgr = to_gtt_mgr(man);
struct amdgpu_gtt_mgr *mgr = &adev->mman.gtt_mgr;
struct ttm_resource_manager *man = &mgr->manager; int ret;
ttm_resource_manager_set_used(man, false);
@@ -161,7 +149,6 @@ void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev)
ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_TT, NULL);
kfree(mgr); }
/**
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 36b024fd077e..168294be276d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -41,6 +41,22 @@
#define AMDGPU_POISON 0xd0bed0be
+struct amdgpu_vram_mgr {
- struct ttm_resource_manager manager;
- struct drm_mm mm;
- spinlock_t lock;
- atomic64_t usage;
- atomic64_t vis_usage;
- struct amdgpu_device *adev;
+};
+struct amdgpu_gtt_mgr {
- struct ttm_resource_manager manager;
- struct drm_mm mm;
- spinlock_t lock;
- atomic64_t available;
+};
- struct amdgpu_mman { struct ttm_bo_device bdev; bool mem_global_referenced;
@@ -59,6 +75,9 @@ struct amdgpu_mman { struct mutex gtt_window_lock; /* Scheduler entity for buffer moves */ struct drm_sched_entity entity;
struct amdgpu_vram_mgr vram_mgr;
struct amdgpu_gtt_mgr gtt_mgr; };
struct amdgpu_copy_mem {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 895634cbf999..a41a8abc9927 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -28,15 +28,6 @@ #include "amdgpu_atomfirmware.h" #include "atom.h"
-struct amdgpu_vram_mgr {
- struct ttm_resource_manager manager;
- struct drm_mm mm;
- spinlock_t lock;
- atomic64_t usage;
- atomic64_t vis_usage;
- struct amdgpu_device *adev;
-};
- static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) { return container_of(man, struct amdgpu_vram_mgr, manager);
@@ -177,16 +168,10 @@ static const struct ttm_resource_manager_func amdgpu_vram_mgr_func; */ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) {
- struct ttm_resource_manager *man;
- struct amdgpu_vram_mgr *mgr;
- struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr;
- struct ttm_resource_manager *man = &mgr->manager; int ret;
- mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
- if (!mgr)
return -ENOMEM;
- man = &mgr->manager;
- man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC; man->default_caching = TTM_PL_FLAG_WC;
@@ -219,8 +204,8 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) */ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev) {
- struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM);
- struct amdgpu_vram_mgr *mgr = to_vram_mgr(man);
struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr;
struct ttm_resource_manager *man = &mgr->manager; int ret;
ttm_resource_manager_set_used(man, false);
@@ -237,7 +222,6 @@ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev)
ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, NULL);
kfree(mgr); }
/**
From: Dave Airlie airlied@redhat.com
There is no need for that now since it's embedded.
Signed-off-by: Dave Airlie airlied@redhat.com --- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 - drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 11 +++++++---- 2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 168294be276d..4a6d92f27b6e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -47,7 +47,6 @@ struct amdgpu_vram_mgr { spinlock_t lock; atomic64_t usage; atomic64_t vis_usage; - struct amdgpu_device *adev; };
struct amdgpu_gtt_mgr { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index a41a8abc9927..7882efd275d1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -33,6 +33,11 @@ static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *m return container_of(man, struct amdgpu_vram_mgr, manager); }
+static inline struct amdgpu_device *to_amdgpu_device(struct amdgpu_vram_mgr *mgr) +{ + return container_of(mgr, struct amdgpu_device, mman.vram_mgr); +} + /** * DOC: mem_info_vram_total * @@ -182,8 +187,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) drm_mm_init(&mgr->mm, 0, man->size); spin_lock_init(&mgr->lock);
- mgr->adev = adev; - /* Add the two VRAM-related sysfs files */ ret = sysfs_create_files(&adev->dev->kobj, amdgpu_vram_mgr_attributes); if (ret) @@ -311,7 +314,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, struct ttm_resource *mem) { struct amdgpu_vram_mgr *mgr = to_vram_mgr(man); - struct amdgpu_device *adev = mgr->adev; + struct amdgpu_device *adev = to_amdgpu_device(mgr); struct drm_mm *mm = &mgr->mm; struct drm_mm_node *nodes; enum drm_mm_insert_mode mode; @@ -429,7 +432,7 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man, struct ttm_resource *mem) { struct amdgpu_vram_mgr *mgr = to_vram_mgr(man); - struct amdgpu_device *adev = mgr->adev; + struct amdgpu_device *adev = to_amdgpu_device(mgr); struct drm_mm_node *nodes = mem->mm_node; uint64_t usage = 0, vis_usage = 0; unsigned pages = mem->num_pages;
Am 07.08.20 um 01:34 schrieb Dave Airlie:
From: Dave Airlie airlied@redhat.com
There is no need for that now since it's embedded.
Signed-off-by: Dave Airlie airlied@redhat.com
Reviewed-by: Christian König christian.koenig@amd.com
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 - drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 11 +++++++---- 2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 168294be276d..4a6d92f27b6e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -47,7 +47,6 @@ struct amdgpu_vram_mgr { spinlock_t lock; atomic64_t usage; atomic64_t vis_usage;
struct amdgpu_device *adev; };
struct amdgpu_gtt_mgr {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index a41a8abc9927..7882efd275d1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -33,6 +33,11 @@ static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *m return container_of(man, struct amdgpu_vram_mgr, manager); }
+static inline struct amdgpu_device *to_amdgpu_device(struct amdgpu_vram_mgr *mgr) +{
- return container_of(mgr, struct amdgpu_device, mman.vram_mgr);
+}
- /**
- DOC: mem_info_vram_total
@@ -182,8 +187,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) drm_mm_init(&mgr->mm, 0, man->size); spin_lock_init(&mgr->lock);
- mgr->adev = adev;
- /* Add the two VRAM-related sysfs files */ ret = sysfs_create_files(&adev->dev->kobj, amdgpu_vram_mgr_attributes); if (ret)
@@ -311,7 +314,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, struct ttm_resource *mem) { struct amdgpu_vram_mgr *mgr = to_vram_mgr(man);
- struct amdgpu_device *adev = mgr->adev;
- struct amdgpu_device *adev = to_amdgpu_device(mgr); struct drm_mm *mm = &mgr->mm; struct drm_mm_node *nodes; enum drm_mm_insert_mode mode;
@@ -429,7 +432,7 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man, struct ttm_resource *mem) { struct amdgpu_vram_mgr *mgr = to_vram_mgr(man);
- struct amdgpu_device *adev = mgr->adev;
- struct amdgpu_device *adev = to_amdgpu_device(mgr); struct drm_mm_node *nodes = mem->mm_node; uint64_t usage = 0, vis_usage = 0; unsigned pages = mem->num_pages;
From: Dave Airlie airlied@redhat.com
This is a bit more involved that it looked, the range manager needs accessors adding and amdgpu needs a bit of a refactor. --- drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 21 ++++++++----------- drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 5 +++-- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 13 ++++++------ drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 12 +++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 16 ++++++-------- drivers/gpu/drm/nouveau/nouveau_ttm.c | 5 ++--- drivers/gpu/drm/radeon/radeon_gem.c | 2 +- drivers/gpu/drm/radeon/radeon_ttm.c | 3 +-- drivers/gpu/drm/ttm/ttm_bo.c | 7 ++----- drivers/gpu/drm/ttm/ttm_range_manager.c | 21 +++++++++++++++++-- drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c | 2 +- drivers/gpu/drm/vmwgfx/vmwgfx_thp.c | 9 ++++---- include/drm/ttm/ttm_bo_api.h | 4 +--- include/drm/ttm/ttm_bo_driver.h | 20 ++++++++++++++++-- 15 files changed, 87 insertions(+), 55 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index 010518148ef8..b769b43b2fbc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c @@ -24,11 +24,6 @@
#include "amdgpu.h"
-static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) -{ - return container_of(man, struct amdgpu_gtt_mgr, manager); -} - struct amdgpu_gtt_node { struct drm_mm_node node; struct ttm_buffer_object *tbo; @@ -48,8 +43,9 @@ static ssize_t amdgpu_mem_info_gtt_total_show(struct device *dev, struct drm_device *ddev = dev_get_drvdata(dev); struct amdgpu_device *adev = ddev->dev_private; struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); - return snprintf(buf, PAGE_SIZE, "%llu\n", - man->size * PAGE_SIZE); + struct amdgpu_gtt_mgr *gtt_mgr = to_gtt_mgr(man); + return snprintf(buf, PAGE_SIZE, "%lu\n", + gtt_mgr->size * PAGE_SIZE); }
/** @@ -96,13 +92,14 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) man->available_caching = TTM_PL_MASK_CACHING; man->default_caching = TTM_PL_FLAG_CACHED;
- ttm_resource_manager_init(man, gtt_size >> PAGE_SHIFT); + mgr->size = gtt_size >> PAGE_SHIFT; + ttm_resource_manager_init(man);
start = AMDGPU_GTT_MAX_TRANSFER_SIZE * AMDGPU_GTT_NUM_TRANSFER_WINDOWS; size = (adev->gmc.gart_size >> PAGE_SHIFT) - start; drm_mm_init(&mgr->mm, start, size); spin_lock_init(&mgr->lock); - atomic64_set(&mgr->available, gtt_size >> PAGE_SHIFT); + atomic64_set(&mgr->available, mgr->size);
ret = device_create_file(adev->dev, &dev_attr_mem_info_gtt_total); if (ret) { @@ -264,7 +261,7 @@ static void amdgpu_gtt_mgr_del(struct ttm_resource_manager *man, uint64_t amdgpu_gtt_mgr_usage(struct ttm_resource_manager *man) { struct amdgpu_gtt_mgr *mgr = to_gtt_mgr(man); - s64 result = man->size - atomic64_read(&mgr->available); + s64 result = mgr->size - atomic64_read(&mgr->available);
return (result > 0 ? result : 0) * PAGE_SIZE; } @@ -305,8 +302,8 @@ static void amdgpu_gtt_mgr_debug(struct ttm_resource_manager *man, drm_mm_print(&mgr->mm, printer); spin_unlock(&mgr->lock);
- drm_printf(printer, "man size:%llu pages, gtt available:%lld pages, usage:%lluMB\n", - man->size, (u64)atomic64_read(&mgr->available), + drm_printf(printer, "man size:%lu pages, gtt available:%lld pages, usage:%lluMB\n", + mgr->size, (u64)atomic64_read(&mgr->available), amdgpu_gtt_mgr_usage(man) >> 20); }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index fff9c013f337..732e4004777e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -608,7 +608,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file min(adev->gmc.visible_vram_size - atomic64_read(&adev->visible_pin_size), vram_gtt.vram_size); - vram_gtt.gtt_size = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT)->size; + vram_gtt.gtt_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; vram_gtt.gtt_size *= PAGE_SIZE; vram_gtt.gtt_size -= atomic64_read(&adev->gart_pin_size); return copy_to_user(out, &vram_gtt, @@ -620,6 +620,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM); struct ttm_resource_manager *gtt_man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); + struct amdgpu_gtt_mgr *gtt_mgr = to_gtt_mgr(gtt_man); memset(&mem, 0, sizeof(mem)); mem.vram.total_heap_size = adev->gmc.real_vram_size; mem.vram.usable_heap_size = adev->gmc.real_vram_size - @@ -640,7 +641,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file mem.cpu_accessible_vram.max_allocation = mem.cpu_accessible_vram.usable_heap_size * 3 / 4;
- mem.gtt.total_heap_size = gtt_man->size; + mem.gtt.total_heap_size = gtt_mgr->size; mem.gtt.total_heap_size *= PAGE_SIZE; mem.gtt.usable_heap_size = mem.gtt.total_heap_size - atomic64_read(&adev->gart_pin_size); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 43f4966331dd..33957d829197 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -442,25 +442,24 @@ void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr, static bool amdgpu_bo_validate_size(struct amdgpu_device *adev, unsigned long size, u32 domain) { - struct ttm_resource_manager *man = NULL; - + unsigned long mgr_size = 0; /* * If GTT is part of requested domains the check must succeed to * allow fall back to GTT */ if (domain & AMDGPU_GEM_DOMAIN_GTT) { - man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); + mgr_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size;
- if (size < (man->size << PAGE_SHIFT)) + if (size < (mgr_size << PAGE_SHIFT)) return true; else goto fail; }
if (domain & AMDGPU_GEM_DOMAIN_VRAM) { - man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM); + mgr_size = to_vram_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size;
- if (size < (man->size << PAGE_SHIFT)) + if (size < (mgr_size << PAGE_SHIFT)) return true; else goto fail; @@ -472,7 +471,7 @@ static bool amdgpu_bo_validate_size(struct amdgpu_device *adev,
fail: DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size, - man->size << PAGE_SHIFT); + mgr_size << PAGE_SHIFT); return false; }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 28557839f132..ca312ef8c2f8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -2045,7 +2045,7 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable) size = adev->gmc.real_vram_size; else size = adev->gmc.visible_vram_size; - man->size = size >> PAGE_SHIFT; + to_vram_mgr(man)->size = size >> PAGE_SHIFT; adev->mman.buffer_funcs_enabled = enable; }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 4a6d92f27b6e..5636ef2b1707 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -47,15 +47,27 @@ struct amdgpu_vram_mgr { spinlock_t lock; atomic64_t usage; atomic64_t vis_usage; + unsigned long size; };
+static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) +{ + return container_of(man, struct amdgpu_vram_mgr, manager); +} + struct amdgpu_gtt_mgr { struct ttm_resource_manager manager; struct drm_mm mm; spinlock_t lock; atomic64_t available; + unsigned long size; };
+static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) +{ + return container_of(man, struct amdgpu_gtt_mgr, manager); +} + struct amdgpu_mman { struct ttm_bo_device bdev; bool mem_global_referenced; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 7882efd275d1..d4aa2aa49b4f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -28,11 +28,6 @@ #include "amdgpu_atomfirmware.h" #include "atom.h"
-static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) -{ - return container_of(man, struct amdgpu_vram_mgr, manager); -} - static inline struct amdgpu_device *to_amdgpu_device(struct amdgpu_vram_mgr *mgr) { return container_of(mgr, struct amdgpu_device, mman.vram_mgr); @@ -180,11 +175,12 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC; man->default_caching = TTM_PL_FLAG_WC;
- ttm_resource_manager_init(man, adev->gmc.real_vram_size >> PAGE_SHIFT); + ttm_resource_manager_init(man);
man->func = &amdgpu_vram_mgr_func;
- drm_mm_init(&mgr->mm, 0, man->size); + mgr->size = adev->gmc.real_vram_size >> PAGE_SHIFT; + drm_mm_init(&mgr->mm, 0, mgr->size); spin_lock_init(&mgr->lock);
/* Add the two VRAM-related sysfs files */ @@ -325,7 +321,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
lpfn = place->lpfn; if (!lpfn) - lpfn = man->size; + lpfn = mgr->size;
max_bytes = adev->gmc.mc_vram_size; if (tbo->type != ttm_bo_type_kernel) @@ -600,8 +596,8 @@ static void amdgpu_vram_mgr_debug(struct ttm_resource_manager *man, 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(man) >> 20, + drm_printf(printer, "man size:%lu pages, ram usage:%lluMB, vis usage:%lluMB\n", + mgr->size, amdgpu_vram_mgr_usage(man) >> 20, amdgpu_vram_mgr_vis_usage(man) >> 20); }
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c index e6a30865a00b..93685a376a50 100644 --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c @@ -175,8 +175,7 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) man->func = &nouveau_vram_manager; man->use_io_reserve_lru = true;
- ttm_resource_manager_init(man, - drm->gem.vram_available >> PAGE_SHIFT); + ttm_resource_manager_init(man); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, man); ttm_resource_manager_set_used(man, true); return 0; @@ -237,7 +236,7 @@ nouveau_ttm_init_gtt(struct nouveau_drm *drm) man->available_caching = available_caching; man->default_caching = default_caching; man->use_tt = true; - ttm_resource_manager_init(man, size_pages); + ttm_resource_manager_init(man); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_TT, man); ttm_resource_manager_set_used(man, true); return 0; diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 7f5dfe04789e..00258d158cfe 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c @@ -228,7 +228,7 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data,
man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM);
- args->vram_size = (u64)man->size << PAGE_SHIFT; + args->vram_size = (u64)ttm_range_man_size(man) << PAGE_SHIFT; args->vram_visible = rdev->mc.visible_vram_size; args->vram_visible -= rdev->vram_pin_size; args->gart_size = rdev->mc.gtt_size; diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 3355b69b13d1..e41ec62ff944 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c @@ -843,9 +843,8 @@ void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size) if (!rdev->mman.initialized) return;
- man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM); /* this just adjusts TTM size idea, which sets lpfn to the correct value */ - man->size = size >> PAGE_SHIFT; + ttm_range_man_adjust_size(man, size >> PAGE_SHIFT); }
static vm_fault_t radeon_ttm_fault(struct vm_fault *vmf) diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index ad09329b62d3..cf8176bce4f6 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -82,7 +82,6 @@ void ttm_resource_manager_debug(struct ttm_resource_manager *man, { drm_printf(p, " use_type: %d\n", man->use_type); drm_printf(p, " use_tt: %d\n", man->use_tt); - drm_printf(p, " size: %llu\n", man->size); drm_printf(p, " available_caching: 0x%08X\n", man->available_caching); drm_printf(p, " default_caching: 0x%08X\n", man->default_caching); if (man->func && man->func->debug) @@ -1468,8 +1467,7 @@ int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type) } EXPORT_SYMBOL(ttm_bo_evict_mm);
-void ttm_resource_manager_init(struct ttm_resource_manager *man, - unsigned long p_size) +void ttm_resource_manager_init(struct ttm_resource_manager *man) { unsigned i;
@@ -1477,7 +1475,6 @@ void ttm_resource_manager_init(struct ttm_resource_manager *man, mutex_init(&man->io_reserve_mutex); spin_lock_init(&man->move_lock); INIT_LIST_HEAD(&man->io_reserve_lru); - man->size = p_size;
for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) INIT_LIST_HEAD(&man->lru[i]); @@ -1590,7 +1587,7 @@ static void ttm_bo_init_sysman(struct ttm_bo_device *bdev) man->available_caching = TTM_PL_MASK_CACHING; man->default_caching = TTM_PL_FLAG_CACHED;
- ttm_resource_manager_init(man, 0); + ttm_resource_manager_init(man); ttm_set_driver_manager(bdev, TTM_PL_SYSTEM, man); ttm_resource_manager_set_used(man, true); } diff --git a/drivers/gpu/drm/ttm/ttm_range_manager.c b/drivers/gpu/drm/ttm/ttm_range_manager.c index 274a05ca13d3..0dc4b17cc3dc 100644 --- a/drivers/gpu/drm/ttm/ttm_range_manager.c +++ b/drivers/gpu/drm/ttm/ttm_range_manager.c @@ -47,6 +47,7 @@ struct ttm_range_manager { struct ttm_resource_manager manager; struct drm_mm mm; spinlock_t lock; + uint64_t size; };
static inline struct ttm_range_manager *to_range_manager(struct ttm_resource_manager *man) @@ -68,7 +69,7 @@ static int ttm_range_man_get_node(struct ttm_resource_manager *man,
lpfn = place->lpfn; if (!lpfn) - lpfn = man->size; + lpfn = rman->size;
node = kzalloc(sizeof(*node), GFP_KERNEL); if (!node) @@ -133,8 +134,9 @@ int ttm_range_man_init(struct ttm_bo_device *bdev,
man->func = &ttm_range_manager_func;
- ttm_resource_manager_init(man, p_size); + ttm_resource_manager_init(man);
+ rman->size = p_size; drm_mm_init(&rman->mm, 0, p_size); spin_lock_init(&rman->lock);
@@ -185,3 +187,18 @@ static const struct ttm_resource_manager_func ttm_range_manager_func = { .put_node = ttm_range_man_put_node, .debug = ttm_range_man_debug }; + +void ttm_range_man_adjust_size(struct ttm_resource_manager *man, + unsigned long size) +{ + struct ttm_range_manager *rman = to_range_manager(man); + rman->size = size; +} +EXPORT_SYMBOL(ttm_range_man_adjust_size); + +unsigned long ttm_range_man_size(struct ttm_resource_manager *man) +{ + struct ttm_range_manager *rman = to_range_manager(man); + return rman->size; +} +EXPORT_SYMBOL(ttm_range_man_size); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c index 3fea7a6c7cfa..a7a2deae2277 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c @@ -116,7 +116,7 @@ int vmw_gmrid_man_init(struct vmw_private *dev_priv, int type) man->default_caching = TTM_PL_FLAG_CACHED; /* TODO: This is most likely not correct */ man->use_tt = true; - ttm_resource_manager_init(man, 0); + ttm_resource_manager_init(man); spin_lock_init(&gman->lock); gman->used_gmr_pages = 0; ida_init(&gman->gmr_ida); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c b/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c index f594e2e6ab7e..74cdee48b191 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c @@ -19,6 +19,7 @@ struct vmw_thp_manager { struct ttm_resource_manager manager; struct drm_mm mm; spinlock_t lock; + uint64_t size; };
static struct vmw_thp_manager *to_thp_manager(struct ttm_resource_manager *man) @@ -63,7 +64,7 @@ static int vmw_thp_get_node(struct ttm_resource_manager *man,
lpfn = place->lpfn; if (!lpfn) - lpfn = man->size; + lpfn = rman->size;
mode = DRM_MM_INSERT_BEST; if (place->flags & TTM_PL_FLAG_TOPDOWN) @@ -134,10 +135,10 @@ int vmw_thp_init(struct vmw_private *dev_priv) man->available_caching = TTM_PL_FLAG_CACHED; man->default_caching = TTM_PL_FLAG_CACHED;
- ttm_resource_manager_init(man, - dev_priv->vram_size >> PAGE_SHIFT); + ttm_resource_manager_init(man);
- drm_mm_init(&rman->mm, 0, man->size); + rman->size = dev_priv->vram_size >> PAGE_SHIFT; + drm_mm_init(&rman->mm, 0, rman->size); spin_lock_init(&rman->lock);
ttm_set_driver_manager(&dev_priv->bdev, TTM_PL_VRAM, &rman->manager); diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index 770ad2195875..e4bf93482b59 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h @@ -537,12 +537,10 @@ int ttm_bo_create(struct ttm_bo_device *bdev, unsigned long size, * ttm_resource_manager_init * * @man: memory manager object to init - * @p_size: size managed area in pages. * * Initialise core parts of a manager object. */ -void ttm_resource_manager_init(struct ttm_resource_manager *man, - unsigned long p_size); +void ttm_resource_manager_init(struct ttm_resource_manager *man);
/** * ttm_bo_evict_mm diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index eb1c3312e175..c719b4aa3793 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -116,7 +116,6 @@ struct ttm_resource_manager_func { * managed by this memory type. * @gpu_offset: If used, the GPU offset of the first managed page of * fixed memory or the first managed location in an aperture. - * @size: Size of the managed region. * @available_caching: A mask of available caching types, TTM_PL_FLAG_XX, * as defined in ttm_placement_common.h * @default_caching: The default caching policy used for a buffer object @@ -142,7 +141,6 @@ struct ttm_resource_manager { */ bool use_type; bool use_tt; - uint64_t size; uint32_t available_caching; uint32_t default_caching; const struct ttm_resource_manager_func *func; @@ -883,4 +881,22 @@ int ttm_range_man_fini(struct ttm_bo_device *bdev, void ttm_resource_manager_debug(struct ttm_resource_manager *man, struct drm_printer *p);
+/** + * ttm_range_man_adjust_size + * + * @man: manager to adjust size for + * @p_size: new size. + */ +void ttm_range_man_adjust_size(struct ttm_resource_manager *man, + unsigned long p_size); + +/** + * ttm_range_man_size + * + * @man: manager to get size for + * Returns: + * size of range manager. + */ +unsigned long ttm_range_man_size(struct ttm_resource_manager *man); + #endif
Hi Dave,
I love your patch! Perhaps something to improve:
[auto build test WARNING on drm-tip/drm-tip] [cannot apply to drm-intel/for-linux-next tegra-drm/drm/tegra/for-next linus/master drm/drm-next drm-exynos/exynos-drm-next v5.8 next-20200806] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Dave-Airlie/drm-amdgpu-ttm-move-vra... base: git://anongit.freedesktop.org/drm/drm-tip drm-tip config: x86_64-randconfig-a015-20200806 (attached as .config) compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot lkp@intel.com
All warnings (new ones prefixed by >>):
drivers/gpu/drm/radeon/radeon_ttm.c:754:5: warning: no previous prototype for function 'radeon_ttm_init' [-Wmissing-prototypes] int radeon_ttm_init(struct radeon_device *rdev) ^ drivers/gpu/drm/radeon/radeon_ttm.c:754:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int radeon_ttm_init(struct radeon_device *rdev) ^ static drivers/gpu/drm/radeon/radeon_ttm.c:812:6: warning: no previous prototype for function 'radeon_ttm_fini' [-Wmissing-prototypes] void radeon_ttm_fini(struct radeon_device *rdev) ^ drivers/gpu/drm/radeon/radeon_ttm.c:812:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void radeon_ttm_fini(struct radeon_device *rdev) ^ static
drivers/gpu/drm/radeon/radeon_ttm.c:845:28: warning: variable 'man' is uninitialized when used here [-Wuninitialized]
ttm_range_man_adjust_size(man, size >> PAGE_SHIFT); ^~~ drivers/gpu/drm/radeon/radeon_ttm.c:839:34: note: initialize the variable 'man' to silence this warning struct ttm_resource_manager *man; ^ = NULL drivers/gpu/drm/radeon/radeon_ttm.c:872:5: warning: no previous prototype for function 'radeon_mmap' [-Wmissing-prototypes] int radeon_mmap(struct file *filp, struct vm_area_struct *vma) ^ drivers/gpu/drm/radeon/radeon_ttm.c:872:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int radeon_mmap(struct file *filp, struct vm_area_struct *vma) ^ static 4 warnings generated.
vim +/man +845 drivers/gpu/drm/radeon/radeon_ttm.c
811
812 void radeon_ttm_fini(struct radeon_device *rdev)
813 { 814 int r; 815 816 if (!rdev->mman.initialized) 817 return; 818 radeon_ttm_debugfs_fini(rdev); 819 if (rdev->stolen_vga_memory) { 820 r = radeon_bo_reserve(rdev->stolen_vga_memory, false); 821 if (r == 0) { 822 radeon_bo_unpin(rdev->stolen_vga_memory); 823 radeon_bo_unreserve(rdev->stolen_vga_memory); 824 } 825 radeon_bo_unref(&rdev->stolen_vga_memory); 826 } 827 ttm_range_man_fini(&rdev->mman.bdev, TTM_PL_VRAM); 828 ttm_range_man_fini(&rdev->mman.bdev, TTM_PL_TT); 829 ttm_bo_device_release(&rdev->mman.bdev); 830 radeon_gart_fini(rdev); 831 rdev->mman.initialized = false; 832 DRM_INFO("radeon: ttm finalized\n"); 833 } 834 835 /* this should only be called at bootup or when userspace 836 * isn't running */ 837 void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size) 838 { 839 struct ttm_resource_manager *man; 840 841 if (!rdev->mman.initialized) 842 return; 843 844 /* this just adjusts TTM size idea, which sets lpfn to the correct value */
845 ttm_range_man_adjust_size(man, size >> PAGE_SHIFT);
846 } 847
--- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Dave,
I love your patch! Perhaps something to improve:
[auto build test WARNING on drm-tip/drm-tip] [cannot apply to drm-intel/for-linux-next tegra-drm/drm/tegra/for-next linus/master drm/drm-next drm-exynos/exynos-drm-next v5.8 next-20200806] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Dave-Airlie/drm-amdgpu-ttm-move-vra... base: git://anongit.freedesktop.org/drm/drm-tip drm-tip config: arc-randconfig-r005-20200805 (attached as .config) compiler: arc-elf-gcc (GCC) 9.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arc
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot lkp@intel.com
All warnings (new ones prefixed by >>):
In file included from drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h:29, from drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h:26, from drivers/gpu/drm/amd/amdgpu/amdgpu.h:43, from drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:38: drivers/gpu/drm/amd/amdgpu/amdgpu_object.c: In function 'amdgpu_bo_validate_size':
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:473:12: warning: format '%llu' expects argument of type 'long long unsigned int', but argument 4 has type 'long unsigned int' [-Wformat=]
473 | DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/drm/drm_print.h:490:25: note: in definition of macro 'DRM_DEBUG' 490 | __drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__) | ^~~ drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:473:54: note: format string is defined here 473 | DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size, | ~~~^ | | | long long unsigned int | %lu In file included from drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:38: At top level: drivers/gpu/drm/amd/amdgpu/amdgpu.h:192:19: warning: 'debug_evictions' defined but not used [-Wunused-const-variable=] 192 | static const bool debug_evictions; /* = false */ | ^~~~~~~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/amdgpu.h:191:18: warning: 'sched_policy' defined but not used [-Wunused-const-variable=] 191 | static const int sched_policy = KFD_SCHED_POLICY_HWS; | ^~~~~~~~~~~~ In file included from drivers/gpu/drm/amd/amdgpu/../display/dc/dc_types.h:33, from drivers/gpu/drm/amd/amdgpu/../display/dc/dm_services_types.h:30, from drivers/gpu/drm/amd/amdgpu/../include/dm_pp_interface.h:26, from drivers/gpu/drm/amd/amdgpu/amdgpu.h:65, from drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:38: drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:76:32: warning: 'dc_fixpt_ln2_div_2' defined but not used [-Wunused-const-variable=] 76 | static const struct fixed31_32 dc_fixpt_ln2_div_2 = { 1488522236LL }; | ^~~~~~~~~~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:75:32: warning: 'dc_fixpt_ln2' defined but not used [-Wunused-const-variable=] 75 | static const struct fixed31_32 dc_fixpt_ln2 = { 2977044471LL }; | ^~~~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:74:32: warning: 'dc_fixpt_e' defined but not used [-Wunused-const-variable=] 74 | static const struct fixed31_32 dc_fixpt_e = { 11674931555LL }; | ^~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:73:32: warning: 'dc_fixpt_two_pi' defined but not used [-Wunused-const-variable=] 73 | static const struct fixed31_32 dc_fixpt_two_pi = { 26986075409LL }; | ^~~~~~~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:72:32: warning: 'dc_fixpt_pi' defined but not used [-Wunused-const-variable=] 72 | static const struct fixed31_32 dc_fixpt_pi = { 13493037705LL }; | ^~~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:67:32: warning: 'dc_fixpt_zero' defined but not used [-Wunused-const-variable=] 67 | static const struct fixed31_32 dc_fixpt_zero = { 0 }; | ^~~~~~~~~~~~~
vim +473 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
aa1d562e645d254 Junwei Zhang 2016-09-08 440 79c631239a83aeb Andrey Grodzovsky 2017-11-10 441 /* Validate bo size is bit bigger then the request domain */ 79c631239a83aeb Andrey Grodzovsky 2017-11-10 442 static bool amdgpu_bo_validate_size(struct amdgpu_device *adev, 79c631239a83aeb Andrey Grodzovsky 2017-11-10 443 unsigned long size, u32 domain) 79c631239a83aeb Andrey Grodzovsky 2017-11-10 444 { 89e1ba9e4973560 Dave Airlie 2020-08-07 445 unsigned long mgr_size = 0; 79c631239a83aeb Andrey Grodzovsky 2017-11-10 446 /* 79c631239a83aeb Andrey Grodzovsky 2017-11-10 447 * If GTT is part of requested domains the check must succeed to 79c631239a83aeb Andrey Grodzovsky 2017-11-10 448 * allow fall back to GTT 79c631239a83aeb Andrey Grodzovsky 2017-11-10 449 */ 79c631239a83aeb Andrey Grodzovsky 2017-11-10 450 if (domain & AMDGPU_GEM_DOMAIN_GTT) { 89e1ba9e4973560 Dave Airlie 2020-08-07 451 mgr_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; 79c631239a83aeb Andrey Grodzovsky 2017-11-10 452 89e1ba9e4973560 Dave Airlie 2020-08-07 453 if (size < (mgr_size << PAGE_SHIFT)) 79c631239a83aeb Andrey Grodzovsky 2017-11-10 454 return true; 79c631239a83aeb Andrey Grodzovsky 2017-11-10 455 else 79c631239a83aeb Andrey Grodzovsky 2017-11-10 456 goto fail; 79c631239a83aeb Andrey Grodzovsky 2017-11-10 457 } 79c631239a83aeb Andrey Grodzovsky 2017-11-10 458 79c631239a83aeb Andrey Grodzovsky 2017-11-10 459 if (domain & AMDGPU_GEM_DOMAIN_VRAM) { 89e1ba9e4973560 Dave Airlie 2020-08-07 460 mgr_size = to_vram_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; 79c631239a83aeb Andrey Grodzovsky 2017-11-10 461 89e1ba9e4973560 Dave Airlie 2020-08-07 462 if (size < (mgr_size << PAGE_SHIFT)) 79c631239a83aeb Andrey Grodzovsky 2017-11-10 463 return true; 79c631239a83aeb Andrey Grodzovsky 2017-11-10 464 else 79c631239a83aeb Andrey Grodzovsky 2017-11-10 465 goto fail; 79c631239a83aeb Andrey Grodzovsky 2017-11-10 466 } 79c631239a83aeb Andrey Grodzovsky 2017-11-10 467 79c631239a83aeb Andrey Grodzovsky 2017-11-10 468 79c631239a83aeb Andrey Grodzovsky 2017-11-10 469 /* TODO add more domains checks, such as AMDGPU_GEM_DOMAIN_CPU */ 79c631239a83aeb Andrey Grodzovsky 2017-11-10 470 return true; 79c631239a83aeb Andrey Grodzovsky 2017-11-10 471 79c631239a83aeb Andrey Grodzovsky 2017-11-10 472 fail: 299c776cebb01c1 Michel Dänzer 2017-11-15 @473 DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size, 89e1ba9e4973560 Dave Airlie 2020-08-07 474 mgr_size << PAGE_SHIFT); 79c631239a83aeb Andrey Grodzovsky 2017-11-10 475 return false; 79c631239a83aeb Andrey Grodzovsky 2017-11-10 476 } 79c631239a83aeb Andrey Grodzovsky 2017-11-10 477
--- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Dave,
I love your patch! Perhaps something to improve:
[auto build test WARNING on drm-tip/drm-tip] [cannot apply to drm-intel/for-linux-next tegra-drm/drm/tegra/for-next linus/master drm/drm-next drm-exynos/exynos-drm-next v5.8 next-20200806] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Dave-Airlie/drm-amdgpu-ttm-move-vra... base: git://anongit.freedesktop.org/drm/drm-tip drm-tip config: x86_64-randconfig-a004-20200805 (attached as .config) compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot lkp@intel.com
All warnings (new ones prefixed by >>):
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:474:5: warning: format specifies type 'unsigned long long' but the argument has type 'unsigned long' [-Wformat]
mgr_size << PAGE_SHIFT); ^~~~~~~~~~~~~~~~~~~~~~ include/drm/drm_print.h:490:32: note: expanded from macro 'DRM_DEBUG' __drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__) ~~~ ^~~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:493:2: warning: Please enable CONFIG_MTRR and CONFIG_X86_PAT for better performance thanks to write-combining [-W#warnings] #warning Please enable CONFIG_MTRR and CONFIG_X86_PAT for better performance \ ^ 2 warnings generated.
vim +474 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
440 441 /* Validate bo size is bit bigger then the request domain */ 442 static bool amdgpu_bo_validate_size(struct amdgpu_device *adev, 443 unsigned long size, u32 domain) 444 { 445 unsigned long mgr_size = 0; 446 /* 447 * If GTT is part of requested domains the check must succeed to 448 * allow fall back to GTT 449 */ 450 if (domain & AMDGPU_GEM_DOMAIN_GTT) { 451 mgr_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; 452 453 if (size < (mgr_size << PAGE_SHIFT)) 454 return true; 455 else 456 goto fail; 457 } 458 459 if (domain & AMDGPU_GEM_DOMAIN_VRAM) { 460 mgr_size = to_vram_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; 461 462 if (size < (mgr_size << PAGE_SHIFT)) 463 return true; 464 else 465 goto fail; 466 } 467 468 469 /* TODO add more domains checks, such as AMDGPU_GEM_DOMAIN_CPU */ 470 return true; 471 472 fail: 473 DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size,
474 mgr_size << PAGE_SHIFT);
475 return false; 476 } 477
--- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Am 07.08.20 um 01:34 schrieb Dave Airlie:
From: Dave Airlie airlied@redhat.com
This is a bit more involved that it looked, the range manager needs accessors adding and amdgpu needs a bit of a refactor.
drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 21 ++++++++----------- drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 5 +++-- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 13 ++++++------ drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 12 +++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 16 ++++++-------- drivers/gpu/drm/nouveau/nouveau_ttm.c | 5 ++--- drivers/gpu/drm/radeon/radeon_gem.c | 2 +- drivers/gpu/drm/radeon/radeon_ttm.c | 3 +-- drivers/gpu/drm/ttm/ttm_bo.c | 7 ++----- drivers/gpu/drm/ttm/ttm_range_manager.c | 21 +++++++++++++++++-- drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c | 2 +- drivers/gpu/drm/vmwgfx/vmwgfx_thp.c | 9 ++++---- include/drm/ttm/ttm_bo_api.h | 4 +--- include/drm/ttm/ttm_bo_driver.h | 20 ++++++++++++++++-- 15 files changed, 87 insertions(+), 55 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index 010518148ef8..b769b43b2fbc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c @@ -24,11 +24,6 @@
#include "amdgpu.h"
-static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) -{
- return container_of(man, struct amdgpu_gtt_mgr, manager);
-}
- struct amdgpu_gtt_node { struct drm_mm_node node; struct ttm_buffer_object *tbo;
@@ -48,8 +43,9 @@ static ssize_t amdgpu_mem_info_gtt_total_show(struct device *dev, struct drm_device *ddev = dev_get_drvdata(dev); struct amdgpu_device *adev = ddev->dev_private; struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT);
- return snprintf(buf, PAGE_SIZE, "%llu\n",
man->size * PAGE_SIZE);
struct amdgpu_gtt_mgr *gtt_mgr = to_gtt_mgr(man);
return snprintf(buf, PAGE_SIZE, "%lu\n",
gtt_mgr->size * PAGE_SIZE);
}
/**
@@ -96,13 +92,14 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) man->available_caching = TTM_PL_MASK_CACHING; man->default_caching = TTM_PL_FLAG_CACHED;
- ttm_resource_manager_init(man, gtt_size >> PAGE_SHIFT);
mgr->size = gtt_size >> PAGE_SHIFT;
ttm_resource_manager_init(man);
start = AMDGPU_GTT_MAX_TRANSFER_SIZE * AMDGPU_GTT_NUM_TRANSFER_WINDOWS; size = (adev->gmc.gart_size >> PAGE_SHIFT) - start; drm_mm_init(&mgr->mm, start, size); spin_lock_init(&mgr->lock);
- atomic64_set(&mgr->available, gtt_size >> PAGE_SHIFT);
atomic64_set(&mgr->available, mgr->size);
ret = device_create_file(adev->dev, &dev_attr_mem_info_gtt_total); if (ret) {
@@ -264,7 +261,7 @@ static void amdgpu_gtt_mgr_del(struct ttm_resource_manager *man, uint64_t amdgpu_gtt_mgr_usage(struct ttm_resource_manager *man) { struct amdgpu_gtt_mgr *mgr = to_gtt_mgr(man);
- s64 result = man->size - atomic64_read(&mgr->available);
s64 result = mgr->size - atomic64_read(&mgr->available);
return (result > 0 ? result : 0) * PAGE_SIZE; }
@@ -305,8 +302,8 @@ static void amdgpu_gtt_mgr_debug(struct ttm_resource_manager *man, drm_mm_print(&mgr->mm, printer); spin_unlock(&mgr->lock);
- drm_printf(printer, "man size:%llu pages, gtt available:%lld pages, usage:%lluMB\n",
man->size, (u64)atomic64_read(&mgr->available),
- drm_printf(printer, "man size:%lu pages, gtt available:%lld pages, usage:%lluMB\n",
amdgpu_gtt_mgr_usage(man) >> 20); }mgr->size, (u64)atomic64_read(&mgr->available),
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index fff9c013f337..732e4004777e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -608,7 +608,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file min(adev->gmc.visible_vram_size - atomic64_read(&adev->visible_pin_size), vram_gtt.vram_size);
vram_gtt.gtt_size = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT)->size;
vram_gtt.gtt_size *= PAGE_SIZE; vram_gtt.gtt_size -= atomic64_read(&adev->gart_pin_size); return copy_to_user(out, &vram_gtt,vram_gtt.gtt_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size;
@@ -620,6 +620,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM); struct ttm_resource_manager *gtt_man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT);
memset(&mem, 0, sizeof(mem)); mem.vram.total_heap_size = adev->gmc.real_vram_size; mem.vram.usable_heap_size = adev->gmc.real_vram_size -struct amdgpu_gtt_mgr *gtt_mgr = to_gtt_mgr(gtt_man);
@@ -640,7 +641,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file mem.cpu_accessible_vram.max_allocation = mem.cpu_accessible_vram.usable_heap_size * 3 / 4;
mem.gtt.total_heap_size = gtt_man->size;
mem.gtt.total_heap_size *= PAGE_SIZE; mem.gtt.usable_heap_size = mem.gtt.total_heap_size - atomic64_read(&adev->gart_pin_size);mem.gtt.total_heap_size = gtt_mgr->size;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 43f4966331dd..33957d829197 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -442,25 +442,24 @@ void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr, static bool amdgpu_bo_validate_size(struct amdgpu_device *adev, unsigned long size, u32 domain) {
- struct ttm_resource_manager *man = NULL;
- unsigned long mgr_size = 0; /*
*/ if (domain & AMDGPU_GEM_DOMAIN_GTT) {
- If GTT is part of requested domains the check must succeed to
- allow fall back to GTT
man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT);
mgr_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size;
if (size < (man->size << PAGE_SHIFT))
if (size < (mgr_size << PAGE_SHIFT)) return true;
else goto fail; }
if (domain & AMDGPU_GEM_DOMAIN_VRAM) {
man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM);
mgr_size = to_vram_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size;
if (size < (man->size << PAGE_SHIFT))
else goto fail;if (size < (mgr_size << PAGE_SHIFT)) return true;
@@ -472,7 +471,7 @@ static bool amdgpu_bo_validate_size(struct amdgpu_device *adev,
fail: DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size,
man->size << PAGE_SHIFT);
return false; }mgr_size << PAGE_SHIFT);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 28557839f132..ca312ef8c2f8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -2045,7 +2045,7 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable) size = adev->gmc.real_vram_size; else size = adev->gmc.visible_vram_size;
- man->size = size >> PAGE_SHIFT;
- to_vram_mgr(man)->size = size >> PAGE_SHIFT; adev->mman.buffer_funcs_enabled = enable; }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 4a6d92f27b6e..5636ef2b1707 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -47,15 +47,27 @@ struct amdgpu_vram_mgr { spinlock_t lock; atomic64_t usage; atomic64_t vis_usage;
- unsigned long size; };
+static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) +{
- return container_of(man, struct amdgpu_vram_mgr, manager);
+}
- struct amdgpu_gtt_mgr { struct ttm_resource_manager manager; struct drm_mm mm; spinlock_t lock; atomic64_t available;
- unsigned long size;
Those should probably better be uint64_t, same for above.
Apart from that looks rather good to me on first glance.
Christian.
};
+static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) +{
- return container_of(man, struct amdgpu_gtt_mgr, manager);
+}
- struct amdgpu_mman { struct ttm_bo_device bdev; bool mem_global_referenced;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 7882efd275d1..d4aa2aa49b4f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -28,11 +28,6 @@ #include "amdgpu_atomfirmware.h" #include "atom.h"
-static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) -{
- return container_of(man, struct amdgpu_vram_mgr, manager);
-}
- static inline struct amdgpu_device *to_amdgpu_device(struct amdgpu_vram_mgr *mgr) { return container_of(mgr, struct amdgpu_device, mman.vram_mgr);
@@ -180,11 +175,12 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC; man->default_caching = TTM_PL_FLAG_WC;
- ttm_resource_manager_init(man, adev->gmc.real_vram_size >> PAGE_SHIFT);
ttm_resource_manager_init(man);
man->func = &amdgpu_vram_mgr_func;
- drm_mm_init(&mgr->mm, 0, man->size);
mgr->size = adev->gmc.real_vram_size >> PAGE_SHIFT;
drm_mm_init(&mgr->mm, 0, mgr->size); spin_lock_init(&mgr->lock);
/* Add the two VRAM-related sysfs files */
@@ -325,7 +321,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
lpfn = place->lpfn; if (!lpfn)
lpfn = man->size;
lpfn = mgr->size;
max_bytes = adev->gmc.mc_vram_size; if (tbo->type != ttm_bo_type_kernel)
@@ -600,8 +596,8 @@ static void amdgpu_vram_mgr_debug(struct ttm_resource_manager *man, 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(man) >> 20,
- drm_printf(printer, "man size:%lu pages, ram usage:%lluMB, vis usage:%lluMB\n",
amdgpu_vram_mgr_vis_usage(man) >> 20); }mgr->size, amdgpu_vram_mgr_usage(man) >> 20,
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c index e6a30865a00b..93685a376a50 100644 --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c @@ -175,8 +175,7 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) man->func = &nouveau_vram_manager; man->use_io_reserve_lru = true;
ttm_resource_manager_init(man,
drm->gem.vram_available >> PAGE_SHIFT);
ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, man); ttm_resource_manager_set_used(man, true); return 0;ttm_resource_manager_init(man);
@@ -237,7 +236,7 @@ nouveau_ttm_init_gtt(struct nouveau_drm *drm) man->available_caching = available_caching; man->default_caching = default_caching; man->use_tt = true;
- ttm_resource_manager_init(man, size_pages);
- ttm_resource_manager_init(man); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_TT, man); ttm_resource_manager_set_used(man, true); return 0;
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 7f5dfe04789e..00258d158cfe 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c @@ -228,7 +228,7 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data,
man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM);
- args->vram_size = (u64)man->size << PAGE_SHIFT;
- args->vram_size = (u64)ttm_range_man_size(man) << PAGE_SHIFT; args->vram_visible = rdev->mc.visible_vram_size; args->vram_visible -= rdev->vram_pin_size; args->gart_size = rdev->mc.gtt_size;
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 3355b69b13d1..e41ec62ff944 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c @@ -843,9 +843,8 @@ void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size) if (!rdev->mman.initialized) return;
- man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM); /* this just adjusts TTM size idea, which sets lpfn to the correct value */
- man->size = size >> PAGE_SHIFT;
ttm_range_man_adjust_size(man, size >> PAGE_SHIFT); }
static vm_fault_t radeon_ttm_fault(struct vm_fault *vmf)
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index ad09329b62d3..cf8176bce4f6 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -82,7 +82,6 @@ void ttm_resource_manager_debug(struct ttm_resource_manager *man, { drm_printf(p, " use_type: %d\n", man->use_type); drm_printf(p, " use_tt: %d\n", man->use_tt);
- drm_printf(p, " size: %llu\n", man->size); drm_printf(p, " available_caching: 0x%08X\n", man->available_caching); drm_printf(p, " default_caching: 0x%08X\n", man->default_caching); if (man->func && man->func->debug)
@@ -1468,8 +1467,7 @@ int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type) } EXPORT_SYMBOL(ttm_bo_evict_mm);
-void ttm_resource_manager_init(struct ttm_resource_manager *man,
unsigned long p_size)
+void ttm_resource_manager_init(struct ttm_resource_manager *man) { unsigned i;
@@ -1477,7 +1475,6 @@ void ttm_resource_manager_init(struct ttm_resource_manager *man, mutex_init(&man->io_reserve_mutex); spin_lock_init(&man->move_lock); INIT_LIST_HEAD(&man->io_reserve_lru);
man->size = p_size;
for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) INIT_LIST_HEAD(&man->lru[i]);
@@ -1590,7 +1587,7 @@ static void ttm_bo_init_sysman(struct ttm_bo_device *bdev) man->available_caching = TTM_PL_MASK_CACHING; man->default_caching = TTM_PL_FLAG_CACHED;
- ttm_resource_manager_init(man, 0);
- ttm_resource_manager_init(man); ttm_set_driver_manager(bdev, TTM_PL_SYSTEM, man); ttm_resource_manager_set_used(man, true); }
diff --git a/drivers/gpu/drm/ttm/ttm_range_manager.c b/drivers/gpu/drm/ttm/ttm_range_manager.c index 274a05ca13d3..0dc4b17cc3dc 100644 --- a/drivers/gpu/drm/ttm/ttm_range_manager.c +++ b/drivers/gpu/drm/ttm/ttm_range_manager.c @@ -47,6 +47,7 @@ struct ttm_range_manager { struct ttm_resource_manager manager; struct drm_mm mm; spinlock_t lock;
uint64_t size; };
static inline struct ttm_range_manager *to_range_manager(struct ttm_resource_manager *man)
@@ -68,7 +69,7 @@ static int ttm_range_man_get_node(struct ttm_resource_manager *man,
lpfn = place->lpfn; if (!lpfn)
lpfn = man->size;
lpfn = rman->size;
node = kzalloc(sizeof(*node), GFP_KERNEL); if (!node)
@@ -133,8 +134,9 @@ int ttm_range_man_init(struct ttm_bo_device *bdev,
man->func = &ttm_range_manager_func;
- ttm_resource_manager_init(man, p_size);
ttm_resource_manager_init(man);
rman->size = p_size; drm_mm_init(&rman->mm, 0, p_size); spin_lock_init(&rman->lock);
@@ -185,3 +187,18 @@ static const struct ttm_resource_manager_func ttm_range_manager_func = { .put_node = ttm_range_man_put_node, .debug = ttm_range_man_debug };
+void ttm_range_man_adjust_size(struct ttm_resource_manager *man,
unsigned long size)
+{
- struct ttm_range_manager *rman = to_range_manager(man);
- rman->size = size;
+} +EXPORT_SYMBOL(ttm_range_man_adjust_size);
+unsigned long ttm_range_man_size(struct ttm_resource_manager *man) +{
- struct ttm_range_manager *rman = to_range_manager(man);
- return rman->size;
+} +EXPORT_SYMBOL(ttm_range_man_size); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c index 3fea7a6c7cfa..a7a2deae2277 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c @@ -116,7 +116,7 @@ int vmw_gmrid_man_init(struct vmw_private *dev_priv, int type) man->default_caching = TTM_PL_FLAG_CACHED; /* TODO: This is most likely not correct */ man->use_tt = true;
- ttm_resource_manager_init(man, 0);
- ttm_resource_manager_init(man); spin_lock_init(&gman->lock); gman->used_gmr_pages = 0; ida_init(&gman->gmr_ida);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c b/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c index f594e2e6ab7e..74cdee48b191 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c @@ -19,6 +19,7 @@ struct vmw_thp_manager { struct ttm_resource_manager manager; struct drm_mm mm; spinlock_t lock;
uint64_t size; };
static struct vmw_thp_manager *to_thp_manager(struct ttm_resource_manager *man)
@@ -63,7 +64,7 @@ static int vmw_thp_get_node(struct ttm_resource_manager *man,
lpfn = place->lpfn; if (!lpfn)
lpfn = man->size;
lpfn = rman->size;
mode = DRM_MM_INSERT_BEST; if (place->flags & TTM_PL_FLAG_TOPDOWN)
@@ -134,10 +135,10 @@ int vmw_thp_init(struct vmw_private *dev_priv) man->available_caching = TTM_PL_FLAG_CACHED; man->default_caching = TTM_PL_FLAG_CACHED;
- ttm_resource_manager_init(man,
dev_priv->vram_size >> PAGE_SHIFT);
- ttm_resource_manager_init(man);
- drm_mm_init(&rman->mm, 0, man->size);
rman->size = dev_priv->vram_size >> PAGE_SHIFT;
drm_mm_init(&rman->mm, 0, rman->size); spin_lock_init(&rman->lock);
ttm_set_driver_manager(&dev_priv->bdev, TTM_PL_VRAM, &rman->manager);
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index 770ad2195875..e4bf93482b59 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h @@ -537,12 +537,10 @@ int ttm_bo_create(struct ttm_bo_device *bdev, unsigned long size,
- ttm_resource_manager_init
- @man: memory manager object to init
*/
- @p_size: size managed area in pages.
- Initialise core parts of a manager object.
-void ttm_resource_manager_init(struct ttm_resource_manager *man,
unsigned long p_size);
+void ttm_resource_manager_init(struct ttm_resource_manager *man);
/**
- ttm_bo_evict_mm
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index eb1c3312e175..c719b4aa3793 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -116,7 +116,6 @@ struct ttm_resource_manager_func {
- managed by this memory type.
- @gpu_offset: If used, the GPU offset of the first managed page of
- fixed memory or the first managed location in an aperture.
- @size: Size of the managed region.
- @available_caching: A mask of available caching types, TTM_PL_FLAG_XX,
- as defined in ttm_placement_common.h
- @default_caching: The default caching policy used for a buffer object
@@ -142,7 +141,6 @@ struct ttm_resource_manager { */ bool use_type; bool use_tt;
- uint64_t size; uint32_t available_caching; uint32_t default_caching; const struct ttm_resource_manager_func *func;
@@ -883,4 +881,22 @@ int ttm_range_man_fini(struct ttm_bo_device *bdev, void ttm_resource_manager_debug(struct ttm_resource_manager *man, struct drm_printer *p);
+/**
- ttm_range_man_adjust_size
- @man: manager to adjust size for
- @p_size: new size.
- */
+void ttm_range_man_adjust_size(struct ttm_resource_manager *man,
unsigned long p_size);
+/**
- ttm_range_man_size
- @man: manager to get size for
- Returns:
- size of range manager.
- */
+unsigned long ttm_range_man_size(struct ttm_resource_manager *man);
- #endif
From: Dave Airlie airlied@redhat.com
This moves the io lru tracking into the driver allocated structure.
Probably need to consider if we can move more stuff in there around the nouveau only io_lru functionality. --- drivers/gpu/drm/nouveau/nouveau_ttm.c | 24 +++++++++++++++++++++--- drivers/gpu/drm/ttm/ttm_bo.c | 11 ++++++++--- drivers/gpu/drm/ttm/ttm_bo_util.c | 24 +++++++++++++++--------- include/drm/ttm/ttm_bo_api.h | 3 +++ include/drm/ttm/ttm_bo_driver.h | 19 +++++++++++-------- 5 files changed, 58 insertions(+), 23 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c index 93685a376a50..86d74e590359 100644 --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c @@ -31,6 +31,16 @@
#include <core/tegra.h>
+struct nouveau_resource_manager { + struct ttm_resource_manager manager; + struct ttm_resource_manager_io_lru io_lru; +}; + +static inline struct nouveau_resource_manager *to_mgr(struct ttm_resource_manager *man) +{ + return container_of(man, struct nouveau_resource_manager, manager); +} + static void nouveau_manager_del(struct ttm_resource_manager *man, struct ttm_resource *reg) { @@ -63,9 +73,15 @@ nouveau_vram_manager_new(struct ttm_resource_manager *man, return 0; }
+static struct ttm_resource_manager_io_lru *nouveau_resource_io_lru(struct ttm_resource_manager *man) +{ + return &to_mgr(man)->io_lru; +} + const struct ttm_resource_manager_func nouveau_vram_manager = { .get_node = nouveau_vram_manager_new, .put_node = nouveau_manager_del, + .io_lru = nouveau_resource_io_lru, };
static int @@ -160,7 +176,8 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) { /* Some BARs do not support being ioremapped WC */ const u8 type = mmu->type[drm->ttm.type_vram].type; - struct ttm_resource_manager *man = kzalloc(sizeof(*man), GFP_KERNEL); + struct nouveau_resource_manager *nman = kzalloc(sizeof(*nman), GFP_KERNEL); + struct ttm_resource_manager *man = &nman->manager; if (!man) return -ENOMEM;
@@ -173,9 +190,9 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) }
man->func = &nouveau_vram_manager; - man->use_io_reserve_lru = true;
ttm_resource_manager_init(man); + ttm_resource_manager_io_lru_init(&nman->io_lru); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, man); ttm_resource_manager_set_used(man, true); return 0; @@ -193,11 +210,12 @@ nouveau_ttm_fini_vram(struct nouveau_drm *drm) struct ttm_resource_manager *man = ttm_manager_type(&drm->ttm.bdev, TTM_PL_VRAM);
if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) { + struct nouveau_resource_manager *nman = to_mgr(man); ttm_resource_manager_set_used(man, false); ttm_resource_manager_force_list_clean(&drm->ttm.bdev, man); ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, NULL); - kfree(man); + kfree(nman); } else ttm_range_man_fini(&drm->ttm.bdev, TTM_PL_VRAM); } diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index cf8176bce4f6..1ed67842370e 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -1467,14 +1467,19 @@ int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type) } EXPORT_SYMBOL(ttm_bo_evict_mm);
+void ttm_resource_manager_io_lru_init(struct ttm_resource_manager_io_lru *io_lru) +{ + mutex_init(&io_lru->io_reserve_mutex); + INIT_LIST_HEAD(&io_lru->io_reserve_lru); +} +EXPORT_SYMBOL(ttm_resource_manager_io_lru_init); + void ttm_resource_manager_init(struct ttm_resource_manager *man) { unsigned i;
- man->use_io_reserve_lru = false; - mutex_init(&man->io_reserve_mutex); + spin_lock_init(&man->move_lock); - INIT_LIST_HEAD(&man->io_reserve_lru);
for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) INIT_LIST_HEAD(&man->lru[i]); diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 496158acd5b9..137aab6c53ae 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -93,29 +93,33 @@ EXPORT_SYMBOL(ttm_bo_move_ttm);
int ttm_mem_io_lock(struct ttm_resource_manager *man, bool interruptible) { - if (likely(!man->use_io_reserve_lru)) + struct ttm_resource_manager_io_lru *io_lru; + if (!man->func && !man->func->io_lru) return 0;
+ io_lru = man->func->io_lru(man); if (interruptible) - return mutex_lock_interruptible(&man->io_reserve_mutex); + return mutex_lock_interruptible(&io_lru->io_reserve_mutex);
- mutex_lock(&man->io_reserve_mutex); + mutex_lock(&io_lru->io_reserve_mutex); return 0; }
void ttm_mem_io_unlock(struct ttm_resource_manager *man) { - if (likely(!man->use_io_reserve_lru)) + struct ttm_resource_manager_io_lru *io_lru; + if (!man->func && !man->func->io_lru) return;
- mutex_unlock(&man->io_reserve_mutex); + io_lru = man->func->io_lru(man); + mutex_unlock(&io_lru->io_reserve_mutex); }
static int ttm_mem_io_evict(struct ttm_resource_manager *man) { struct ttm_buffer_object *bo; - - bo = list_first_entry_or_null(&man->io_reserve_lru, + struct ttm_resource_manager_io_lru *io_lru = man->func->io_lru(man); + bo = list_first_entry_or_null(&io_lru->io_reserve_lru, struct ttm_buffer_object, io_reserve_lru); if (!bo) @@ -173,9 +177,11 @@ int ttm_mem_io_reserve_vm(struct ttm_buffer_object *bo) if (unlikely(ret != 0)) return ret; mem->bus.io_reserved_vm = true; - if (man->use_io_reserve_lru) + if (man->func && man->func->io_lru) { + struct ttm_resource_manager_io_lru *io_lru = man->func->io_lru(man); list_add_tail(&bo->io_reserve_lru, - &man->io_reserve_lru); + &io_lru->io_reserve_lru); + } return 0; }
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index e4bf93482b59..fd34ca32ca66 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h @@ -56,6 +56,8 @@ struct ttm_lru_bulk_move;
struct ttm_resource_manager;
+struct ttm_resource_manager_io_lru; + /** * struct ttm_bus_placement * @@ -542,6 +544,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev, unsigned long size, */ void ttm_resource_manager_init(struct ttm_resource_manager *man);
+void ttm_resource_manager_io_lru_init(struct ttm_resource_manager_io_lru *io_lru); /** * ttm_bo_evict_mm * diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index c719b4aa3793..d6e77f1d0183 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -46,6 +46,7 @@ #define TTM_MAX_BO_PRIORITY 4U
struct ttm_resource_manager; +struct ttm_resource_manager_io_lru;
struct ttm_resource_manager_func { /** @@ -106,6 +107,8 @@ struct ttm_resource_manager_func { */ void (*debug)(struct ttm_resource_manager *man, struct drm_printer *printer); + + struct ttm_resource_manager_io_lru *(*io_lru)(struct ttm_resource_manager *man); };
/** @@ -133,7 +136,14 @@ struct ttm_resource_manager_func { * This structure is used to identify and manage memory types for a device. */
+struct ttm_resource_manager_io_lru { + /* + * Protected by @io_reserve_mutex: + */
+ struct list_head io_reserve_lru; + struct mutex io_reserve_mutex; +};
struct ttm_resource_manager { /* @@ -144,15 +154,8 @@ struct ttm_resource_manager { uint32_t available_caching; uint32_t default_caching; const struct ttm_resource_manager_func *func; - struct mutex io_reserve_mutex; - bool use_io_reserve_lru; - spinlock_t move_lock;
- /* - * Protected by @io_reserve_mutex: - */ - - struct list_head io_reserve_lru; + spinlock_t move_lock;
/* * Protected by the global->lru_lock.
Am 07.08.20 um 01:34 schrieb Dave Airlie:
From: Dave Airlie airlied@redhat.com
This moves the io lru tracking into the driver allocated structure.
Probably need to consider if we can move more stuff in there around the nouveau only io_lru functionality.
I think we can even go much further than this. The whole handling can be inside Nouveau, completely without the help of TTM.
I've already created a prototype of this once, but since I don't have NVidia hardware here to test I can't hammer out all the bugs and typos.
Give me a moment to clean that patch up and send it to you once more. If you have some time it should be trivial to fix the issues and make sure we have a clean design here.
Regards, Christian.
drivers/gpu/drm/nouveau/nouveau_ttm.c | 24 +++++++++++++++++++++--- drivers/gpu/drm/ttm/ttm_bo.c | 11 ++++++++--- drivers/gpu/drm/ttm/ttm_bo_util.c | 24 +++++++++++++++--------- include/drm/ttm/ttm_bo_api.h | 3 +++ include/drm/ttm/ttm_bo_driver.h | 19 +++++++++++-------- 5 files changed, 58 insertions(+), 23 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c index 93685a376a50..86d74e590359 100644 --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c @@ -31,6 +31,16 @@
#include <core/tegra.h>
+struct nouveau_resource_manager {
- struct ttm_resource_manager manager;
- struct ttm_resource_manager_io_lru io_lru;
+};
+static inline struct nouveau_resource_manager *to_mgr(struct ttm_resource_manager *man) +{
- return container_of(man, struct nouveau_resource_manager, manager);
+}
- static void nouveau_manager_del(struct ttm_resource_manager *man, struct ttm_resource *reg) {
@@ -63,9 +73,15 @@ nouveau_vram_manager_new(struct ttm_resource_manager *man, return 0; }
+static struct ttm_resource_manager_io_lru *nouveau_resource_io_lru(struct ttm_resource_manager *man) +{
- return &to_mgr(man)->io_lru;
+}
const struct ttm_resource_manager_func nouveau_vram_manager = { .get_node = nouveau_vram_manager_new, .put_node = nouveau_manager_del,
.io_lru = nouveau_resource_io_lru, };
static int
@@ -160,7 +176,8 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) { /* Some BARs do not support being ioremapped WC */ const u8 type = mmu->type[drm->ttm.type_vram].type;
struct ttm_resource_manager *man = kzalloc(sizeof(*man), GFP_KERNEL);
struct nouveau_resource_manager *nman = kzalloc(sizeof(*nman), GFP_KERNEL);
if (!man) return -ENOMEM;struct ttm_resource_manager *man = &nman->manager;
@@ -173,9 +190,9 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) }
man->func = &nouveau_vram_manager;
man->use_io_reserve_lru = true;
ttm_resource_manager_init(man);
ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, man); ttm_resource_manager_set_used(man, true); return 0;ttm_resource_manager_io_lru_init(&nman->io_lru);
@@ -193,11 +210,12 @@ nouveau_ttm_fini_vram(struct nouveau_drm *drm) struct ttm_resource_manager *man = ttm_manager_type(&drm->ttm.bdev, TTM_PL_VRAM);
if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
ttm_resource_manager_set_used(man, false); ttm_resource_manager_force_list_clean(&drm->ttm.bdev, man); ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, NULL);struct nouveau_resource_manager *nman = to_mgr(man);
kfree(man);
} else ttm_range_man_fini(&drm->ttm.bdev, TTM_PL_VRAM); }kfree(nman);
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index cf8176bce4f6..1ed67842370e 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -1467,14 +1467,19 @@ int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type) } EXPORT_SYMBOL(ttm_bo_evict_mm);
+void ttm_resource_manager_io_lru_init(struct ttm_resource_manager_io_lru *io_lru) +{
- mutex_init(&io_lru->io_reserve_mutex);
- INIT_LIST_HEAD(&io_lru->io_reserve_lru);
+} +EXPORT_SYMBOL(ttm_resource_manager_io_lru_init);
- void ttm_resource_manager_init(struct ttm_resource_manager *man) { unsigned i;
- man->use_io_reserve_lru = false;
- mutex_init(&man->io_reserve_mutex);
- spin_lock_init(&man->move_lock);
INIT_LIST_HEAD(&man->io_reserve_lru);
for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) INIT_LIST_HEAD(&man->lru[i]);
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 496158acd5b9..137aab6c53ae 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -93,29 +93,33 @@ EXPORT_SYMBOL(ttm_bo_move_ttm);
int ttm_mem_io_lock(struct ttm_resource_manager *man, bool interruptible) {
- if (likely(!man->use_io_reserve_lru))
struct ttm_resource_manager_io_lru *io_lru;
if (!man->func && !man->func->io_lru) return 0;
io_lru = man->func->io_lru(man); if (interruptible)
return mutex_lock_interruptible(&man->io_reserve_mutex);
return mutex_lock_interruptible(&io_lru->io_reserve_mutex);
- mutex_lock(&man->io_reserve_mutex);
mutex_lock(&io_lru->io_reserve_mutex); return 0; }
void ttm_mem_io_unlock(struct ttm_resource_manager *man) {
- if (likely(!man->use_io_reserve_lru))
- struct ttm_resource_manager_io_lru *io_lru;
- if (!man->func && !man->func->io_lru) return;
- mutex_unlock(&man->io_reserve_mutex);
io_lru = man->func->io_lru(man);
mutex_unlock(&io_lru->io_reserve_mutex); }
static int ttm_mem_io_evict(struct ttm_resource_manager *man) { struct ttm_buffer_object *bo;
- bo = list_first_entry_or_null(&man->io_reserve_lru,
- struct ttm_resource_manager_io_lru *io_lru = man->func->io_lru(man);
- bo = list_first_entry_or_null(&io_lru->io_reserve_lru, struct ttm_buffer_object, io_reserve_lru); if (!bo)
@@ -173,9 +177,11 @@ int ttm_mem_io_reserve_vm(struct ttm_buffer_object *bo) if (unlikely(ret != 0)) return ret; mem->bus.io_reserved_vm = true;
- if (man->use_io_reserve_lru)
- if (man->func && man->func->io_lru) {
list_add_tail(&bo->io_reserve_lru,struct ttm_resource_manager_io_lru *io_lru = man->func->io_lru(man);
&man->io_reserve_lru);
&io_lru->io_reserve_lru);
- } return 0; }
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index e4bf93482b59..fd34ca32ca66 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h @@ -56,6 +56,8 @@ struct ttm_lru_bulk_move;
struct ttm_resource_manager;
+struct ttm_resource_manager_io_lru;
- /**
- struct ttm_bus_placement
@@ -542,6 +544,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev, unsigned long size, */ void ttm_resource_manager_init(struct ttm_resource_manager *man);
+void ttm_resource_manager_io_lru_init(struct ttm_resource_manager_io_lru *io_lru); /**
- ttm_bo_evict_mm
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index c719b4aa3793..d6e77f1d0183 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -46,6 +46,7 @@ #define TTM_MAX_BO_PRIORITY 4U
struct ttm_resource_manager; +struct ttm_resource_manager_io_lru;
struct ttm_resource_manager_func { /** @@ -106,6 +107,8 @@ struct ttm_resource_manager_func { */ void (*debug)(struct ttm_resource_manager *man, struct drm_printer *printer);
struct ttm_resource_manager_io_lru *(*io_lru)(struct ttm_resource_manager *man); };
/**
@@ -133,7 +136,14 @@ struct ttm_resource_manager_func {
- This structure is used to identify and manage memory types for a device.
*/
+struct ttm_resource_manager_io_lru {
/*
* Protected by @io_reserve_mutex:
*/
struct list_head io_reserve_lru;
struct mutex io_reserve_mutex;
+};
struct ttm_resource_manager { /* @@ -144,15 +154,8 @@ struct ttm_resource_manager { uint32_t available_caching; uint32_t default_caching; const struct ttm_resource_manager_func *func;
struct mutex io_reserve_mutex;
bool use_io_reserve_lru;
spinlock_t move_lock;
/*
* Protected by @io_reserve_mutex:
*/
struct list_head io_reserve_lru;
spinlock_t move_lock;
/*
- Protected by the global->lru_lock.
Greeting,
FYI, we noticed the following commit (built with gcc-9):
commit: c36a1cfe1ba8e83698acdf04ba59cf08370698ed ("[PATCH 4/4] drm/ttm/nouveau: move io_lru storage into driver.") url: https://github.com/0day-ci/linux/commits/Dave-Airlie/drm-amdgpu-ttm-move-vra... base: git://anongit.freedesktop.org/drm/drm-tip drm-tip
in testcase: kernel-selftests with following parameters:
group: kselftests-rseq
test-description: The kernel contains a set of "self tests" under the tools/testing/selftests/ directory. These are intended to be small unit tests to exercise individual code paths in the kernel. test-url: https://www.kernel.org/doc/Documentation/kselftest.txt
on test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 -m 16G
caused below changes (please refer to attached dmesg/kmsg for entire log/backtrace):
+---------------------------------------------+------------+------------+ | | 89e1ba9e49 | c36a1cfe1b | +---------------------------------------------+------------+------------+ | boot_successes | 12 | 0 | | boot_failures | 0 | 14 | | BUG:kernel_NULL_pointer_dereference,address | 0 | 14 | | Oops:#[##] | 0 | 14 | | RIP:ttm_mem_io_lock[ttm] | 0 | 14 | | Kernel_panic-not_syncing:Fatal_exception | 0 | 14 | +---------------------------------------------+------------+------------+
If you fix the issue, kindly add following tag Reported-by: kernel test robot lkp@intel.com
[ 35.936268] BUG: kernel NULL pointer dereference, address: 0000000000000018 [ 35.936271] #PF: supervisor read access in kernel mode [ 35.936273] #PF: error_code(0x0000) - not-present page [ 35.936274] PGD 0 P4D 0 [ 35.936278] Oops: 0000 [#1] PREEMPT SMP PTI [ 35.936282] CPU: 0 PID: 157 Comm: systemd-udevd Not tainted 5.8.0-02580-gc36a1cfe1ba8e #15 [ 35.936283] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014 [ 35.936293] RIP: 0010:ttm_mem_io_lock+0x33/0x40 [ttm] [ 35.936295] Code: 10 89 f3 48 85 c0 74 22 48 8b 40 18 e8 76 ba e8 fa 31 f6 48 8d 78 10 84 db 75 09 e8 27 4a ba fa 31 c0 5b c3 5b e9 7d 4a ba fa <48> 83 3c 25 18 00 00 00 00 75 d3 eb e9 66 66 66 66 90 48 8b 47 10 [ 35.936297] RSP: 0018:ffffbbcb4074f5d0 EFLAGS: 00010246 [ 35.936299] RAX: 0000000000000000 RBX: 0000000000000001 RCX: ffffbbcb4074f6c8 [ 35.936300] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffa046f877c628 [ 35.936302] RBP: ffffbbcb4074f640 R08: 0000000000000001 R09: ffffffffbd994fd0 [ 35.936303] R10: ffffffffbc55eb24 R11: 00000000000054ad R12: ffffa046f8725348 [ 35.936305] R13: ffffbbcb4074f6c8 R14: ffffa046f877c628 R15: ffffa046f8725000 [ 35.936307] FS: 00007f79fae57d40(0000) GS:ffffa047afc00000(0000) knlGS:0000000000000000 [ 35.936309] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 35.936310] CR2: 0000000000000018 CR3: 00000003797ce000 CR4: 00000000000406f0 [ 35.936316] Call Trace: [ 35.936325] ttm_bo_handle_move_mem+0x53/0x4f0 [ttm] [ 35.936335] ttm_bo_validate+0x169/0x1b0 [ttm] [ 35.936340] ? mark_held_locks+0x2d/0x80 [ 35.936350] drm_gem_vram_pin_locked+0x84/0x1d0 [drm_vram_helper] [ 35.936356] drm_gem_vram_pin+0x40/0xf0 [drm_vram_helper] [ 35.936361] drm_gem_vram_plane_helper_prepare_fb+0x2e/0x80 [drm_vram_helper] [ 35.936367] drm_atomic_helper_prepare_planes+0x8a/0x110 [ 35.936371] drm_atomic_helper_commit+0x91/0x160 [ 35.936376] drm_client_modeset_commit_atomic+0x231/0x270 [ 35.936388] drm_client_modeset_commit_locked+0x57/0x190 [ 35.936391] drm_client_modeset_commit+0x24/0x40 [ 35.936396] __drm_fb_helper_restore_fbdev_mode_unlocked+0x96/0xc0 [ 35.936400] drm_fb_helper_set_par+0x3c/0x50 [ 35.936404] fbcon_init+0x2b2/0x5f0 [ 35.936412] visual_init+0xce/0x130 [ 35.936416] do_bind_con_driver+0x1bc/0x2b0 [ 35.936422] do_take_over_console+0x115/0x180 [ 35.936428] do_fbcon_takeover+0x58/0xb0 [ 35.936430] register_framebuffer+0x1ee/0x300 [ 35.936442] __drm_fb_helper_initial_config_and_unlock+0x94/0xc0 [ 35.936446] drm_fbdev_client_hotplug+0xde/0x190 [ 35.936450] drm_fbdev_generic_setup+0xad/0x170 [ 35.936456] bochs_pci_probe+0x133/0x160 [bochs_drm] [ 35.936460] local_pci_probe+0x42/0x80 [ 35.936464] pci_device_probe+0x107/0x1a0 [ 35.936471] really_probe+0x147/0x3c0 [ 35.936475] driver_probe_device+0xe1/0x150 [ 35.936479] device_driver_attach+0x53/0x60 [ 35.936482] __driver_attach+0x8c/0x150 [ 35.936484] ? device_driver_attach+0x60/0x60 [ 35.936487] ? device_driver_attach+0x60/0x60 [ 35.936489] bus_for_each_dev+0x7b/0xc0 [ 35.936494] bus_add_driver+0x150/0x1f0 [ 35.936498] driver_register+0x6c/0xc0 [ 35.936501] ? 0xffffffffc0537000 [ 35.936504] do_one_initcall+0x5d/0x330 [ 35.936508] ? do_init_module+0x23/0x230 [ 35.936512] ? rcu_read_lock_sched_held+0x52/0x90 [ 35.936516] ? kmem_cache_alloc_trace+0x2aa/0x2e0 [ 35.936521] do_init_module+0x5c/0x230 [ 35.936523] load_module+0x1430/0x1660 [ 35.936539] ? __do_sys_finit_module+0xaa/0x110 [ 35.936541] __do_sys_finit_module+0xaa/0x110 [ 35.936554] do_syscall_64+0x57/0xb0 [ 35.936559] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 35.936561] RIP: 0033:0x7f79fb641f59 [ 35.936564] Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 07 6f 0c 00 f7 d8 64 89 01 48 [ 35.936566] RSP: 002b:00007fff46de1208 EFLAGS: 00000246 ORIG_RAX: 0000000000000139 [ 35.936568] RAX: ffffffffffffffda RBX: 000055fb6b100da0 RCX: 00007f79fb641f59 [ 35.936569] RDX: 0000000000000000 RSI: 00007f79fb546cad RDI: 0000000000000011 [ 35.936571] RBP: 00007f79fb546cad R08: 0000000000000000 R09: 0000000000000000 [ 35.936572] R10: 0000000000000011 R11: 0000000000000246 R12: 0000000000000000 [ 35.936574] R13: 000055fb6b0f72b0 R14: 0000000000020000 R15: 000055fb6b100da0 [ 35.936582] Modules linked in: bochs_drm(+) drm_vram_helper drm_ttm_helper ttm crypto_simd snd_timer snd cryptd parport_pc glue_helper ata_piix joydev parport soundcore libata serio_raw pcspkr floppy i2c_piix4 ipmi_devintf ipmi_msghandler ip_tables [ 35.936597] CR2: 0000000000000018 [ 35.936628] ---[ end trace 0eac1a886c6bb87d ]---
To reproduce:
# build kernel cd linux cp config-5.8.0-02580-gc36a1cfe1ba8e .config make HOSTCC=gcc-9 CC=gcc-9 ARCH=x86_64 olddefconfig prepare modules_prepare bzImage
git clone https://github.com/intel/lkp-tests.git cd lkp-tests bin/lkp qemu -k <bzImage> job-script # job-script is attached in this email
Thanks, lkp
dri-devel@lists.freedesktop.org