diff options
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r-- | kernel/trace/trace.c | 61 |
1 files changed, 44 insertions, 17 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index dade4c9559cc..8696ce6bf2f6 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -1047,7 +1047,7 @@ void disable_trace_on_warning(void) | |||
1047 | * | 1047 | * |
1048 | * Shows real state of the ring buffer if it is enabled or not. | 1048 | * Shows real state of the ring buffer if it is enabled or not. |
1049 | */ | 1049 | */ |
1050 | static int tracer_tracing_is_on(struct trace_array *tr) | 1050 | int tracer_tracing_is_on(struct trace_array *tr) |
1051 | { | 1051 | { |
1052 | if (tr->trace_buffer.buffer) | 1052 | if (tr->trace_buffer.buffer) |
1053 | return ring_buffer_record_is_on(tr->trace_buffer.buffer); | 1053 | return ring_buffer_record_is_on(tr->trace_buffer.buffer); |
@@ -4123,6 +4123,30 @@ static const char readme_msg[] = | |||
4123 | "\t\t\t traces\n" | 4123 | "\t\t\t traces\n" |
4124 | #endif | 4124 | #endif |
4125 | #endif /* CONFIG_STACK_TRACER */ | 4125 | #endif /* CONFIG_STACK_TRACER */ |
4126 | #ifdef CONFIG_KPROBE_EVENT | ||
4127 | " kprobe_events\t\t- Add/remove/show the kernel dynamic events\n" | ||
4128 | "\t\t\t Write into this file to define/undefine new trace events.\n" | ||
4129 | #endif | ||
4130 | #ifdef CONFIG_UPROBE_EVENT | ||
4131 | " uprobe_events\t\t- Add/remove/show the userspace dynamic events\n" | ||
4132 | "\t\t\t Write into this file to define/undefine new trace events.\n" | ||
4133 | #endif | ||
4134 | #if defined(CONFIG_KPROBE_EVENT) || defined(CONFIG_UPROBE_EVENT) | ||
4135 | "\t accepts: event-definitions (one definition per line)\n" | ||
4136 | "\t Format: p|r[:[<group>/]<event>] <place> [<args>]\n" | ||
4137 | "\t -:[<group>/]<event>\n" | ||
4138 | #ifdef CONFIG_KPROBE_EVENT | ||
4139 | "\t place: [<module>:]<symbol>[+<offset>]|<memaddr>\n" | ||
4140 | #endif | ||
4141 | #ifdef CONFIG_UPROBE_EVENT | ||
4142 | "\t place: <path>:<offset>\n" | ||
4143 | #endif | ||
4144 | "\t args: <name>=fetcharg[:type]\n" | ||
4145 | "\t fetcharg: %<register>, @<address>, @<symbol>[+|-<offset>],\n" | ||
4146 | "\t $stack<index>, $stack, $retval, $comm\n" | ||
4147 | "\t type: s8/16/32/64, u8/16/32/64, x8/16/32/64, string,\n" | ||
4148 | "\t b<bit-width>@<bit-offset>/<container-size>\n" | ||
4149 | #endif | ||
4126 | " events/\t\t- Directory containing all trace event subsystems:\n" | 4150 | " events/\t\t- Directory containing all trace event subsystems:\n" |
4127 | " enable\t\t- Write 0/1 to enable/disable tracing of all events\n" | 4151 | " enable\t\t- Write 0/1 to enable/disable tracing of all events\n" |
4128 | " events/<system>/\t- Directory containing all trace events for <system>:\n" | 4152 | " events/<system>/\t- Directory containing all trace events for <system>:\n" |
@@ -4945,7 +4969,7 @@ out: | |||
4945 | return ret; | 4969 | return ret; |
4946 | } | 4970 | } |
4947 | 4971 | ||
4948 | #ifdef CONFIG_TRACER_MAX_TRACE | 4972 | #if defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER) |
4949 | 4973 | ||
4950 | static ssize_t | 4974 | static ssize_t |
4951 | tracing_max_lat_read(struct file *filp, char __user *ubuf, | 4975 | tracing_max_lat_read(struct file *filp, char __user *ubuf, |
@@ -5124,19 +5148,20 @@ tracing_read_pipe(struct file *filp, char __user *ubuf, | |||
5124 | struct trace_iterator *iter = filp->private_data; | 5148 | struct trace_iterator *iter = filp->private_data; |
5125 | ssize_t sret; | 5149 | ssize_t sret; |
5126 | 5150 | ||
5127 | /* return any leftover data */ | ||
5128 | sret = trace_seq_to_user(&iter->seq, ubuf, cnt); | ||
5129 | if (sret != -EBUSY) | ||
5130 | return sret; | ||
5131 | |||
5132 | trace_seq_init(&iter->seq); | ||
5133 | |||
5134 | /* | 5151 | /* |
5135 | * Avoid more than one consumer on a single file descriptor | 5152 | * Avoid more than one consumer on a single file descriptor |
5136 | * This is just a matter of traces coherency, the ring buffer itself | 5153 | * This is just a matter of traces coherency, the ring buffer itself |
5137 | * is protected. | 5154 | * is protected. |
5138 | */ | 5155 | */ |
5139 | mutex_lock(&iter->mutex); | 5156 | mutex_lock(&iter->mutex); |
5157 | |||
5158 | /* return any leftover data */ | ||
5159 | sret = trace_seq_to_user(&iter->seq, ubuf, cnt); | ||
5160 | if (sret != -EBUSY) | ||
5161 | goto out; | ||
5162 | |||
5163 | trace_seq_init(&iter->seq); | ||
5164 | |||
5140 | if (iter->trace->read) { | 5165 | if (iter->trace->read) { |
5141 | sret = iter->trace->read(iter, filp, ubuf, cnt, ppos); | 5166 | sret = iter->trace->read(iter, filp, ubuf, cnt, ppos); |
5142 | if (sret) | 5167 | if (sret) |
@@ -5867,7 +5892,7 @@ static const struct file_operations tracing_thresh_fops = { | |||
5867 | .llseek = generic_file_llseek, | 5892 | .llseek = generic_file_llseek, |
5868 | }; | 5893 | }; |
5869 | 5894 | ||
5870 | #ifdef CONFIG_TRACER_MAX_TRACE | 5895 | #if defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER) |
5871 | static const struct file_operations tracing_max_lat_fops = { | 5896 | static const struct file_operations tracing_max_lat_fops = { |
5872 | .open = tracing_open_generic, | 5897 | .open = tracing_open_generic, |
5873 | .read = tracing_max_lat_read, | 5898 | .read = tracing_max_lat_read, |
@@ -6163,9 +6188,6 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, | |||
6163 | return -EBUSY; | 6188 | return -EBUSY; |
6164 | #endif | 6189 | #endif |
6165 | 6190 | ||
6166 | if (splice_grow_spd(pipe, &spd)) | ||
6167 | return -ENOMEM; | ||
6168 | |||
6169 | if (*ppos & (PAGE_SIZE - 1)) | 6191 | if (*ppos & (PAGE_SIZE - 1)) |
6170 | return -EINVAL; | 6192 | return -EINVAL; |
6171 | 6193 | ||
@@ -6175,6 +6197,9 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, | |||
6175 | len &= PAGE_MASK; | 6197 | len &= PAGE_MASK; |
6176 | } | 6198 | } |
6177 | 6199 | ||
6200 | if (splice_grow_spd(pipe, &spd)) | ||
6201 | return -ENOMEM; | ||
6202 | |||
6178 | again: | 6203 | again: |
6179 | trace_access_lock(iter->cpu_file); | 6204 | trace_access_lock(iter->cpu_file); |
6180 | entries = ring_buffer_entries_cpu(iter->trace_buffer->buffer, iter->cpu_file); | 6205 | entries = ring_buffer_entries_cpu(iter->trace_buffer->buffer, iter->cpu_file); |
@@ -6232,19 +6257,21 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, | |||
6232 | /* did we read anything? */ | 6257 | /* did we read anything? */ |
6233 | if (!spd.nr_pages) { | 6258 | if (!spd.nr_pages) { |
6234 | if (ret) | 6259 | if (ret) |
6235 | return ret; | 6260 | goto out; |
6236 | 6261 | ||
6262 | ret = -EAGAIN; | ||
6237 | if ((file->f_flags & O_NONBLOCK) || (flags & SPLICE_F_NONBLOCK)) | 6263 | if ((file->f_flags & O_NONBLOCK) || (flags & SPLICE_F_NONBLOCK)) |
6238 | return -EAGAIN; | 6264 | goto out; |
6239 | 6265 | ||
6240 | ret = wait_on_pipe(iter, true); | 6266 | ret = wait_on_pipe(iter, true); |
6241 | if (ret) | 6267 | if (ret) |
6242 | return ret; | 6268 | goto out; |
6243 | 6269 | ||
6244 | goto again; | 6270 | goto again; |
6245 | } | 6271 | } |
6246 | 6272 | ||
6247 | ret = splice_to_pipe(pipe, &spd); | 6273 | ret = splice_to_pipe(pipe, &spd); |
6274 | out: | ||
6248 | splice_shrink_spd(&spd); | 6275 | splice_shrink_spd(&spd); |
6249 | 6276 | ||
6250 | return ret; | 6277 | return ret; |
@@ -7195,7 +7222,7 @@ init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer) | |||
7195 | 7222 | ||
7196 | create_trace_options_dir(tr); | 7223 | create_trace_options_dir(tr); |
7197 | 7224 | ||
7198 | #ifdef CONFIG_TRACER_MAX_TRACE | 7225 | #if defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER) |
7199 | trace_create_file("tracing_max_latency", 0644, d_tracer, | 7226 | trace_create_file("tracing_max_latency", 0644, d_tracer, |
7200 | &tr->max_latency, &tracing_max_lat_fops); | 7227 | &tr->max_latency, &tracing_max_lat_fops); |
7201 | #endif | 7228 | #endif |