aboutsummaryrefslogtreecommitdiff
path: root/include/linux/kmem_mon.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/kmem_mon.h')
-rw-r--r--include/linux/kmem_mon.h138
1 files changed, 138 insertions, 0 deletions
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 <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__ */