[PATCH] drm/amdgpu: avoid dummy_read_page overlapping mappings
Prike Liang
Prike.Liang at amd.com
Tue Oct 22 07:18:44 UTC 2024
In the A+A system, the dummy_read_page is mapped twice
during the device graphics memory software initialization.
To avoid page remapping, export the ttm_glob_use_count
to the driver for checking whether the same page has already
been mapped.
Signed-off-by: Prike Liang <Prike.Liang at amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 3 ++-
drivers/gpu/drm/ttm/ttm_device.c | 7 +++----
include/drm/ttm/ttm_device.h | 5 +++++
3 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index 256b95232de5..81e567f63967 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -76,7 +76,8 @@ static int amdgpu_gart_dummy_page_init(struct amdgpu_device *adev)
{
struct page *dummy_page = ttm_glob.dummy_read_page;
- if (adev->dummy_page_addr)
+ if (adev->dummy_page_addr ||
+ ttm_glob.ttm_glob_use_count > 1)
return 0;
adev->dummy_page_addr = dma_map_page(&adev->pdev->dev, dummy_page, 0,
PAGE_SIZE, DMA_BIDIRECTIONAL);
diff --git a/drivers/gpu/drm/ttm/ttm_device.c b/drivers/gpu/drm/ttm/ttm_device.c
index 434cf0258000..d99ccfa94c67 100644
--- a/drivers/gpu/drm/ttm/ttm_device.c
+++ b/drivers/gpu/drm/ttm/ttm_device.c
@@ -41,7 +41,6 @@
* ttm_global_mutex - protecting the global state
*/
static DEFINE_MUTEX(ttm_global_mutex);
-static unsigned ttm_glob_use_count;
struct ttm_global ttm_glob;
EXPORT_SYMBOL(ttm_glob);
@@ -52,7 +51,7 @@ static void ttm_global_release(void)
struct ttm_global *glob = &ttm_glob;
mutex_lock(&ttm_global_mutex);
- if (--ttm_glob_use_count > 0)
+ if (--glob->ttm_glob_use_count > 0)
goto out;
ttm_pool_mgr_fini();
@@ -72,7 +71,7 @@ static int ttm_global_init(void)
int ret = 0;
mutex_lock(&ttm_global_mutex);
- if (++ttm_glob_use_count > 1)
+ if (++glob->ttm_glob_use_count > 1)
goto out;
si_meminfo(&si);
@@ -118,7 +117,7 @@ static int ttm_global_init(void)
if (ret && ttm_debugfs_root)
debugfs_remove(ttm_debugfs_root);
if (ret)
- --ttm_glob_use_count;
+ --glob->ttm_glob_use_count;
mutex_unlock(&ttm_global_mutex);
return ret;
}
diff --git a/include/drm/ttm/ttm_device.h b/include/drm/ttm/ttm_device.h
index c22f30535c84..8afb380989e1 100644
--- a/include/drm/ttm/ttm_device.h
+++ b/include/drm/ttm/ttm_device.h
@@ -56,6 +56,11 @@ extern struct ttm_global {
* @bo_count: Number of buffer objects allocated by devices.
*/
atomic_t bo_count;
+
+ /**
+ * @ttm_glob_use_count: Number of ttm glob object referenced by devices.
+ */
+ unsigned ttm_glob_use_count;
} ttm_glob;
struct ttm_device_funcs {
--
2.34.1
More information about the amd-gfx
mailing list