|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 4/5] xen: modify lock profiling interface
On 29.08.2019 12:18, Juergen Gross wrote:
> Today adding locks located in a struct to lock profiling requires a
> unique type index for each structure. This makes it hard to add any
> new structure as the related sysctl interface needs to be changed, too.
>
> Instead of using an index the already existing struct name specified
> in lock_profile_register_struct() can be used as an identifier instead.
>
> Modify the sysctl interface to use the struct name instead of the type
> index and adapt the related coding accordingly. Instead of an array of
> struct anchors for lock profiling we now use a linked list for that
> purpose. Use the special idx value -1 for cases where the idx isn't
> relevant (global locks) and shouldn't be printed.
Just to make explicit what was implied by my v1 reply: I can see why
you want to do this, but I'm not really a friend of string literals
in the hypercall interface, when binary values can also do. So to
me this looks to be a move in the wrong direction. Therefore, while
I'm fine reviewing such a change, I'm not very likely to eventually
ack it.
> @@ -465,31 +466,70 @@ int spinlock_profile_control(struct
> xen_sysctl_lockprof_op *pc)
> return rc;
> }
>
> -void _lock_profile_register_struct(
> - int32_t type, struct lock_profile_qhead *qhead, int32_t idx, char *name)
> +static struct lock_profile_anc *find_prof_anc(const char *name)
> {
> - qhead->idx = idx;
> + struct lock_profile_anc *anc;
> +
> + for ( anc = lock_profile_ancs; anc; anc = anc->next )
> + if ( !strcmp(anc->name, name) )
> + return anc;
> + return NULL;
> +}
Blank line before main return statement please.
> +void _lock_profile_register_struct(struct lock_profile_qhead *qhead,
> + int32_t idx, const char *name)
> +{
> + struct lock_profile_anc *anc;
> +
> spin_lock(&lock_profile_lock);
> - qhead->head_q = lock_profile_ancs[type].head_q;
> - lock_profile_ancs[type].head_q = qhead;
> - lock_profile_ancs[type].name = name;
> +
> + anc = find_prof_anc(name);
> + if ( !anc )
> + {
> + anc = xzalloc(struct lock_profile_anc);
Hmm, another allocation with a lock held. We try to avoid such as
much as possible, and it doesn't look overly difficult to avoid it
here.
> + if ( !anc )
> + goto out;
> + anc->name = name;
> + anc->next = lock_profile_ancs;
> + lock_profile_ancs = anc;
> + }
> +
> + qhead->idx = idx;
> + qhead->head_q = anc->head_q;
> + anc->head_q = qhead;
> +
> + out:
> spin_unlock(&lock_profile_lock);
> }
>
> -void _lock_profile_deregister_struct(
> - int32_t type, struct lock_profile_qhead *qhead)
> +void _lock_profile_deregister_struct(struct lock_profile_qhead *qhead,
> + const char *name)
> {
> + struct lock_profile_anc *anc;
> struct lock_profile_qhead **q;
> + struct lock_profile *elem;
>
> spin_lock(&lock_profile_lock);
> - for ( q = &lock_profile_ancs[type].head_q; *q; q = &(*q)->head_q )
> +
> + anc = find_prof_anc(name);
> + if ( anc )
> {
> - if ( *q == qhead )
> + for ( q = &anc->head_q; *q; q = &(*q)->head_q )
> {
> - *q = qhead->head_q;
> - break;
> + if ( *q == qhead )
> + {
> + *q = qhead->head_q;
> + while ( qhead->elem_q )
> + {
> + elem = qhead->elem_q;
> + qhead->elem_q = elem->next;
> + xfree(elem);
Which assumes the global list would never get handed here. Probably
fine.
> --- a/xen/include/xen/spinlock.h
> +++ b/xen/include/xen/spinlock.h
> @@ -50,19 +50,24 @@ union lock_debug { };
>
> with ptr being the main structure pointer and lock the spinlock field
>
> + It should be noted that this will need to allocate memory, so
> interrupts
> + must be enabled.
> +
> - each structure has to be added to profiling with
>
> - lock_profile_register_struct(type, ptr, idx, print);
> + lock_profile_register_struct(ptr, idx, print);
>
> with:
> - type: something like LOCKPROF_TYPE_PERDOM
> ptr: pointer to the structure
> idx: index of that structure, e.g. domid
> print: descriptive string like "domain"
>
> + It should be noted that this will might need to allocate memory, so
Nit: "will" or "might", but not both.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |