liyujie
2025-08-28 b3810562527858a3b3d98ffa6e9c9c5b0f4a9a8e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
 * Copyright (c) 2018 Google, Inc.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */
 
#ifndef _LTP_TRACE_PARSE_H_
#define _LTP_TRACE_PARSE_H_
 
/*
 * It is necessary to define TRACE_EVENTS to communicate the events to trace. */
#define TRACING_DIR "/sys/kernel/debug/tracing/"
 
enum {
   TRACE_RECORD_OTHER = 0,
   TRACE_RECORD_SCHED_PROCESS_EXIT,
   TRACE_RECORD_SCHED_PROCESS_FORK,
   TRACE_RECORD_SCHED_SWITCH,
   TRACE_RECORD_SCHED_WAKEUP,
   TRACE_RECORD_SUGOV_UTIL_UPDATE,
   TRACE_RECORD_SUGOV_NEXT_FREQ,
   TRACE_RECORD_CPU_FREQUENCY,
   TRACE_RECORD_TRACING_MARK_WRITE,
};
 
#define IRQ_CONTEXT_NORMAL '.'
#define IRQ_CONTEXT_SOFT 's'
#define IRQ_CONTEXT_HARD 'h'
#define IRQ_CONTEXT_HARD_IN_SOFT 'H'
#define IRQ_CONTEXT_NMI 'z'
#define IRQ_CONTEXT_NMI_IN_HARD 'Z'
 
struct timestamp {
   unsigned int sec;
   unsigned int usec;
};
 
struct trace_cpu_frequency {
   unsigned int state;
   unsigned short cpu;
};
 
struct trace_sched_switch {
   char prev_comm[17];
   unsigned short prev_pid;
   unsigned short prev_prio;
   char prev_state;
   char next_comm[17];
   unsigned short next_pid;
   unsigned short next_prio;
};
 
struct trace_sched_wakeup {
   char comm[17];
   unsigned short pid;
   unsigned short prio;
   unsigned short cpu;
};
 
struct trace_sugov_util_update {
   int cpu;
   int util;
   int avg_cap;
   int max_cap;
};
 
struct trace_sugov_next_freq {
   int cpu;
   int util;
   int max;
   int freq;
};
 
struct trace_record {
   char task[17];
   unsigned short pid;
   unsigned short cpu;
 
#define TRACE_RECORD_IRQS_OFF 0x1
#define TRACE_RECORD_TIF_NEED_RESCHED 0x2
#define TRACE_RECORD_PREEMPT_NEED_RESCHED 0x4
   unsigned short flags;
   unsigned char irq_context;
   unsigned short preempt_depth;
 
   struct timestamp ts;
 
   unsigned int event_type;
   void *event_data;
};
 
extern int num_trace_records;
extern struct trace_record *trace;
 
void trace_cleanup(void);
void print_trace_record(struct trace_record *tr);
struct trace_record *load_trace(void);
 
#define LOAD_TRACE() \
   if (!load_trace()) \
       tst_brk(TBROK, "Failed to load trace.\n");
 
#endif /* _LTP_TRACE_PARSE_H_ */