On 25.04.2024 22:45, Stewart Hildebrand wrote:
> The ->profile member is at different offsets in struct rspinlock and
> struct spinlock. When initializing the profiling bits of an rspinlock,
> an unrelated member in struct rspinlock was being overwritten, leading
> to mild havoc. Use the correct pointer.
>
> Fixes: b053075d1a7b ("xen/spinlock: make struct lock_profile rspinlock_t
> aware")
> Signed-off-by: Stewart Hildebrand <[email protected]>
Reviewed-by: Jan Beulich <[email protected]>
> --- a/xen/common/spinlock.c
> +++ b/xen/common/spinlock.c
> @@ -789,7 +789,11 @@ static int __init cf_check lock_prof_init(void)
> {
> (*q)->next = lock_profile_glb_q.elem_q;
> lock_profile_glb_q.elem_q = *q;
> - (*q)->ptr.lock->profile = *q;
> +
> + if ( (*q)->is_rlock )
> + (*q)->ptr.rlock->profile = *q;
> + else
> + (*q)->ptr.lock->profile = *q;
> }
>
> _lock_profile_register_struct(LOCKPROF_TYPE_GLOBAL,
Just to mention it: Strictly speaking spinlock_profile_print_elem()'s
printk("%s: addr=%p, lockval=%08x, ", data->name, data->ptr.lock, lockval);
isn't quite right either (and I would be surprised if Misra didn't have
to say something about it).
Jan