/*
* 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_ */