On Fri, Feb 13, 2026 at 10:34:13PM +0000, Jonathan Cavitt wrote:
> Pack the engine class and instance fields into a single u8 to save space
> in struct xe_pagefault.  The saved space will be used later to store
> something else.
> 
> Suggested-by: Matthew Brost <[email protected]>
> Signed-off-by: Jonathan Cavitt <[email protected]>

Reviewed-by: Matthew Brost <[email protected]>

> ---
>  drivers/gpu/drm/xe/xe_guc_pagefault.c   |  7 +++++--
>  drivers/gpu/drm/xe/xe_pagefault.c       | 11 +++++++----
>  drivers/gpu/drm/xe/xe_pagefault_types.h | 16 ++++++++++++----
>  3 files changed, 24 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_guc_pagefault.c 
> b/drivers/gpu/drm/xe/xe_guc_pagefault.c
> index d48f6ed103bb..8eaa1dfc1e66 100644
> --- a/drivers/gpu/drm/xe/xe_guc_pagefault.c
> +++ b/drivers/gpu/drm/xe/xe_guc_pagefault.c
> @@ -85,8 +85,11 @@ int xe_guc_pagefault_handler(struct xe_guc *guc, u32 *msg, 
> u32 len)
>                                  FIELD_GET(PFD_FAULT_LEVEL, msg[0])) |
>                       FIELD_PREP(XE_PAGEFAULT_TYPE_MASK,
>                                  FIELD_GET(PFD_FAULT_TYPE, msg[2]));
> -     pf.consumer.engine_class = FIELD_GET(PFD_ENG_CLASS, msg[0]);
> -     pf.consumer.engine_instance = FIELD_GET(PFD_ENG_INSTANCE, msg[0]);
> +     pf.consumer.engine_class_instance =
> +             FIELD_PREP(XE_PAGEFAULT_ENGINE_CLASS_MASK,
> +                        FIELD_GET(PFD_ENG_CLASS, msg[0])) |
> +             FIELD_PREP(XE_PAGEFAULT_ENGINE_INSTANCE_MASK,
> +                        FIELD_GET(PFD_ENG_INSTANCE, msg[0]));
>  
>       pf.producer.private = guc;
>       pf.producer.ops = &guc_pagefault_ops;
> diff --git a/drivers/gpu/drm/xe/xe_pagefault.c 
> b/drivers/gpu/drm/xe/xe_pagefault.c
> index 0281b5b6d4ab..47b6a7628dc1 100644
> --- a/drivers/gpu/drm/xe/xe_pagefault.c
> +++ b/drivers/gpu/drm/xe/xe_pagefault.c
> @@ -229,13 +229,15 @@ static bool xe_pagefault_queue_pop(struct 
> xe_pagefault_queue *pf_queue,
>  
>  static void xe_pagefault_print(struct xe_pagefault *pf)
>  {
> +     enum xe_engine_class class = FIELD_GET(XE_PAGEFAULT_ENGINE_CLASS_MASK,
> +                                            
> pf->consumer.engine_class_instance);
>       xe_gt_info(pf->gt, "\n\tASID: %d\n"
>                  "\tFaulted Address: 0x%08x%08x\n"
>                  "\tFaultType: %lu\n"
>                  "\tAccessType: %d\n"
>                  "\tFaultLevel: %lu\n"
>                  "\tEngineClass: %d %s\n"
> -                "\tEngineInstance: %d\n",
> +                "\tEngineInstance: %lu\n",
>                  pf->consumer.asid,
>                  upper_32_bits(pf->consumer.page_addr),
>                  lower_32_bits(pf->consumer.page_addr),
> @@ -244,9 +246,10 @@ static void xe_pagefault_print(struct xe_pagefault *pf)
>                  pf->consumer.access_type,
>                  FIELD_GET(XE_PAGEFAULT_LEVEL_MASK,
>                            pf->consumer.fault_type_level),
> -                pf->consumer.engine_class,
> -                xe_hw_engine_class_to_str(pf->consumer.engine_class),
> -                pf->consumer.engine_instance);
> +                class,
> +                xe_hw_engine_class_to_str(class),
> +                FIELD_GET(XE_PAGEFAULT_ENGINE_INSTANCE_MASK,
> +                          pf->consumer.engine_class_instance));
>  }
>  
>  static void xe_pagefault_queue_work(struct work_struct *w)
> diff --git a/drivers/gpu/drm/xe/xe_pagefault_types.h 
> b/drivers/gpu/drm/xe/xe_pagefault_types.h
> index 0e378f41ede6..a14725a02f39 100644
> --- a/drivers/gpu/drm/xe/xe_pagefault_types.h
> +++ b/drivers/gpu/drm/xe/xe_pagefault_types.h
> @@ -80,10 +80,18 @@ struct xe_pagefault {
>  #define XE_PAGEFAULT_TYPE_LEVEL_NACK         0xff    /* Producer indicates 
> nack fault */
>  #define XE_PAGEFAULT_LEVEL_MASK                      GENMASK(3, 0)
>  #define XE_PAGEFAULT_TYPE_MASK                       GENMASK(7, 4)
> -             /** @consumer.engine_class: engine class */
> -             u8 engine_class;
> -             /** @consumer.engine_instance: engine instance */
> -             u8 engine_instance;
> +             /**
> +              * @consumer.engine_class_instance: engine class and instance, 
> packed
> +              * into a single u8 to keep compact
> +              */
> +             u8 engine_class_instance;
> +#define XE_PAGEFAULT_ENGINE_CLASS_MASK               GENMASK(3, 0)
> +#define XE_PAGEFAULT_ENGINE_INSTANCE_MASK    GENMASK(7, 4)
> +             /**
> +              * consumer.align: buffer u8 to keep struct aligned to u64.
> +              * Will be used later to store data.
> +              */
> +             u8 align;
>               /** consumer.reserved: reserved bits for future expansion */
>               u64 reserved;
>       } consumer;
> -- 
> 2.43.0
> 

Reply via email to