-----Original Message-----
From: Zhenyu Wang <[email protected]> 
Sent: Friday, February 20, 2026 6:41 AM
To: Cavitt, Jonathan <[email protected]>; 
[email protected]
Cc: Gupta, Saurabhg <[email protected]>; Zuo, Alex <[email protected]>; 
Cavitt, Jonathan <[email protected]>
Subject: RE: [PATCH] drm/i915/gvt: Cast u64 array to u32 array
> 
> "Cavitt, Jonathan" <[email protected]> writes:
> 
> > -----Original Message-----
> > From: Zhenyu Wang <[email protected]> 
> > Sent: Friday, February 13, 2026 2:42 AM
> > To: Cavitt, Jonathan <[email protected]>; 
> > [email protected]
> > Cc: Gupta, Saurabhg <[email protected]>; Zuo, Alex 
> > <[email protected]>; Cavitt, Jonathan <[email protected]>
> > Subject: Re: [PATCH] drm/i915/gvt: Cast u64 array to u32 array
> >> 
> >> Jonathan Cavitt <[email protected]> writes:
> >> 
> >> > Static analysis issue:
> >> >
> >> > The u64 array workload->shadow_mm->ppgtt_mm.shadow_pdps is cast to a
> >> > void pointer and passed as a u32 array to set_context_pdp_root_pointer
> >> > as a part of update_shadow_pdps.  This isn't wrong, per se, but we
> >> > should properly cast it to an appropriately-sized u32 array before
> >> > submission.
> >> >
> >> > Signed-off-by: Jonathan Cavitt <[email protected]>
> >> > ---
> >> >  drivers/gpu/drm/i915/gvt/scheduler.c | 6 ++++--
> >> >  1 file changed, 4 insertions(+), 2 deletions(-)
> >> >
> >> > diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c 
> >> > b/drivers/gpu/drm/i915/gvt/scheduler.c
> >> > index 15fdd514ca83..1a95c9f76faa 100644
> >> > --- a/drivers/gpu/drm/i915/gvt/scheduler.c
> >> > +++ b/drivers/gpu/drm/i915/gvt/scheduler.c
> >> > @@ -72,6 +72,7 @@ static void update_shadow_pdps(struct 
> >> > intel_vgpu_workload *workload)
> >> >  {
> >> >          struct execlist_ring_context *shadow_ring_context;
> >> >          struct intel_context *ctx = workload->req->context;
> >> > +        u32 pdp[8];
> >> >  
> >> >          if (WARN_ON(!workload->shadow_mm))
> >> >                  return;
> >> > @@ -79,9 +80,10 @@ static void update_shadow_pdps(struct 
> >> > intel_vgpu_workload *workload)
> >> >          if (WARN_ON(!atomic_read(&workload->shadow_mm->pincount)))
> >> >                  return;
> >> >  
> >> > +        memcpy(pdp, workload->shadow_mm->ppgtt_mm.shadow_pdps,
> >> > +               sizeof(u64) * 
> >> > ARRAY_SIZE(workload->shadow_mm->ppgtt_mm.shadow_pdps));
> >> >          shadow_ring_context = (struct execlist_ring_context 
> >> > *)ctx->lrc_reg_state;
> >> > -        set_context_pdp_root_pointer(shadow_ring_context,
> >> > -                        (void 
> >> > *)workload->shadow_mm->ppgtt_mm.shadow_pdps);
> >> > +        set_context_pdp_root_pointer(shadow_ring_context, pdp);
> >> >  }
> >> >  
> >> 
> >> I think we'd better just cast the type instead of extra copy.
> >
> > I'm not certain that would resolve the static analysis issue.
> >
> > To specify, the static analyzer is complaining that we're taking a pointer 
> > to an object
> > of type 'unsigned long long' and dereferencing it as an object of type 
> > 'unsigned int'.
> > The analyzer is getting uppity about this causing unexpected results 
> > depending on
> > machine endianness (which... it won't, but the static analyzer doesn't know 
> > that),
> > so I suspect the only way to get it to calm down is to do a direct memory 
> > copy, as
> > seen here.  Casting the type would just result in the same static analysis 
> > issue.
> >
> > This is the part of the email that I'd throw around terms like "strict 
> > aliasing" and
> > "type punning" if I thought they were relevant.  They probably aren't, 
> > though.
> >
> 
> I really don't want to do extra copy as this is hot path for every exec 
> submission.
> How about below change?
> Btw, which static analysis you're using? Looks I don't get such warning
> with either sparse or smatch...

I'm not allowed to go into detail about that.  Sorry.

> 
> diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c 
> b/drivers/gpu/drm/i915/gvt/scheduler.c
> index 63ad1fed525a..3f09d6440827 100644
> --- a/drivers/gpu/drm/i915/gvt/scheduler.c
> +++ b/drivers/gpu/drm/i915/gvt/scheduler.c
> @@ -1,3 +1,4 @@
> +
>  /*
>   * Copyright(c) 2011-2016 Intel Corporation. All rights reserved.
>   *
> @@ -54,7 +55,7 @@
>  
>  static void set_context_pdp_root_pointer(
>               struct execlist_ring_context *ring_context,
> -             u32 pdp[8])
> +             u32 *pdp)
>  {
>       int i;
>  
> @@ -75,7 +76,7 @@ static void update_shadow_pdps(struct intel_vgpu_workload 
> *workload)
>  
>       shadow_ring_context = (struct execlist_ring_context 
> *)ctx->lrc_reg_state;
>       set_context_pdp_root_pointer(shadow_ring_context,
> -                     (void *)workload->shadow_mm->ppgtt_mm.shadow_pdps);
> +                                  (u32 
> *)workload->shadow_mm->ppgtt_mm.shadow_pdps);
>  }

This still results in us casting a u64 pointer to a u32 pointer.

If this change is undesirable, I can mark it as a false positive on my end.
-Jonathan Cavitt

>  
>  /*
> 

Reply via email to