diff options
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r-- | kernel/trace/trace.c | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 48d5eb22ff33..d382fd1aa4a6 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -6948,7 +6948,7 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, | |||
6948 | if ((file->f_flags & O_NONBLOCK) || (flags & SPLICE_F_NONBLOCK)) | 6948 | if ((file->f_flags & O_NONBLOCK) || (flags & SPLICE_F_NONBLOCK)) |
6949 | goto out; | 6949 | goto out; |
6950 | 6950 | ||
6951 | ret = wait_on_pipe(iter, 1); | 6951 | ret = wait_on_pipe(iter, iter->tr->buffer_percent); |
6952 | if (ret) | 6952 | if (ret) |
6953 | goto out; | 6953 | goto out; |
6954 | 6954 | ||
@@ -7662,6 +7662,53 @@ static const struct file_operations rb_simple_fops = { | |||
7662 | .llseek = default_llseek, | 7662 | .llseek = default_llseek, |
7663 | }; | 7663 | }; |
7664 | 7664 | ||
7665 | static ssize_t | ||
7666 | buffer_percent_read(struct file *filp, char __user *ubuf, | ||
7667 | size_t cnt, loff_t *ppos) | ||
7668 | { | ||
7669 | struct trace_array *tr = filp->private_data; | ||
7670 | char buf[64]; | ||
7671 | int r; | ||
7672 | |||
7673 | r = tr->buffer_percent; | ||
7674 | r = sprintf(buf, "%d\n", r); | ||
7675 | |||
7676 | return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); | ||
7677 | } | ||
7678 | |||
7679 | static ssize_t | ||
7680 | buffer_percent_write(struct file *filp, const char __user *ubuf, | ||
7681 | size_t cnt, loff_t *ppos) | ||
7682 | { | ||
7683 | struct trace_array *tr = filp->private_data; | ||
7684 | unsigned long val; | ||
7685 | int ret; | ||
7686 | |||
7687 | ret = kstrtoul_from_user(ubuf, cnt, 10, &val); | ||
7688 | if (ret) | ||
7689 | return ret; | ||
7690 | |||
7691 | if (val > 100) | ||
7692 | return -EINVAL; | ||
7693 | |||
7694 | if (!val) | ||
7695 | val = 1; | ||
7696 | |||
7697 | tr->buffer_percent = val; | ||
7698 | |||
7699 | (*ppos)++; | ||
7700 | |||
7701 | return cnt; | ||
7702 | } | ||
7703 | |||
7704 | static const struct file_operations buffer_percent_fops = { | ||
7705 | .open = tracing_open_generic_tr, | ||
7706 | .read = buffer_percent_read, | ||
7707 | .write = buffer_percent_write, | ||
7708 | .release = tracing_release_generic_tr, | ||
7709 | .llseek = default_llseek, | ||
7710 | }; | ||
7711 | |||
7665 | struct dentry *trace_instance_dir; | 7712 | struct dentry *trace_instance_dir; |
7666 | 7713 | ||
7667 | static void | 7714 | static void |
@@ -7970,6 +8017,11 @@ init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer) | |||
7970 | trace_create_file("timestamp_mode", 0444, d_tracer, tr, | 8017 | trace_create_file("timestamp_mode", 0444, d_tracer, tr, |
7971 | &trace_time_stamp_mode_fops); | 8018 | &trace_time_stamp_mode_fops); |
7972 | 8019 | ||
8020 | tr->buffer_percent = 1; | ||
8021 | |||
8022 | trace_create_file("buffer_percent", 0444, d_tracer, | ||
8023 | tr, &buffer_percent_fops); | ||
8024 | |||
7973 | create_trace_options_dir(tr); | 8025 | create_trace_options_dir(tr); |
7974 | 8026 | ||
7975 | #if defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER) | 8027 | #if defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER) |