[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 12/15] xen: trace tasklets



>>> On 01.06.17 at 19:35, <dario.faggioli@xxxxxxxxxx> wrote:
> --- a/xen/common/tasklet.c
> +++ b/xen/common/tasklet.c
> @@ -30,10 +30,87 @@ static DEFINE_PER_CPU(struct list_head, 
> softirq_tasklet_list);
>  /* Protects all lists and tasklet structures. */
>  static DEFINE_SPINLOCK(tasklet_lock);
>  
> +#ifdef CONFIG_TRACE_TASKLETS
> +static inline void trace_enqueue(const struct tasklet *t)
> +{
> +    uint64_t addr;
> +
> +    if ( likely(!tb_init_done) )
> +        return;
> +
> +    addr = (uint64_t)t->func;
> +    __trace_var(TRC_XEN_TASKLET_ENQUEUE, 0, sizeof(addr), &addr);
> +}
> +static inline void trace_schedule(const struct tasklet *t)
> +{
> +    struct {
> +        uint64_t addr;
> +        int16_t sched_on, is_sirq;
> +    } d;
> +
> +    if ( likely(!tb_init_done) )
> +        return;
> +
> +    d.addr = (uint64_t)t->func;
> +    d.sched_on = t->scheduled_on;
> +    d.is_sirq = t->is_softirq;
> +    __trace_var(TRC_XEN_TASKLET_SCHEDULE, 1, sizeof(d), &d);
> +}
> +static inline void trace_work(const struct tasklet *t)
> +{
> +    uint64_t addr;
> +
> +    if ( likely(!tb_init_done) )
> +        return;
> +
> +    addr = (uint64_t)t->func;
> +    __trace_var(TRC_XEN_TASKLET_WORK, 1, sizeof(addr), &addr);
> +}
> +static inline void trace_kill(const struct tasklet *t)
> +{
> +    struct {
> +        uint64_t addr;
> +        int16_t sched_on, is_run;
> +    } d;
> +
> +    if ( likely(!tb_init_done) )
> +        return;
> +
> +    d.addr = (uint64_t)t->func;
> +    d.sched_on = t->scheduled_on;
> +    d.is_run = t->is_running;
> +    __trace_var(TRC_XEN_TASKLET_KILL, 0, sizeof(d), &d);
> +}
> +static inline void trace_init(const struct tasklet *t)
> +{
> +    struct {
> +        uint64_t addr;
> +        uint32_t is_sirq;
> +    } d;
> +
> +    if ( likely(!tb_init_done) )
> +        return;
> +
> +    d.addr = (uint64_t)t->func;
> +    d.is_sirq = t->is_softirq;
> +    __trace_var(TRC_XEN_TASKLET_INIT, 0, sizeof(d), &d);
> +}
> +#define trace_migrate()      TRACE_0D(TRC_XEN_TASKLET_MIGR);
> +#else
> +#define trace_enqueue(t)     do {} while ( 0 )
> +#define trace_schedule(t)    do {} while ( 0 )
> +#define trace_work(t)        do {} while ( 0 )
> +#define trace_kill(t)        do {} while ( 0 )
> +#define trace_migrate()      do {} while ( 0 )
> +#define trace_init(t)        do {} while ( 0 )
> +#endif /* TRACE_TASKLETS */

Seeing how such additions add up, I think I'd prefer if you put them
into header files instead of cluttering source files this way. You
could have one such header per traceable component.

> @@ -178,6 +258,11 @@ static void migrate_tasklets_from_cpu(unsigned int cpu, 
> struct list_head *list)
>  
>      spin_lock_irqsave(&tasklet_lock, flags);
>  
> +    if ( list_empty(list) )
> +        goto out;
> +
> +    trace_migrate();
> +
>      while ( !list_empty(list) )

Two alternatives:

    if ( !list_empty(list) )
        trace_migrate();

(avoiding the goto) or

    if ( list_empty(list) )
        goto out;

    trace_migrate();

    do {
        ...
    } while ( !list_empty(list) );

(avoiding the redundant check).

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.