aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r--kernel/trace/trace.c61
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 */
1050static int tracer_tracing_is_on(struct trace_array *tr) 1050int 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
4950static ssize_t 4974static ssize_t
4951tracing_max_lat_read(struct file *filp, char __user *ubuf, 4975tracing_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)
5871static const struct file_operations tracing_max_lat_fops = { 5896static 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);
6274out:
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