diff options
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/bpf_trace.c | 14 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 2 | ||||
| -rw-r--r-- | kernel/trace/trace_kprobe.c | 22 | ||||
| -rw-r--r-- | kernel/trace/trace_probe_tmpl.h | 6 | ||||
| -rw-r--r-- | kernel/trace/trace_uprobe.c | 9 |
5 files changed, 26 insertions, 27 deletions
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 8b068adb9da1..f1a86a0d881d 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c | |||
| @@ -1204,22 +1204,12 @@ static int __bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog * | |||
| 1204 | 1204 | ||
| 1205 | int bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *prog) | 1205 | int bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *prog) |
| 1206 | { | 1206 | { |
| 1207 | int err; | 1207 | return __bpf_probe_register(btp, prog); |
| 1208 | |||
| 1209 | mutex_lock(&bpf_event_mutex); | ||
| 1210 | err = __bpf_probe_register(btp, prog); | ||
| 1211 | mutex_unlock(&bpf_event_mutex); | ||
| 1212 | return err; | ||
| 1213 | } | 1208 | } |
| 1214 | 1209 | ||
| 1215 | int bpf_probe_unregister(struct bpf_raw_event_map *btp, struct bpf_prog *prog) | 1210 | int bpf_probe_unregister(struct bpf_raw_event_map *btp, struct bpf_prog *prog) |
| 1216 | { | 1211 | { |
| 1217 | int err; | 1212 | return tracepoint_probe_unregister(btp->tp, (void *)btp->bpf_func, prog); |
| 1218 | |||
| 1219 | mutex_lock(&bpf_event_mutex); | ||
| 1220 | err = tracepoint_probe_unregister(btp->tp, (void *)btp->bpf_func, prog); | ||
| 1221 | mutex_unlock(&bpf_event_mutex); | ||
| 1222 | return err; | ||
| 1223 | } | 1213 | } |
| 1224 | 1214 | ||
| 1225 | int bpf_get_perf_event_info(const struct perf_event *event, u32 *prog_id, | 1215 | int bpf_get_perf_event_info(const struct perf_event *event, u32 *prog_id, |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index c521b7347482..c4238b441624 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -3384,6 +3384,8 @@ static void print_func_help_header_irq(struct trace_buffer *buf, struct seq_file | |||
| 3384 | const char tgid_space[] = " "; | 3384 | const char tgid_space[] = " "; |
| 3385 | const char space[] = " "; | 3385 | const char space[] = " "; |
| 3386 | 3386 | ||
| 3387 | print_event_info(buf, m); | ||
| 3388 | |||
| 3387 | seq_printf(m, "# %s _-----=> irqs-off\n", | 3389 | seq_printf(m, "# %s _-----=> irqs-off\n", |
| 3388 | tgid ? tgid_space : space); | 3390 | tgid ? tgid_space : space); |
| 3389 | seq_printf(m, "# %s / _----=> need-resched\n", | 3391 | seq_printf(m, "# %s / _----=> need-resched\n", |
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 5c19b8c41c7e..9eaf07f99212 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c | |||
| @@ -607,11 +607,17 @@ static int trace_kprobe_create(int argc, const char *argv[]) | |||
| 607 | char buf[MAX_EVENT_NAME_LEN]; | 607 | char buf[MAX_EVENT_NAME_LEN]; |
| 608 | unsigned int flags = TPARG_FL_KERNEL; | 608 | unsigned int flags = TPARG_FL_KERNEL; |
| 609 | 609 | ||
| 610 | /* argc must be >= 1 */ | 610 | switch (argv[0][0]) { |
| 611 | if (argv[0][0] == 'r') { | 611 | case 'r': |
| 612 | is_return = true; | 612 | is_return = true; |
| 613 | flags |= TPARG_FL_RETURN; | 613 | flags |= TPARG_FL_RETURN; |
| 614 | } else if (argv[0][0] != 'p' || argc < 2) | 614 | break; |
| 615 | case 'p': | ||
| 616 | break; | ||
| 617 | default: | ||
| 618 | return -ECANCELED; | ||
| 619 | } | ||
| 620 | if (argc < 2) | ||
| 615 | return -ECANCELED; | 621 | return -ECANCELED; |
| 616 | 622 | ||
| 617 | event = strchr(&argv[0][1], ':'); | 623 | event = strchr(&argv[0][1], ':'); |
| @@ -855,22 +861,14 @@ static const struct file_operations kprobe_profile_ops = { | |||
| 855 | static nokprobe_inline int | 861 | static nokprobe_inline int |
| 856 | fetch_store_strlen(unsigned long addr) | 862 | fetch_store_strlen(unsigned long addr) |
| 857 | { | 863 | { |
| 858 | mm_segment_t old_fs; | ||
| 859 | int ret, len = 0; | 864 | int ret, len = 0; |
| 860 | u8 c; | 865 | u8 c; |
| 861 | 866 | ||
| 862 | old_fs = get_fs(); | ||
| 863 | set_fs(KERNEL_DS); | ||
| 864 | pagefault_disable(); | ||
| 865 | |||
| 866 | do { | 867 | do { |
| 867 | ret = __copy_from_user_inatomic(&c, (u8 *)addr + len, 1); | 868 | ret = probe_mem_read(&c, (u8 *)addr + len, 1); |
| 868 | len++; | 869 | len++; |
| 869 | } while (c && ret == 0 && len < MAX_STRING_SIZE); | 870 | } while (c && ret == 0 && len < MAX_STRING_SIZE); |
| 870 | 871 | ||
| 871 | pagefault_enable(); | ||
| 872 | set_fs(old_fs); | ||
| 873 | |||
| 874 | return (ret < 0) ? ret : len; | 872 | return (ret < 0) ? ret : len; |
| 875 | } | 873 | } |
| 876 | 874 | ||
diff --git a/kernel/trace/trace_probe_tmpl.h b/kernel/trace/trace_probe_tmpl.h index 5c56afc17cf8..4737bb8c07a3 100644 --- a/kernel/trace/trace_probe_tmpl.h +++ b/kernel/trace/trace_probe_tmpl.h | |||
| @@ -180,10 +180,12 @@ store_trace_args(void *data, struct trace_probe *tp, struct pt_regs *regs, | |||
| 180 | if (unlikely(arg->dynamic)) | 180 | if (unlikely(arg->dynamic)) |
| 181 | *dl = make_data_loc(maxlen, dyndata - base); | 181 | *dl = make_data_loc(maxlen, dyndata - base); |
| 182 | ret = process_fetch_insn(arg->code, regs, dl, base); | 182 | ret = process_fetch_insn(arg->code, regs, dl, base); |
| 183 | if (unlikely(ret < 0 && arg->dynamic)) | 183 | if (unlikely(ret < 0 && arg->dynamic)) { |
| 184 | *dl = make_data_loc(0, dyndata - base); | 184 | *dl = make_data_loc(0, dyndata - base); |
| 185 | else | 185 | } else { |
| 186 | dyndata += ret; | 186 | dyndata += ret; |
| 187 | maxlen -= ret; | ||
| 188 | } | ||
| 187 | } | 189 | } |
| 188 | } | 190 | } |
| 189 | 191 | ||
diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c index e335576b9411..9bde07c06362 100644 --- a/kernel/trace/trace_uprobe.c +++ b/kernel/trace/trace_uprobe.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * Copyright (C) IBM Corporation, 2010-2012 | 5 | * Copyright (C) IBM Corporation, 2010-2012 |
| 6 | * Author: Srikar Dronamraju <srikar@linux.vnet.ibm.com> | 6 | * Author: Srikar Dronamraju <srikar@linux.vnet.ibm.com> |
| 7 | */ | 7 | */ |
| 8 | #define pr_fmt(fmt) "trace_kprobe: " fmt | 8 | #define pr_fmt(fmt) "trace_uprobe: " fmt |
| 9 | 9 | ||
| 10 | #include <linux/ctype.h> | 10 | #include <linux/ctype.h> |
| 11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| @@ -160,6 +160,13 @@ fetch_store_string(unsigned long addr, void *dest, void *base) | |||
| 160 | if (ret >= 0) { | 160 | if (ret >= 0) { |
| 161 | if (ret == maxlen) | 161 | if (ret == maxlen) |
| 162 | dst[ret - 1] = '\0'; | 162 | dst[ret - 1] = '\0'; |
| 163 | else | ||
| 164 | /* | ||
| 165 | * Include the terminating null byte. In this case it | ||
| 166 | * was copied by strncpy_from_user but not accounted | ||
| 167 | * for in ret. | ||
| 168 | */ | ||
| 169 | ret++; | ||
| 163 | *(u32 *)dest = make_data_loc(ret, (void *)dst - base); | 170 | *(u32 *)dest = make_data_loc(ret, (void *)dst - base); |
| 164 | } | 171 | } |
| 165 | 172 | ||
