1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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__ */
|