[PATCH] drm/amdgpu: avoid dummy_read_page overlapping mappings
Liang, Prike
Prike.Liang at amd.com
Wed Oct 23 01:50:45 UTC 2024
[AMD Official Use Only - AMD Internal Distribution Only]
Hold on to this patch for a while. I need to further investigate whether it requires allocating a separate page for the second VGA device.
Thanks,
Prike
> -----Original Message-----
> From: Liang, Prike <Prike.Liang at amd.com>
> Sent: Tuesday, October 22, 2024 3:19 PM
> To: amd-gfx at lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher at amd.com>; Liang, Prike
> <Prike.Liang at amd.com>
> Subject: [PATCH] drm/amdgpu: avoid dummy_read_page overlapping mappings
>
> 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