diff options
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r-- | kernel/trace/trace.c | 82 |
1 files changed, 74 insertions, 8 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 51612b4a603f..c521b7347482 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -1431,7 +1431,7 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu) | |||
1431 | } | 1431 | } |
1432 | #endif /* CONFIG_TRACER_MAX_TRACE */ | 1432 | #endif /* CONFIG_TRACER_MAX_TRACE */ |
1433 | 1433 | ||
1434 | static int wait_on_pipe(struct trace_iterator *iter, bool full) | 1434 | static int wait_on_pipe(struct trace_iterator *iter, int full) |
1435 | { | 1435 | { |
1436 | /* Iterators are static, they should be filled or empty */ | 1436 | /* Iterators are static, they should be filled or empty */ |
1437 | if (trace_buffer_iter(iter, iter->cpu_file)) | 1437 | if (trace_buffer_iter(iter, iter->cpu_file)) |
@@ -2452,7 +2452,7 @@ static inline void ftrace_exports_disable(void) | |||
2452 | static_branch_disable(&ftrace_exports_enabled); | 2452 | static_branch_disable(&ftrace_exports_enabled); |
2453 | } | 2453 | } |
2454 | 2454 | ||
2455 | void ftrace_exports(struct ring_buffer_event *event) | 2455 | static void ftrace_exports(struct ring_buffer_event *event) |
2456 | { | 2456 | { |
2457 | struct trace_export *export; | 2457 | struct trace_export *export; |
2458 | 2458 | ||
@@ -4408,13 +4408,15 @@ static int trace_set_options(struct trace_array *tr, char *option) | |||
4408 | int neg = 0; | 4408 | int neg = 0; |
4409 | int ret; | 4409 | int ret; |
4410 | size_t orig_len = strlen(option); | 4410 | size_t orig_len = strlen(option); |
4411 | int len; | ||
4411 | 4412 | ||
4412 | cmp = strstrip(option); | 4413 | cmp = strstrip(option); |
4413 | 4414 | ||
4414 | if (strncmp(cmp, "no", 2) == 0) { | 4415 | len = str_has_prefix(cmp, "no"); |
4416 | if (len) | ||
4415 | neg = 1; | 4417 | neg = 1; |
4416 | cmp += 2; | 4418 | |
4417 | } | 4419 | cmp += len; |
4418 | 4420 | ||
4419 | mutex_lock(&trace_types_lock); | 4421 | mutex_lock(&trace_types_lock); |
4420 | 4422 | ||
@@ -4604,6 +4606,10 @@ static const char readme_msg[] = | |||
4604 | "\t\t\t traces\n" | 4606 | "\t\t\t traces\n" |
4605 | #endif | 4607 | #endif |
4606 | #endif /* CONFIG_STACK_TRACER */ | 4608 | #endif /* CONFIG_STACK_TRACER */ |
4609 | #ifdef CONFIG_DYNAMIC_EVENTS | ||
4610 | " dynamic_events\t\t- Add/remove/show the generic dynamic events\n" | ||
4611 | "\t\t\t Write into this file to define/undefine new trace events.\n" | ||
4612 | #endif | ||
4607 | #ifdef CONFIG_KPROBE_EVENTS | 4613 | #ifdef CONFIG_KPROBE_EVENTS |
4608 | " kprobe_events\t\t- Add/remove/show the kernel dynamic events\n" | 4614 | " kprobe_events\t\t- Add/remove/show the kernel dynamic events\n" |
4609 | "\t\t\t Write into this file to define/undefine new trace events.\n" | 4615 | "\t\t\t Write into this file to define/undefine new trace events.\n" |
@@ -4616,6 +4622,9 @@ static const char readme_msg[] = | |||
4616 | "\t accepts: event-definitions (one definition per line)\n" | 4622 | "\t accepts: event-definitions (one definition per line)\n" |
4617 | "\t Format: p[:[<group>/]<event>] <place> [<args>]\n" | 4623 | "\t Format: p[:[<group>/]<event>] <place> [<args>]\n" |
4618 | "\t r[maxactive][:[<group>/]<event>] <place> [<args>]\n" | 4624 | "\t r[maxactive][:[<group>/]<event>] <place> [<args>]\n" |
4625 | #ifdef CONFIG_HIST_TRIGGERS | ||
4626 | "\t s:[synthetic/]<event> <field> [<field>]\n" | ||
4627 | #endif | ||
4619 | "\t -:[<group>/]<event>\n" | 4628 | "\t -:[<group>/]<event>\n" |
4620 | #ifdef CONFIG_KPROBE_EVENTS | 4629 | #ifdef CONFIG_KPROBE_EVENTS |
4621 | "\t place: [<module>:]<symbol>[+<offset>]|<memaddr>\n" | 4630 | "\t place: [<module>:]<symbol>[+<offset>]|<memaddr>\n" |
@@ -4634,6 +4643,11 @@ static const char readme_msg[] = | |||
4634 | "\t type: s8/16/32/64, u8/16/32/64, x8/16/32/64, string, symbol,\n" | 4643 | "\t type: s8/16/32/64, u8/16/32/64, x8/16/32/64, string, symbol,\n" |
4635 | "\t b<bit-width>@<bit-offset>/<container-size>,\n" | 4644 | "\t b<bit-width>@<bit-offset>/<container-size>,\n" |
4636 | "\t <type>\\[<array-size>\\]\n" | 4645 | "\t <type>\\[<array-size>\\]\n" |
4646 | #ifdef CONFIG_HIST_TRIGGERS | ||
4647 | "\t field: <stype> <name>;\n" | ||
4648 | "\t stype: u8/u16/u32/u64, s8/s16/s32/s64, pid_t,\n" | ||
4649 | "\t [unsigned] char/int/long\n" | ||
4650 | #endif | ||
4637 | #endif | 4651 | #endif |
4638 | " events/\t\t- Directory containing all trace event subsystems:\n" | 4652 | " events/\t\t- Directory containing all trace event subsystems:\n" |
4639 | " enable\t\t- Write 0/1 to enable/disable tracing of all events\n" | 4653 | " enable\t\t- Write 0/1 to enable/disable tracing of all events\n" |
@@ -5693,7 +5707,7 @@ static int tracing_wait_pipe(struct file *filp) | |||
5693 | 5707 | ||
5694 | mutex_unlock(&iter->mutex); | 5708 | mutex_unlock(&iter->mutex); |
5695 | 5709 | ||
5696 | ret = wait_on_pipe(iter, false); | 5710 | ret = wait_on_pipe(iter, 0); |
5697 | 5711 | ||
5698 | mutex_lock(&iter->mutex); | 5712 | mutex_lock(&iter->mutex); |
5699 | 5713 | ||
@@ -6751,7 +6765,7 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, | |||
6751 | if ((filp->f_flags & O_NONBLOCK)) | 6765 | if ((filp->f_flags & O_NONBLOCK)) |
6752 | return -EAGAIN; | 6766 | return -EAGAIN; |
6753 | 6767 | ||
6754 | ret = wait_on_pipe(iter, false); | 6768 | ret = wait_on_pipe(iter, 0); |
6755 | if (ret) | 6769 | if (ret) |
6756 | return ret; | 6770 | return ret; |
6757 | 6771 | ||
@@ -6948,7 +6962,7 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, | |||
6948 | if ((file->f_flags & O_NONBLOCK) || (flags & SPLICE_F_NONBLOCK)) | 6962 | if ((file->f_flags & O_NONBLOCK) || (flags & SPLICE_F_NONBLOCK)) |
6949 | goto out; | 6963 | goto out; |
6950 | 6964 | ||
6951 | ret = wait_on_pipe(iter, true); | 6965 | ret = wait_on_pipe(iter, iter->tr->buffer_percent); |
6952 | if (ret) | 6966 | if (ret) |
6953 | goto out; | 6967 | goto out; |
6954 | 6968 | ||
@@ -7662,6 +7676,53 @@ static const struct file_operations rb_simple_fops = { | |||
7662 | .llseek = default_llseek, | 7676 | .llseek = default_llseek, |
7663 | }; | 7677 | }; |
7664 | 7678 | ||
7679 | static ssize_t | ||
7680 | buffer_percent_read(struct file *filp, char __user *ubuf, | ||
7681 | size_t cnt, loff_t *ppos) | ||
7682 | { | ||
7683 | struct trace_array *tr = filp->private_data; | ||
7684 | char buf[64]; | ||
7685 | int r; | ||
7686 | |||
7687 | r = tr->buffer_percent; | ||
7688 | r = sprintf(buf, "%d\n", r); | ||
7689 | |||
7690 | return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); | ||
7691 | } | ||
7692 | |||
7693 | static ssize_t | ||
7694 | buffer_percent_write(struct file *filp, const char __user *ubuf, | ||
7695 | size_t cnt, loff_t *ppos) | ||
7696 | { | ||
7697 | struct trace_array *tr = filp->private_data; | ||
7698 | unsigned long val; | ||
7699 | int ret; | ||
7700 | |||
7701 | ret = kstrtoul_from_user(ubuf, cnt, 10, &val); | ||
7702 | if (ret) | ||
7703 | return ret; | ||
7704 | |||
7705 | if (val > 100) | ||
7706 | return -EINVAL; | ||
7707 | |||
7708 | if (!val) | ||
7709 | val = 1; | ||
7710 | |||
7711 | tr->buffer_percent = val; | ||
7712 | |||
7713 | (*ppos)++; | ||
7714 | |||
7715 | return cnt; | ||
7716 | } | ||
7717 | |||
7718 | static const struct file_operations buffer_percent_fops = { | ||
7719 | .open = tracing_open_generic_tr, | ||
7720 | .read = buffer_percent_read, | ||
7721 | .write = buffer_percent_write, | ||
7722 | .release = tracing_release_generic_tr, | ||
7723 | .llseek = default_llseek, | ||
7724 | }; | ||
7725 | |||
7665 | struct dentry *trace_instance_dir; | 7726 | struct dentry *trace_instance_dir; |
7666 | 7727 | ||
7667 | static void | 7728 | static void |
@@ -7970,6 +8031,11 @@ init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer) | |||
7970 | trace_create_file("timestamp_mode", 0444, d_tracer, tr, | 8031 | trace_create_file("timestamp_mode", 0444, d_tracer, tr, |
7971 | &trace_time_stamp_mode_fops); | 8032 | &trace_time_stamp_mode_fops); |
7972 | 8033 | ||
8034 | tr->buffer_percent = 50; | ||
8035 | |||
8036 | trace_create_file("buffer_percent", 0444, d_tracer, | ||
8037 | tr, &buffer_percent_fops); | ||
8038 | |||
7973 | create_trace_options_dir(tr); | 8039 | create_trace_options_dir(tr); |
7974 | 8040 | ||
7975 | #if defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER) | 8041 | #if defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER) |