Skip to content

Commit bd78acc

Browse files
Song Chenmhiramat
authored andcommitted
kernel/trace: extract common part in process_fetch_insn
Each probe has an instance of process_fetch_insn respectively, but they have something in common. This patch aims to extract the common part into process_common_fetch_insn which can be shared by each probe, and they only need to focus on their special cases. Signed-off-by: Song Chen <[email protected]> Suggested-by: Masami Hiramatsu <[email protected]> Acked-by: Masami Hiramatsu <[email protected]> Signed-off-by: Masami Hiramatsu <[email protected]>
1 parent 672a2bf commit bd78acc

File tree

4 files changed

+34
-37
lines changed

4 files changed

+34
-37
lines changed

kernel/trace/trace_eprobe.c

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -396,20 +396,12 @@ static int get_eprobe_size(struct trace_probe *tp, void *rec)
396396
case FETCH_OP_TP_ARG:
397397
val = get_event_field(code, rec);
398398
break;
399-
case FETCH_OP_IMM:
400-
val = code->immediate;
401-
break;
402-
case FETCH_OP_COMM:
403-
val = (unsigned long)current->comm;
404-
break;
405-
case FETCH_OP_DATA:
406-
val = (unsigned long)code->data;
407-
break;
408399
case FETCH_NOP_SYMBOL: /* Ignore a place holder */
409400
code++;
410401
goto retry;
411402
default:
412-
continue;
403+
if (process_common_fetch_insn(code, &val) < 0)
404+
continue;
413405
}
414406
code++;
415407
len = process_fetch_insn_bottom(code, val, NULL, NULL);
@@ -429,26 +421,20 @@ process_fetch_insn(struct fetch_insn *code, void *rec, void *dest,
429421
void *base)
430422
{
431423
unsigned long val;
424+
int ret;
432425

433426
retry:
434427
switch (code->op) {
435428
case FETCH_OP_TP_ARG:
436429
val = get_event_field(code, rec);
437430
break;
438-
case FETCH_OP_IMM:
439-
val = code->immediate;
440-
break;
441-
case FETCH_OP_COMM:
442-
val = (unsigned long)current->comm;
443-
break;
444-
case FETCH_OP_DATA:
445-
val = (unsigned long)code->data;
446-
break;
447431
case FETCH_NOP_SYMBOL: /* Ignore a place holder */
448432
code++;
449433
goto retry;
450434
default:
451-
return -EILSEQ;
435+
ret = process_common_fetch_insn(code, &val);
436+
if (ret < 0)
437+
return ret;
452438
}
453439
code++;
454440
return process_fetch_insn_bottom(code, val, dest, base);

kernel/trace/trace_kprobe.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,6 +1225,7 @@ process_fetch_insn(struct fetch_insn *code, void *rec, void *dest,
12251225
{
12261226
struct pt_regs *regs = rec;
12271227
unsigned long val;
1228+
int ret;
12281229

12291230
retry:
12301231
/* 1st stage: get value from context */
@@ -1241,15 +1242,6 @@ process_fetch_insn(struct fetch_insn *code, void *rec, void *dest,
12411242
case FETCH_OP_RETVAL:
12421243
val = regs_return_value(regs);
12431244
break;
1244-
case FETCH_OP_IMM:
1245-
val = code->immediate;
1246-
break;
1247-
case FETCH_OP_COMM:
1248-
val = (unsigned long)current->comm;
1249-
break;
1250-
case FETCH_OP_DATA:
1251-
val = (unsigned long)code->data;
1252-
break;
12531245
#ifdef CONFIG_HAVE_FUNCTION_ARG_ACCESS_API
12541246
case FETCH_OP_ARG:
12551247
val = regs_get_kernel_argument(regs, code->param);
@@ -1259,7 +1251,9 @@ process_fetch_insn(struct fetch_insn *code, void *rec, void *dest,
12591251
code++;
12601252
goto retry;
12611253
default:
1262-
return -EILSEQ;
1254+
ret = process_common_fetch_insn(code, &val);
1255+
if (ret < 0)
1256+
return ret;
12631257
}
12641258
code++;
12651259

kernel/trace/trace_probe_tmpl.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,26 @@ fetch_store_symstring(unsigned long addr, void *dest, void *base)
9898
return sprint_symbol(__dest, addr);
9999
}
100100

101+
/* common part of process_fetch_insn*/
102+
static nokprobe_inline int
103+
process_common_fetch_insn(struct fetch_insn *code, unsigned long *val)
104+
{
105+
switch (code->op) {
106+
case FETCH_OP_IMM:
107+
*val = code->immediate;
108+
break;
109+
case FETCH_OP_COMM:
110+
*val = (unsigned long)current->comm;
111+
break;
112+
case FETCH_OP_DATA:
113+
*val = (unsigned long)code->data;
114+
break;
115+
default:
116+
return -EILSEQ;
117+
}
118+
return 0;
119+
}
120+
101121
/* From the 2nd stage, routine is same */
102122
static nokprobe_inline int
103123
process_fetch_insn_bottom(struct fetch_insn *code, unsigned long val,

kernel/trace/trace_uprobe.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ process_fetch_insn(struct fetch_insn *code, void *rec, void *dest,
220220
{
221221
struct pt_regs *regs = rec;
222222
unsigned long val;
223+
int ret;
223224

224225
/* 1st stage: get value from context */
225226
switch (code->op) {
@@ -235,20 +236,16 @@ process_fetch_insn(struct fetch_insn *code, void *rec, void *dest,
235236
case FETCH_OP_RETVAL:
236237
val = regs_return_value(regs);
237238
break;
238-
case FETCH_OP_IMM:
239-
val = code->immediate;
240-
break;
241239
case FETCH_OP_COMM:
242240
val = FETCH_TOKEN_COMM;
243241
break;
244-
case FETCH_OP_DATA:
245-
val = (unsigned long)code->data;
246-
break;
247242
case FETCH_OP_FOFFS:
248243
val = translate_user_vaddr(code->immediate);
249244
break;
250245
default:
251-
return -EILSEQ;
246+
ret = process_common_fetch_insn(code, &val);
247+
if (ret < 0)
248+
return ret;
252249
}
253250
code++;
254251

0 commit comments

Comments
 (0)