LCOV - code coverage report
Current view: top level - arch/x86/include/asm/trace - irq_vectors.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 11 20 55.0 %
Date: 2021-04-22 12:43:58 Functions: 15 28 53.6 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #undef TRACE_SYSTEM
       3             : #define TRACE_SYSTEM irq_vectors
       4             : 
       5             : #if !defined(_TRACE_IRQ_VECTORS_H) || defined(TRACE_HEADER_MULTI_READ)
       6             : #define _TRACE_IRQ_VECTORS_H
       7             : 
       8             : #include <linux/tracepoint.h>
       9             : #include <asm/trace/common.h>
      10             : 
      11             : #ifdef CONFIG_X86_LOCAL_APIC
      12             : 
      13             : DECLARE_EVENT_CLASS(x86_irq_vector,
      14             : 
      15             :         TP_PROTO(int vector),
      16             : 
      17             :         TP_ARGS(vector),
      18             : 
      19             :         TP_STRUCT__entry(
      20             :                 __field(                int,    vector  )
      21             :         ),
      22             : 
      23             :         TP_fast_assign(
      24             :                 __entry->vector = vector;
      25             :         ),
      26             : 
      27             :         TP_printk("vector=%d", __entry->vector) );
      28             : 
      29             : #define DEFINE_IRQ_VECTOR_EVENT(name)           \
      30             : DEFINE_EVENT_FN(x86_irq_vector, name##_entry,   \
      31             :         TP_PROTO(int vector),                   \
      32             :         TP_ARGS(vector), NULL, NULL);           \
      33             : DEFINE_EVENT_FN(x86_irq_vector, name##_exit,    \
      34             :         TP_PROTO(int vector),                   \
      35             :         TP_ARGS(vector), NULL, NULL);
      36             : 
      37             : /*
      38             :  * local_timer - called when entering/exiting a local timer interrupt
      39             :  * vector handler
      40             :  */
      41      294577 : DEFINE_IRQ_VECTOR_EVENT(local_timer);
      42             : 
      43             : /*
      44             :  * spurious_apic - called when entering/exiting a spurious apic vector handler
      45             :  */
      46           0 : DEFINE_IRQ_VECTOR_EVENT(spurious_apic);
      47             : 
      48             : /*
      49             :  * error_apic - called when entering/exiting an error apic vector handler
      50             :  */
      51           0 : DEFINE_IRQ_VECTOR_EVENT(error_apic);
      52             : 
      53             : /*
      54             :  * x86_platform_ipi - called when entering/exiting a x86 platform ipi interrupt
      55             :  * vector handler
      56             :  */
      57           0 : DEFINE_IRQ_VECTOR_EVENT(x86_platform_ipi);
      58             : 
      59             : #ifdef CONFIG_IRQ_WORK
      60             : /*
      61             :  * irq_work - called when entering/exiting a irq work interrupt
      62             :  * vector handler
      63             :  */
      64           0 : DEFINE_IRQ_VECTOR_EVENT(irq_work);
      65             : 
      66             : /*
      67             :  * We must dis-allow sampling irq_work_exit() because perf event sampling
      68             :  * itself can cause irq_work, which would lead to an infinite loop;
      69             :  *
      70             :  *  1) irq_work_exit happens
      71             :  *  2) generates perf sample
      72             :  *  3) generates irq_work
      73             :  *  4) goto 1
      74             :  */
      75             : TRACE_EVENT_PERF_PERM(irq_work_exit, is_sampling_event(p_event) ? -EPERM : 0);
      76             : #endif
      77             : 
      78             : /*
      79             :  * The ifdef is required because that tracepoint macro hell emits tracepoint
      80             :  * code in files which include this header even if the tracepoint is not
      81             :  * enabled. Brilliant stuff that.
      82             :  */
      83             : #ifdef CONFIG_SMP
      84             : /*
      85             :  * reschedule - called when entering/exiting a reschedule vector handler
      86             :  */
      87       10100 : DEFINE_IRQ_VECTOR_EVENT(reschedule);
      88             : 
      89             : /*
      90             :  * call_function - called when entering/exiting a call function interrupt
      91             :  * vector handler
      92             :  */
      93         549 : DEFINE_IRQ_VECTOR_EVENT(call_function);
      94             : 
      95             : /*
      96             :  * call_function_single - called when entering/exiting a call function
      97             :  * single interrupt vector handler
      98             :  */
      99       47053 : DEFINE_IRQ_VECTOR_EVENT(call_function_single);
     100             : #endif
     101             : 
     102             : #ifdef CONFIG_X86_MCE_THRESHOLD
     103             : /*
     104             :  * threshold_apic - called when entering/exiting a threshold apic interrupt
     105             :  * vector handler
     106             :  */
     107             : DEFINE_IRQ_VECTOR_EVENT(threshold_apic);
     108             : #endif
     109             : 
     110             : #ifdef CONFIG_X86_MCE_AMD
     111             : /*
     112             :  * deferred_error_apic - called when entering/exiting a deferred apic interrupt
     113             :  * vector handler
     114             :  */
     115             : DEFINE_IRQ_VECTOR_EVENT(deferred_error_apic);
     116             : #endif
     117             : 
     118             : #ifdef CONFIG_X86_THERMAL_VECTOR
     119             : /*
     120             :  * thermal_apic - called when entering/exiting a thermal apic interrupt
     121             :  * vector handler
     122             :  */
     123             : DEFINE_IRQ_VECTOR_EVENT(thermal_apic);
     124             : #endif
     125             : 
     126          36 : TRACE_EVENT(vector_config,
     127             : 
     128             :         TP_PROTO(unsigned int irq, unsigned int vector,
     129             :                  unsigned int cpu, unsigned int apicdest),
     130             : 
     131             :         TP_ARGS(irq, vector, cpu, apicdest),
     132             : 
     133             :         TP_STRUCT__entry(
     134             :                 __field(        unsigned int,   irq             )
     135             :                 __field(        unsigned int,   vector          )
     136             :                 __field(        unsigned int,   cpu             )
     137             :                 __field(        unsigned int,   apicdest        )
     138             :         ),
     139             : 
     140             :         TP_fast_assign(
     141             :                 __entry->irq         = irq;
     142             :                 __entry->vector              = vector;
     143             :                 __entry->cpu         = cpu;
     144             :                 __entry->apicdest    = apicdest;
     145             :         ),
     146             : 
     147             :         TP_printk("irq=%u vector=%u cpu=%u apicdest=0x%08x",
     148             :                   __entry->irq, __entry->vector, __entry->cpu,
     149             :                   __entry->apicdest)
     150             : );
     151             : 
     152             : DECLARE_EVENT_CLASS(vector_mod,
     153             : 
     154             :         TP_PROTO(unsigned int irq, unsigned int vector,
     155             :                  unsigned int cpu, unsigned int prev_vector,
     156             :                  unsigned int prev_cpu),
     157             : 
     158             :         TP_ARGS(irq, vector, cpu, prev_vector, prev_cpu),
     159             : 
     160             :         TP_STRUCT__entry(
     161             :                 __field(        unsigned int,   irq             )
     162             :                 __field(        unsigned int,   vector          )
     163             :                 __field(        unsigned int,   cpu             )
     164             :                 __field(        unsigned int,   prev_vector     )
     165             :                 __field(        unsigned int,   prev_cpu        )
     166             :         ),
     167             : 
     168             :         TP_fast_assign(
     169             :                 __entry->irq         = irq;
     170             :                 __entry->vector              = vector;
     171             :                 __entry->cpu         = cpu;
     172             :                 __entry->prev_vector = prev_vector;
     173             :                 __entry->prev_cpu    = prev_cpu;
     174             : 
     175             :         ),
     176             : 
     177             :         TP_printk("irq=%u vector=%u cpu=%u prev_vector=%u prev_cpu=%u",
     178             :                   __entry->irq, __entry->vector, __entry->cpu,
     179             :                   __entry->prev_vector, __entry->prev_cpu)
     180             : );
     181             : 
     182             : #define DEFINE_IRQ_VECTOR_MOD_EVENT(name)                               \
     183             : DEFINE_EVENT_FN(vector_mod, name,                                       \
     184             :         TP_PROTO(unsigned int irq, unsigned int vector,                 \
     185             :                  unsigned int cpu, unsigned int prev_vector,            \
     186             :                  unsigned int prev_cpu),                                \
     187             :         TP_ARGS(irq, vector, cpu, prev_vector, prev_cpu), NULL, NULL);  \
     188             : 
     189           6 : DEFINE_IRQ_VECTOR_MOD_EVENT(vector_update);
     190          30 : DEFINE_IRQ_VECTOR_MOD_EVENT(vector_clear);
     191             : 
     192             : DECLARE_EVENT_CLASS(vector_reserve,
     193             : 
     194             :         TP_PROTO(unsigned int irq, int ret),
     195             : 
     196             :         TP_ARGS(irq, ret),
     197             : 
     198             :         TP_STRUCT__entry(
     199             :                 __field(        unsigned int,   irq     )
     200             :                 __field(        int,            ret     )
     201             :         ),
     202             : 
     203             :         TP_fast_assign(
     204             :                 __entry->irq = irq;
     205             :                 __entry->ret = ret;
     206             :         ),
     207             : 
     208             :         TP_printk("irq=%u ret=%d", __entry->irq, __entry->ret)
     209             : );
     210             : 
     211             : #define DEFINE_IRQ_VECTOR_RESERVE_EVENT(name)   \
     212             : DEFINE_EVENT_FN(vector_reserve, name,   \
     213             :         TP_PROTO(unsigned int irq, int ret),    \
     214             :         TP_ARGS(irq, ret), NULL, NULL);         \
     215             : 
     216           0 : DEFINE_IRQ_VECTOR_RESERVE_EVENT(vector_reserve_managed);
     217          30 : DEFINE_IRQ_VECTOR_RESERVE_EVENT(vector_reserve);
     218             : 
     219           6 : TRACE_EVENT(vector_alloc,
     220             : 
     221             :         TP_PROTO(unsigned int irq, unsigned int vector, bool reserved,
     222             :                  int ret),
     223             : 
     224             :         TP_ARGS(irq, vector, reserved, ret),
     225             : 
     226             :         TP_STRUCT__entry(
     227             :                 __field(        unsigned int,   irq             )
     228             :                 __field(        unsigned int,   vector          )
     229             :                 __field(        bool,           reserved        )
     230             :                 __field(        int,            ret             )
     231             :         ),
     232             : 
     233             :         TP_fast_assign(
     234             :                 __entry->irq         = irq;
     235             :                 __entry->vector              = ret < 0 ? 0 : vector;
     236             :                 __entry->reserved    = reserved;
     237             :                 __entry->ret         = ret > 0 ? 0 : ret;
     238             :         ),
     239             : 
     240             :         TP_printk("irq=%u vector=%u reserved=%d ret=%d",
     241             :                   __entry->irq, __entry->vector,
     242             :                   __entry->reserved, __entry->ret)
     243             : );
     244             : 
     245           0 : TRACE_EVENT(vector_alloc_managed,
     246             : 
     247             :         TP_PROTO(unsigned int irq, unsigned int vector,
     248             :                  int ret),
     249             : 
     250             :         TP_ARGS(irq, vector, ret),
     251             : 
     252             :         TP_STRUCT__entry(
     253             :                 __field(        unsigned int,   irq             )
     254             :                 __field(        unsigned int,   vector          )
     255             :                 __field(        int,            ret             )
     256             :         ),
     257             : 
     258             :         TP_fast_assign(
     259             :                 __entry->irq         = irq;
     260             :                 __entry->vector              = ret < 0 ? 0 : vector;
     261             :                 __entry->ret         = ret > 0 ? 0 : ret;
     262             :         ),
     263             : 
     264             :         TP_printk("irq=%u vector=%u ret=%d",
     265             :                   __entry->irq, __entry->vector, __entry->ret)
     266             : );
     267             : 
     268             : DECLARE_EVENT_CLASS(vector_activate,
     269             : 
     270             :         TP_PROTO(unsigned int irq, bool is_managed, bool can_reserve,
     271             :                  bool reserve),
     272             : 
     273             :         TP_ARGS(irq, is_managed, can_reserve, reserve),
     274             : 
     275             :         TP_STRUCT__entry(
     276             :                 __field(        unsigned int,   irq             )
     277             :                 __field(        bool,           is_managed      )
     278             :                 __field(        bool,           can_reserve     )
     279             :                 __field(        bool,           reserve         )
     280             :         ),
     281             : 
     282             :         TP_fast_assign(
     283             :                 __entry->irq         = irq;
     284             :                 __entry->is_managed  = is_managed;
     285             :                 __entry->can_reserve = can_reserve;
     286             :                 __entry->reserve     = reserve;
     287             :         ),
     288             : 
     289             :         TP_printk("irq=%u is_managed=%d can_reserve=%d reserve=%d",
     290             :                   __entry->irq, __entry->is_managed, __entry->can_reserve,
     291             :                   __entry->reserve)
     292             : );
     293             : 
     294             : #define DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(name)                          \
     295             : DEFINE_EVENT_FN(vector_activate, name,                                  \
     296             :         TP_PROTO(unsigned int irq, bool is_managed,                     \
     297             :                  bool can_reserve, bool reserve),                       \
     298             :         TP_ARGS(irq, is_managed, can_reserve, reserve), NULL, NULL);    \
     299             : 
     300           6 : DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(vector_activate);
     301           0 : DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(vector_deactivate);
     302             : 
     303           0 : TRACE_EVENT(vector_teardown,
     304             : 
     305             :         TP_PROTO(unsigned int irq, bool is_managed, bool has_reserved),
     306             : 
     307             :         TP_ARGS(irq, is_managed, has_reserved),
     308             : 
     309             :         TP_STRUCT__entry(
     310             :                 __field(        unsigned int,   irq             )
     311             :                 __field(        bool,           is_managed      )
     312             :                 __field(        bool,           has_reserved    )
     313             :         ),
     314             : 
     315             :         TP_fast_assign(
     316             :                 __entry->irq         = irq;
     317             :                 __entry->is_managed  = is_managed;
     318             :                 __entry->has_reserved        = has_reserved;
     319             :         ),
     320             : 
     321             :         TP_printk("irq=%u is_managed=%d has_reserved=%d",
     322             :                   __entry->irq, __entry->is_managed, __entry->has_reserved)
     323             : );
     324             : 
     325          30 : TRACE_EVENT(vector_setup,
     326             : 
     327             :         TP_PROTO(unsigned int irq, bool is_legacy, int ret),
     328             : 
     329             :         TP_ARGS(irq, is_legacy, ret),
     330             : 
     331             :         TP_STRUCT__entry(
     332             :                 __field(        unsigned int,   irq             )
     333             :                 __field(        bool,           is_legacy       )
     334             :                 __field(        int,            ret             )
     335             :         ),
     336             : 
     337             :         TP_fast_assign(
     338             :                 __entry->irq         = irq;
     339             :                 __entry->is_legacy   = is_legacy;
     340             :                 __entry->ret         = ret;
     341             :         ),
     342             : 
     343             :         TP_printk("irq=%u is_legacy=%d ret=%d",
     344             :                   __entry->irq, __entry->is_legacy, __entry->ret)
     345             : );
     346             : 
     347           0 : TRACE_EVENT(vector_free_moved,
     348             : 
     349             :         TP_PROTO(unsigned int irq, unsigned int cpu, unsigned int vector,
     350             :                  bool is_managed),
     351             : 
     352             :         TP_ARGS(irq, cpu, vector, is_managed),
     353             : 
     354             :         TP_STRUCT__entry(
     355             :                 __field(        unsigned int,   irq             )
     356             :                 __field(        unsigned int,   cpu             )
     357             :                 __field(        unsigned int,   vector          )
     358             :                 __field(        bool,           is_managed      )
     359             :         ),
     360             : 
     361             :         TP_fast_assign(
     362             :                 __entry->irq         = irq;
     363             :                 __entry->cpu         = cpu;
     364             :                 __entry->vector              = vector;
     365             :                 __entry->is_managed  = is_managed;
     366             :         ),
     367             : 
     368             :         TP_printk("irq=%u cpu=%u vector=%u is_managed=%d",
     369             :                   __entry->irq, __entry->cpu, __entry->vector,
     370             :                   __entry->is_managed)
     371             : );
     372             : 
     373             : 
     374             : #endif /* CONFIG_X86_LOCAL_APIC */
     375             : 
     376             : #undef TRACE_INCLUDE_PATH
     377             : #undef TRACE_INCLUDE_FILE
     378             : #define TRACE_INCLUDE_PATH .
     379             : #define TRACE_INCLUDE_FILE irq_vectors
     380             : #endif /*  _TRACE_IRQ_VECTORS_H */
     381             : 
     382             : /* This part must be outside protection */
     383             : #include <trace/define_trace.h>

Generated by: LCOV version 1.14