|
@@ -6074,6 +6074,7 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,
|
|
|
{
|
|
|
struct trace_array *tr = filp->private_data;
|
|
|
struct ring_buffer_event *event;
|
|
|
+ enum event_trigger_type tt = ETT_NONE;
|
|
|
struct ring_buffer *buffer;
|
|
|
struct print_entry *entry;
|
|
|
unsigned long irq_flags;
|
|
@@ -6122,6 +6123,12 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,
|
|
|
written = cnt;
|
|
|
len = cnt;
|
|
|
|
|
|
+ if (tr->trace_marker_file && !list_empty(&tr->trace_marker_file->triggers)) {
|
|
|
+ /* do not add \n before testing triggers, but add \0 */
|
|
|
+ entry->buf[cnt] = '\0';
|
|
|
+ tt = event_triggers_call(tr->trace_marker_file, entry, event);
|
|
|
+ }
|
|
|
+
|
|
|
if (entry->buf[cnt - 1] != '\n') {
|
|
|
entry->buf[cnt] = '\n';
|
|
|
entry->buf[cnt + 1] = '\0';
|
|
@@ -6130,6 +6137,9 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,
|
|
|
|
|
|
__buffer_unlock_commit(buffer, event);
|
|
|
|
|
|
+ if (tt)
|
|
|
+ event_triggers_post_call(tr->trace_marker_file, tt);
|
|
|
+
|
|
|
if (written > 0)
|
|
|
*fpos += written;
|
|
|
|
|
@@ -7896,6 +7906,7 @@ static __init void create_trace_instances(struct dentry *d_tracer)
|
|
|
static void
|
|
|
init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer)
|
|
|
{
|
|
|
+ struct trace_event_file *file;
|
|
|
int cpu;
|
|
|
|
|
|
trace_create_file("available_tracers", 0444, d_tracer,
|
|
@@ -7928,6 +7939,12 @@ init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer)
|
|
|
trace_create_file("trace_marker", 0220, d_tracer,
|
|
|
tr, &tracing_mark_fops);
|
|
|
|
|
|
+ file = __find_event_file(tr, "ftrace", "print");
|
|
|
+ if (file && file->dir)
|
|
|
+ trace_create_file("trigger", 0644, file->dir, file,
|
|
|
+ &event_trigger_fops);
|
|
|
+ tr->trace_marker_file = file;
|
|
|
+
|
|
|
trace_create_file("trace_marker_raw", 0220, d_tracer,
|
|
|
tr, &tracing_mark_raw_fops);
|
|
|
|