aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/kprobes.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kprobes.c')
-rw-r--r--kernel/kprobes.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c
index 17ec4afb0994..6fcf8dd148d0 100644
--- a/kernel/kprobes.c
+++ b/kernel/kprobes.c
@@ -87,6 +87,12 @@ struct kprobe_insn_page {
87 int ngarbage; 87 int ngarbage;
88}; 88};
89 89
90enum kprobe_slot_state {
91 SLOT_CLEAN = 0,
92 SLOT_DIRTY = 1,
93 SLOT_USED = 2,
94};
95
90static struct hlist_head kprobe_insn_pages; 96static struct hlist_head kprobe_insn_pages;
91static int kprobe_garbage_slots; 97static int kprobe_garbage_slots;
92static int collect_garbage_slots(void); 98static int collect_garbage_slots(void);
@@ -130,8 +136,8 @@ kprobe_opcode_t __kprobes *get_insn_slot(void)
130 if (kip->nused < INSNS_PER_PAGE) { 136 if (kip->nused < INSNS_PER_PAGE) {
131 int i; 137 int i;
132 for (i = 0; i < INSNS_PER_PAGE; i++) { 138 for (i = 0; i < INSNS_PER_PAGE; i++) {
133 if (!kip->slot_used[i]) { 139 if (kip->slot_used[i] == SLOT_CLEAN) {
134 kip->slot_used[i] = 1; 140 kip->slot_used[i] = SLOT_USED;
135 kip->nused++; 141 kip->nused++;
136 return kip->insns + (i * MAX_INSN_SIZE); 142 return kip->insns + (i * MAX_INSN_SIZE);
137 } 143 }
@@ -163,8 +169,8 @@ kprobe_opcode_t __kprobes *get_insn_slot(void)
163 } 169 }
164 INIT_HLIST_NODE(&kip->hlist); 170 INIT_HLIST_NODE(&kip->hlist);
165 hlist_add_head(&kip->hlist, &kprobe_insn_pages); 171 hlist_add_head(&kip->hlist, &kprobe_insn_pages);
166 memset(kip->slot_used, 0, INSNS_PER_PAGE); 172 memset(kip->slot_used, SLOT_CLEAN, INSNS_PER_PAGE);
167 kip->slot_used[0] = 1; 173 kip->slot_used[0] = SLOT_USED;
168 kip->nused = 1; 174 kip->nused = 1;
169 kip->ngarbage = 0; 175 kip->ngarbage = 0;
170 return kip->insns; 176 return kip->insns;
@@ -173,7 +179,7 @@ kprobe_opcode_t __kprobes *get_insn_slot(void)
173/* Return 1 if all garbages are collected, otherwise 0. */ 179/* Return 1 if all garbages are collected, otherwise 0. */
174static int __kprobes collect_one_slot(struct kprobe_insn_page *kip, int idx) 180static int __kprobes collect_one_slot(struct kprobe_insn_page *kip, int idx)
175{ 181{
176 kip->slot_used[idx] = 0; 182 kip->slot_used[idx] = SLOT_CLEAN;
177 kip->nused--; 183 kip->nused--;
178 if (kip->nused == 0) { 184 if (kip->nused == 0) {
179 /* 185 /*
@@ -212,7 +218,7 @@ static int __kprobes collect_garbage_slots(void)
212 continue; 218 continue;
213 kip->ngarbage = 0; /* we will collect all garbages */ 219 kip->ngarbage = 0; /* we will collect all garbages */
214 for (i = 0; i < INSNS_PER_PAGE; i++) { 220 for (i = 0; i < INSNS_PER_PAGE; i++) {
215 if (kip->slot_used[i] == -1 && 221 if (kip->slot_used[i] == SLOT_DIRTY &&
216 collect_one_slot(kip, i)) 222 collect_one_slot(kip, i))
217 break; 223 break;
218 } 224 }
@@ -232,7 +238,7 @@ void __kprobes free_insn_slot(kprobe_opcode_t * slot, int dirty)
232 slot < kip->insns + (INSNS_PER_PAGE * MAX_INSN_SIZE)) { 238 slot < kip->insns + (INSNS_PER_PAGE * MAX_INSN_SIZE)) {
233 int i = (slot - kip->insns) / MAX_INSN_SIZE; 239 int i = (slot - kip->insns) / MAX_INSN_SIZE;
234 if (dirty) { 240 if (dirty) {
235 kip->slot_used[i] = -1; 241 kip->slot_used[i] = SLOT_DIRTY;
236 kip->ngarbage++; 242 kip->ngarbage++;
237 } else { 243 } else {
238 collect_one_slot(kip, i); 244 collect_one_slot(kip, i);