kernel/trace: extract common part in process_fetch_insn
authorSong Chen <chensong_2000@189.cn>
Fri, 30 Dec 2022 06:33:53 +0000 (14:33 +0800)
committerMasami Hiramatsu (Google) <mhiramat@kernel.org>
Fri, 24 Feb 2023 01:04:13 +0000 (10:04 +0900)
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 <chensong_2000@189.cn>
Suggested-by: Masami Hiramatsu <mhiramat@kernel.org>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
kernel/trace/trace_eprobe.c
kernel/trace/trace_kprobe.c
kernel/trace/trace_probe_tmpl.h
kernel/trace/trace_uprobe.c

index 846546395d62fc414e487b2a0e8f291b2c2c3318..67e854979d53ec5bbc90641919031484bc4c9502 100644 (file)
@@ -396,20 +396,12 @@ static int get_eprobe_size(struct trace_probe *tp, void *rec)
                        case FETCH_OP_TP_ARG:
                                val = get_event_field(code, rec);
                                break;
-                       case FETCH_OP_IMM:
-                               val = code->immediate;
-                               break;
-                       case FETCH_OP_COMM:
-                               val = (unsigned long)current->comm;
-                               break;
-                       case FETCH_OP_DATA:
-                               val = (unsigned long)code->data;
-                               break;
                        case FETCH_NOP_SYMBOL:  /* Ignore a place holder */
                                code++;
                                goto retry;
                        default:
-                               continue;
+                               if (process_common_fetch_insn(code, &val) < 0)
+                                       continue;
                        }
                        code++;
                        len = process_fetch_insn_bottom(code, val, NULL, NULL);
@@ -429,26 +421,20 @@ process_fetch_insn(struct fetch_insn *code, void *rec, void *dest,
                   void *base)
 {
        unsigned long val;
+       int ret;
 
  retry:
        switch (code->op) {
        case FETCH_OP_TP_ARG:
                val = get_event_field(code, rec);
                break;
-       case FETCH_OP_IMM:
-               val = code->immediate;
-               break;
-       case FETCH_OP_COMM:
-               val = (unsigned long)current->comm;
-               break;
-       case FETCH_OP_DATA:
-               val = (unsigned long)code->data;
-               break;
        case FETCH_NOP_SYMBOL:  /* Ignore a place holder */
                code++;
                goto retry;
        default:
-               return -EILSEQ;
+               ret = process_common_fetch_insn(code, &val);
+               if (ret < 0)
+                       return ret;
        }
        code++;
        return process_fetch_insn_bottom(code, val, dest, base);
index d32c6244ef99568344a85fbcaacda2be35268db1..59cda19a9033302bfa50a575e6aad091edf34498 100644 (file)
@@ -1225,6 +1225,7 @@ process_fetch_insn(struct fetch_insn *code, void *rec, void *dest,
 {
        struct pt_regs *regs = rec;
        unsigned long val;
+       int ret;
 
 retry:
        /* 1st stage: get value from context */
@@ -1241,15 +1242,6 @@ retry:
        case FETCH_OP_RETVAL:
                val = regs_return_value(regs);
                break;
-       case FETCH_OP_IMM:
-               val = code->immediate;
-               break;
-       case FETCH_OP_COMM:
-               val = (unsigned long)current->comm;
-               break;
-       case FETCH_OP_DATA:
-               val = (unsigned long)code->data;
-               break;
 #ifdef CONFIG_HAVE_FUNCTION_ARG_ACCESS_API
        case FETCH_OP_ARG:
                val = regs_get_kernel_argument(regs, code->param);
@@ -1259,7 +1251,9 @@ retry:
                code++;
                goto retry;
        default:
-               return -EILSEQ;
+               ret = process_common_fetch_insn(code, &val);
+               if (ret < 0)
+                       return ret;
        }
        code++;
 
index bd3e755434eb9ac97a2613f591f00defe2cb8a22..00707630788d6d4f217d1c211ad425eb2d493dc5 100644 (file)
@@ -98,6 +98,26 @@ fetch_store_symstring(unsigned long addr, void *dest, void *base)
        return sprint_symbol(__dest, addr);
 }
 
+/* common part of process_fetch_insn*/
+static nokprobe_inline int
+process_common_fetch_insn(struct fetch_insn *code, unsigned long *val)
+{
+       switch (code->op) {
+       case FETCH_OP_IMM:
+               *val = code->immediate;
+               break;
+       case FETCH_OP_COMM:
+               *val = (unsigned long)current->comm;
+               break;
+       case FETCH_OP_DATA:
+               *val = (unsigned long)code->data;
+               break;
+       default:
+               return -EILSEQ;
+       }
+       return 0;
+}
+
 /* From the 2nd stage, routine is same */
 static nokprobe_inline int
 process_fetch_insn_bottom(struct fetch_insn *code, unsigned long val,
index a39018a0660a886231c1e5afb7c6299d4f187645..8b92e34ff0c832888ef394ae91270f5cbec544c2 100644 (file)
@@ -220,6 +220,7 @@ process_fetch_insn(struct fetch_insn *code, void *rec, void *dest,
 {
        struct pt_regs *regs = rec;
        unsigned long val;
+       int ret;
 
        /* 1st stage: get value from context */
        switch (code->op) {
@@ -235,20 +236,16 @@ process_fetch_insn(struct fetch_insn *code, void *rec, void *dest,
        case FETCH_OP_RETVAL:
                val = regs_return_value(regs);
                break;
-       case FETCH_OP_IMM:
-               val = code->immediate;
-               break;
        case FETCH_OP_COMM:
                val = FETCH_TOKEN_COMM;
                break;
-       case FETCH_OP_DATA:
-               val = (unsigned long)code->data;
-               break;
        case FETCH_OP_FOFFS:
                val = translate_user_vaddr(code->immediate);
                break;
        default:
-               return -EILSEQ;
+               ret = process_common_fetch_insn(code, &val);
+               if (ret < 0)
+                       return ret;
        }
        code++;