[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