blob: 6743a64f265cf89eb25279c78352fcf3a99e1ab3 [file] [log] [blame]
/*
* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
* Distributed under the terms of the GNU General Public License v2
*/
#ifndef _KTOP_H_
#define _KTOP_H_ 1
#include <sys/types.h>
#include <style.h>
#include "syscall.h"
enum { MAX_PID = 1 << 15,
MAX_PIDCALLS = 1 << 10,
MAX_NAME = 1 << 12,
SYSCALL_SHIFT = 9,
SYSCALL_MASK = (1 << SYSCALL_SHIFT) - 1,
NUM_ARGS = 6,
MAX_TOP = 10,
MAX_THREAD_NAME = 40 };
static inline u32 mkpidcall(int pid, int syscall)
{
return pid << SYSCALL_SHIFT | syscall;
}
static inline u32 get_pid(int pidcall)
{
return pidcall >> SYSCALL_SHIFT;
}
static inline u32 get_call(u32 pidcall)
{
return pidcall & SYSCALL_MASK;
}
typedef void (*display_fn)(void);
typedef struct Display_s {
display_fn normal;
display_fn help;
} Display_s;
typedef struct Pidcall_s Pidcall_s;
struct Pidcall_s {
Pidcall_s *next; /* hash table chain */
unint clock; /* clock alg throws out old results */
u32 pidcall; /* combination of pid and system call */
u32 count; /* count of calls in last interval */
u32 start_interval; /* interval when created */
struct {
u64 start; /* start time of last call */
u64 total; /* total time in this interval */
u64 max; /* max time in this interval */
} time;
struct {
u32 count; /* snapshot of count */
u64 total_time; /* snapshot of total time */
u64 max_time; /* snapshot of max time */
} snap;
struct {
u32 max_count; /* max count across intervals */
u64 total_count;/* total count across intervals */
u64 total_time; /* total time used by this pidcall */
u64 max_time; /* Max time by any pidcall */
} summary;
char *name;
};
typedef struct TopPidcall_s {
u32 pidcall;
u32 count;
u32 tick;
u64 time;
char name[MAX_THREAD_NAME];
} TopPidcall_s;
extern bool Dump; /* Dump of ftrace logs - don't start display */
extern bool Trace_exit; /* Trace sys_exit events */
extern bool Trace_self; /* Trace myself and ignore others */
extern bool Pause; /* Pause display */
extern bool Help; /* Display help screen */
extern char *Log_file; /* If set, use this file for logging */
extern Display_s Display;
extern u64 *Syscall_count;
extern int Pid[MAX_PID];
extern Pidcall_s Pidcall[MAX_PIDCALLS];
extern u64 Pidcall_record;
extern u64 Pidcall_iterations;
extern u64 Pidcall_tick;
extern u32 Current_interval;
extern TopPidcall_s Top_pidcall[MAX_TOP];
extern u64 No_enter;
extern u64 Found;
extern u64 Out_of_order;
extern u64 No_start;
extern u64 Bad_type;
extern u64 Ignored_pid_count;
extern u64 Slept;
extern bool Halt;
extern Display_s Internal_display;
extern Display_s Kernel_display;
extern Display_s Plot_display;
extern Display_s File_system_display;
extern Display_s Summary_display;
void cleanup(int sig);
void cleanup_collector(void);
void start_collector(void);
void *reduce(void *arg);
void decrease_reduce_interval(void);
void increase_reduce_interval(void);
void reset_reduce(void);
void cleanup_display(void);
void clear_display(void);
pid_t gettid(void);
void ignore_pid(int pid);
bool do_ignore_pid(int pid);
void graph(void);
void log_open(const char *file);
void log_close(void);
void log_pidcalls(void);
/* Rounded integer divide - x/y -> (x + y/2) / y */
#define ROUNDED_DIVIDE(x, y) ((y) ? (((x) + (y) / 2) / (y)) : 0)
#endif