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

Re: [Xen-devel] [PATCH 06/15] xen: trace IRQ enabling/disabling



>>> On 01.06.17 at 19:34, <dario.faggioli@xxxxxxxxxx> wrote:
> @@ -106,6 +106,15 @@ config TRACING
>         in per-CPU ring buffers. The 'xentrace' tool can be used to read
>         the buffers and dump the content on the disk.
>  
> +config TRACE_IRQSOFF
> +     bool "Trace when IRQs are disabled and (re)enabled" if EXPERT = "y"
> +     default n

I'm not aware of any behavioral difference between this an not
specifying a default at all, so I'd like to ask to follow suit (see
surrounding code) and omit this line.

> --- a/xen/common/spinlock.c
> +++ b/xen/common/spinlock.c
> @@ -150,7 +150,9 @@ void _spin_lock(spinlock_t *lock)
>  void _spin_lock_irq(spinlock_t *lock)
>  {
>      ASSERT(local_irq_is_enabled());
> -    local_irq_disable();
> +    _local_irq_disable();

Hmm, looks you're introducing new non-static, underscore-prefixed
symbols. Please don't, use e.g. a "arch_" prefix or a "_notrace" suffix
instead.

> --- a/xen/include/asm-x86/system.h
> +++ b/xen/include/asm-x86/system.h
> @@ -5,6 +5,8 @@
>  #include <xen/bitops.h>
>  #include <asm/processor.h>
>  
> +#include <xen/trace.h>

Why?

> @@ -214,6 +216,79 @@ static always_inline unsigned long __xadd(
>                         "ri" ( (x) & X86_EFLAGS_IF ) );           \
>  })
>  
> +#ifdef CONFIG_TRACE_IRQSOFF
> +
> +#define TRACE_LOCAL_ADDR ((uint64_t) current_text_addr())
> +#define TRACE_RET_ADDR   ((uint64_t) __builtin_return_address(0))
> +
> +#define trace_irq_disable(_a)                                    \
> +({                                                               \
> +    uint64_t addr = _a;                                          \
> +    __trace_var(TRC_HW_IRQ_DISABLE, 1, sizeof(addr), &addr);     \
> +})
> +#define trace_irq_enable(_a)                                     \
> +({                                                               \
> +    uint64_t addr = _a;                                          \
> +    __trace_var(TRC_HW_IRQ_ENABLE, 1, sizeof(addr), &addr);      \
> +})
> +#define trace_irq_save(_x, _a)                                   \
> +({                                                               \
> +    uint64_t addr = _a;                                          \
> +    if ( _x & X86_EFLAGS_IF )                                    \
> +        __trace_var(TRC_HW_IRQ_DISABLE, 1, sizeof(addr), &addr); \
> +})
> +#define trace_irq_restore(_x, _a)                                \
> +({                                                               \
> +    uint64_t addr = _a;                                          \
> +    if ( _x & X86_EFLAGS_IF )                                    \
> +        __trace_var(TRC_HW_IRQ_ENABLE, 1, sizeof(addr), &addr);  \
> +})
> +
> +#define trace_irq_disable_ret()   trace_irq_disable(TRACE_RET_ADDR)
> +#define trace_irq_enable_ret()    trace_irq_enable(TRACE_RET_ADDR)
> +#define trace_irq_save_ret(_x)    trace_irq_save(_x, TRACE_RET_ADDR)
> +#define trace_irq_restore_ret(_x) trace_irq_restore(_x, TRACE_RET_ADDR)
> +
> +#define local_irq_disable()                      \
> +({                                               \
> +    bool_t irqon = local_irq_is_enabled();       \
> +    _local_irq_disable();                        \
> +    if ( unlikely(tb_init_done && irqon) )       \
> +        trace_irq_disable(TRACE_LOCAL_ADDR);     \
> +})
> +
> +#define local_irq_enable()                       \
> +({                                               \
> +    if ( unlikely(tb_init_done) )                \
> +        trace_irq_enable(TRACE_LOCAL_ADDR);      \
> +    _local_irq_enable();                         \
> +})
> +
> +#define local_irq_save(_x)                       \
> +({                                               \
> +    local_save_flags(_x);                        \
> +    _local_irq_disable();                        \
> +    if ( unlikely(tb_init_done) )                \
> +        trace_irq_save(_x, TRACE_LOCAL_ADDR);    \
> +})
> +
> +#define local_irq_restore(_x)                    \
> +({                                               \
> +    if ( unlikely(tb_init_done) )                \
> +        trace_irq_restore(_x, TRACE_LOCAL_ADDR); \
> +    _local_irq_restore(_x);                      \
> +})
> +#else /* !TRACE_IRQSOFF */
> +#define trace_irq_disable_ret()   do { } while ( 0 )
> +#define trace_irq_enable_ret()    do { } while ( 0 )
> +#define trace_irq_save_ret(_x)    do { } while ( 0 )
> +#define trace_irq_restore_ret(_x) do { } while ( 0 )
> +#define local_irq_disable()       _local_irq_disable()
> +#define local_irq_enable()        _local_irq_enable()
> +#define local_irq_save(_x)        _local_irq_save(_x)
> +#define local_irq_restore(_x)     _local_irq_restore(_x)
> +#endif /* TRACE_IRQSOFF */

None of this looks to be arch-specific.

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®.