|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/spinlock: use correct pointer
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).
>
> Jan
I'd be happy to send a patch for that instance, too. Would you like a
Reported-by: tag?
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).
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |