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 <stewart.hildebr...@amd.com>
Reviewed-by: Jan Beulich <jbeul...@suse.com> > --- 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