blob: 8ba7355872c75aed7da6126f6737847e7e4bfad8 [file] [log] [blame]
#ifndef __KMEM_MON_H__
#define __KMEM_MON_H__
#include <linux/sched.h>
#ifdef CONFIG_MTPROF_KMEM
#ifndef TRUE
/** @def TRUE Logical value of true. */
#define TRUE 1
#endif
#ifndef FALSE
/** @def FALSE Logical value of false. */
#define FALSE 0
#endif
/* TODO: relationship amoung differnent definations */
#define MAX_PROCESS_NUM (16*1024) /* MAX PID defined by linux: 32 *1024 - 1 */
#define MAX_KMEM_MON_NUM (20*1024)
#define MAX_ADDR_TABLE (64*1024) /* NOTICE: for the hash */
#define MAX_CALLER_TABLE (80*1024)
#define MAX_FAIL_PARAMETER 256
#define MAX_MEM_CLASS_NUM 64
#define MAX_CMD_LINE 64
#define MAX_PID_LEN 6 /* because 16*1024 = 16384 */
#define MAX_ADDR_IDX (16*1024) /* 14 */
#define ADDR_SHIFT 14
typedef enum {
KMEM_MON_TYPE_KMALLOC = 0, /* kmalloc() or kfree(). */
KMEM_MON_TYPE_KMEM_CACHE, /* kmem_cache_*(). */
KMEM_MON_TYPE_PAGES, /* __get_free_pages() and friends. */
KMEM_MON_TYPE_PMEM,
KMEM_MON_TYPE_M4U,
KMEM_MON_TYPE_VMALLOC,
KMEM_MON_TYPE_ASHMEM,
KMEM_MON_TYPE_KMALLOCWRAPPER,
} MEM_CLASS_T;
typedef struct mem_class_info_struct {
MEM_CLASS_T mem_class;
int index[MAX_KMEM_MON_NUM];
} mem_class_info_t;
/* TODO: keep caller backtrace */
typedef struct caller_info_struct {
unsigned long caller_addr;
int bytes_req, bytes_alloc;
int bytes_free;
int freq_alloc, freq_free;
int pid;
MEM_CLASS_T mem_class;
int next_node;
} caller_info_t;
/* NOTICE: if the node is not used, caller_hash == 0 */
typedef struct addr_info_struct {
unsigned long addr;
int caller_hash;
int next;
} addr_info_t;
typedef struct process_info_struct {
pid_t pid;
pid_t tgid;
char cmdline[MAX_CMD_LINE];
char comm[TASK_COMM_LEN]; /* executable name excluding path
- access with [gs]et_task_comm (which lock
it with task_lock())
- initialized normally by setup_new_exec */
int start_idx; /* ->kmalloc->pem... */
/* TODO: use an array to arrage all mem nodes */
} process_info_t;
/* ========================================================================== */
/**
* @struct kmem_info_struct
*
* @brief keep information for kernel memory monitoring
*
*/
/**
* @typedef kmem_mon_info_t
* @brief Type definition for the kmem_mon_info_struct.
*/
typedef struct mem_info_struct {
MEM_CLASS_T mem_class;
/* these information should be kept in caller table */
size_t total_bytes_req;
size_t total_bytes_alloc;
size_t total_bytes_free;
int alloc_freq;
int free_freq;
int peak_every_req; /* peak size of a single requirment */
unsigned long peak_caller; /* code position' */
/* ends */
/* TODO: allocation failures */
#if 0
int fail_freq;
unsigned long fail_caller;
char last_fail_parameter[MAX_FAIL_PARAMETER]; /* only record the latest failure's paramter */
#endif
int caller_start_idx;
int next_mem_node;
/* */
/* TODO: additional info for different memory class */
/* */
} mem_info_t;
#endif /* #ifdef CONFIG_MTPROF_KMEM */
extern void kmem_mon_kmalloc(unsigned long caller, const void *addr, int bytes_req,
int bytes_alloc);
extern void kmem_mon_kfree(unsigned long caller, const void *addr);
extern void kmem_mon_pmem_alloc(int req, int alloc);
extern void kmem_mon_pmem_free(int size);
extern void kmem_mon_m4u_alloc(int req, int alloc);
extern void kmem_mon_m4u_dealloc(const unsigned int addr, const unsigned int req_size);
extern void kmem_mon_vmalloc(unsigned long caller, const void *addr, int bytes_req,
int bytes_alloc);
extern void kmem_mon_vfree(int size);
extern void kmem_mon_ashmem_mmap(int size);
extern void kmem_mon_ashmem_release(int size);
extern void kmem_mon_kmallocwrapper(unsigned long caller, int size);
/* extern void kmem_mon_kmallocwrapper(unsigned long caller, const void *addr, int bytes_req, int bytes_alloc); */
extern void kmem_mon_kfreewrapper(const void *addr);
extern void kmem_mon_kmem_cache_alloc(unsigned long caller, const void *addr, size_t bytes_req,
size_t bytes_alloc);
extern void kmem_mon_kmem_cache_free(unsigned long caller, const void *addr);
#endif /* __KMEM_MON_H__ */