From d2e1446d81725c351dc73a03b397ce043fb18452 Mon Sep 17 00:00:00 2001 From: Meizu OpenSource Date: Mon, 15 Aug 2016 10:19:42 +0800 Subject: first commit --- include/linux/kmem_mon.h | 138 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 include/linux/kmem_mon.h (limited to 'include/linux/kmem_mon.h') diff --git a/include/linux/kmem_mon.h b/include/linux/kmem_mon.h new file mode 100644 index 000000000..8ba735587 --- /dev/null +++ b/include/linux/kmem_mon.h @@ -0,0 +1,138 @@ +#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__ */ -- cgit v1.2.3