#ifndef __KMEM_MON_H__ #define __KMEM_MON_H__ #include #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__ */