[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/spinlock: use correct pointer
On 26.04.2024 16:33, Stewart Hildebrand wrote: > On 4/26/24 02:31, Jan Beulich wrote: >> 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.hildebrand@xxxxxxx> >> >> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> > > Thanks! > >> >>> --- 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). > > I'd be happy to send a patch for that instance, too. Would you like a > Reported-by: tag? I'm inclined to say no, not worth it, but it's really up to you. In fact I'm not sure we need to change that; it all depends on whether ... > That patch would look something like: > > --- a/xen/common/spinlock.c > +++ b/xen/common/spinlock.c > @@ -637,22 +637,25 @@ static void cf_check spinlock_profile_print_elem(struct > lock_profile *data, > { > unsigned int cpu; > unsigned int lockval; > + void *lockaddr; > > if ( data->is_rlock ) > { > cpu = data->ptr.rlock->debug.cpu; > lockval = data->ptr.rlock->tickets.head_tail; > + lockaddr = data->ptr.rlock; > } > else > { > cpu = data->ptr.lock->debug.cpu; > lockval = data->ptr.lock->tickets.head_tail; > + lockaddr = data->ptr.lock; > } > > printk("%s ", lock_profile_ancs[type].name); > if ( type != LOCKPROF_TYPE_GLOBAL ) > printk("%d ", idx); > - printk("%s: addr=%p, lockval=%08x, ", data->name, data->ptr.lock, > lockval); > + printk("%s: addr=%p, lockval=%08x, ", data->name, lockaddr, lockval); > if ( cpu == SPINLOCK_NO_CPU ) > printk("not locked\n"); > else > > > That case is benign since the pointer is not dereferenced. So the > rationale would primarily be for consistency (and possibly satisfying > Misra). ... Misra takes issue with the "wrong" member of a union being used, which iirc is UB, but which I'm afraid elsewhere we do all the time. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |