On Mon, 2026-02-16 at 13:16 +0100, Arnd Bergmann wrote:
> From: Arnd Bergmann <[email protected]>
> 
> Passing a structure by reference into a function is sometimes
> problematic,

Do you mean passing by *value* is problematic?

> for a number of reasons. Of of these is a warning from the 32-bit arm
> compiler:
> 
> drivers/gpu/drm/drm_gpusvm.c: In function '__drm_gpusvm_unmap_pages':
> drivers/gpu/drm/drm_gpusvm.c:1152:33: note: parameter passing for
> argument of type 'struct drm_pagemap_addr' changed in GCC 9.1
>  1152 |                                 dpagemap->ops-
> >device_unmap(dpagemap,
>       |                                
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>  1153 |                                                            
> dev, *addr);
>       |                                                            
> ~~~~~~~~~~~
> 
> This particular problem is harmless since we are not mixing compiler
> versions
> inside of the compiler. However, passing this by reference avoids the
> warning
> along with providing slightly better calling conventions as it avoids
> an
> extra copy on the stack.
> 
> Signed-off-by: Arnd Bergmann <[email protected]>
> ---
>  drivers/gpu/drm/drm_gpusvm.c  | 2 +-
>  drivers/gpu/drm/drm_pagemap.c | 2 +-
>  drivers/gpu/drm/xe/xe_svm.c   | 8 ++++----
>  include/drm/drm_pagemap.h     | 2 +-
>  4 files changed, 7 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_gpusvm.c
> b/drivers/gpu/drm/drm_gpusvm.c
> index c25f50cad6fe..81626b00b755 100644
> --- a/drivers/gpu/drm/drm_gpusvm.c
> +++ b/drivers/gpu/drm/drm_gpusvm.c
> @@ -1150,7 +1150,7 @@ static void __drm_gpusvm_unmap_pages(struct
> drm_gpusvm *gpusvm,
>                                              addr->dir);
>                       else if (dpagemap && dpagemap->ops-
> >device_unmap)
>                               dpagemap->ops-
> >device_unmap(dpagemap,
> -                                                         dev,
> *addr);
> +                                                         dev,
> addr);
>                       i += 1 << addr->order;
>               }
>  
> diff --git a/drivers/gpu/drm/drm_pagemap.c
> b/drivers/gpu/drm/drm_pagemap.c
> index d0041c947a28..22579806c055 100644
> --- a/drivers/gpu/drm/drm_pagemap.c
> +++ b/drivers/gpu/drm/drm_pagemap.c
> @@ -318,7 +318,7 @@ static void
> drm_pagemap_migrate_unmap_pages(struct device *dev,
>                       struct drm_pagemap_zdd *zdd = page-
> >zone_device_data;
>                       struct drm_pagemap *dpagemap = zdd-
> >dpagemap;
>  
> -                     dpagemap->ops->device_unmap(dpagemap, dev,
> pagemap_addr[i]);
> +                     dpagemap->ops->device_unmap(dpagemap, dev,
> &pagemap_addr[i]);
>               } else {
>                       dma_unmap_page(dev, pagemap_addr[i].addr,
>                                      PAGE_SIZE <<
> pagemap_addr[i].order, dir);
> diff --git a/drivers/gpu/drm/xe/xe_svm.c
> b/drivers/gpu/drm/xe/xe_svm.c
> index 213f0334518a..184cfaac8baf 100644
> --- a/drivers/gpu/drm/xe/xe_svm.c
> +++ b/drivers/gpu/drm/xe/xe_svm.c
> @@ -1676,13 +1676,13 @@ xe_drm_pagemap_device_map(struct drm_pagemap
> *dpagemap,
>  
>  static void xe_drm_pagemap_device_unmap(struct drm_pagemap
> *dpagemap,
>                                       struct device *dev,
> -                                     struct drm_pagemap_addr
> addr)
> +                                     struct drm_pagemap_addr
> *addr)
>  {
> -     if (addr.proto != XE_INTERCONNECT_P2P)
> +     if (addr->proto != XE_INTERCONNECT_P2P)
>               return;
>  
> -     dma_unmap_resource(dev, addr.addr, PAGE_SIZE << addr.order,
> -                        addr.dir, DMA_ATTR_SKIP_CPU_SYNC);
> +     dma_unmap_resource(dev, addr->addr, PAGE_SIZE << addr-
> >order,
> +                        addr->dir, DMA_ATTR_SKIP_CPU_SYNC);
>  }
>  
>  static void xe_pagemap_destroy_work(struct work_struct *work)
> diff --git a/include/drm/drm_pagemap.h b/include/drm/drm_pagemap.h
> index 2baf0861f78f..74a32d0dacd8 100644
> --- a/include/drm/drm_pagemap.h
> +++ b/include/drm/drm_pagemap.h
> @@ -95,7 +95,7 @@ struct drm_pagemap_ops {
>        */
>       void (*device_unmap)(struct drm_pagemap *dpagemap,
>                            struct device *dev,
> -                          struct drm_pagemap_addr addr);
> +                          struct drm_pagemap_addr *addr);

Makes sense, although this should preferrably be

const struct drm_pagemap_addr *addr;

Thanks,
Thomas




>  
>       /**
>        * @populate_mm: Populate part of the mm with @dpagemap
> memory,

Reply via email to