]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - kernel/trace/trace_syscalls.c
tracing: Fix function graph trace_pipe to properly display failed entries
[mirror_ubuntu-bionic-kernel.git] / kernel / trace / trace_syscalls.c
index 144cc14d85519ed8de66d1968f3ee97ebbdbf893..57501d90096abbba5ee3a87de54476a794ba176e 100644 (file)
@@ -51,22 +51,6 @@ static struct syscall_metadata *syscall_nr_to_meta(int nr)
        return syscalls_metadata[nr];
 }
 
-static int syscall_name_to_nr(const char *name)
-{
-       int i;
-
-       if (!syscalls_metadata)
-               return -1;
-
-       for (i = 0; i < NR_syscalls; i++) {
-               if (syscalls_metadata[i]) {
-                       if (!strcmp(syscalls_metadata[i]->name, name))
-                               return i;
-               }
-       }
-       return -1;
-}
-
 enum print_line_t
 print_syscall_enter(struct trace_iterator *iter, int flags)
 {
@@ -412,6 +396,18 @@ void unreg_event_syscall_exit(struct ftrace_event_call *call)
        mutex_unlock(&syscall_trace_lock);
 }
 
+int init_syscall_trace(struct ftrace_event_call *call)
+{
+       int id;
+
+       id = register_ftrace_event(call->event);
+       if (!id)
+               return -ENODEV;
+       call->id = id;
+       INIT_LIST_HEAD(&call->fields);
+       return 0;
+}
+
 int __init init_ftrace_syscalls(void)
 {
        struct syscall_metadata *meta;
@@ -508,14 +504,12 @@ end_recursion:
        local_irq_restore(flags);
 }
 
-int reg_prof_syscall_enter(char *name)
+int prof_sysenter_enable(struct ftrace_event_call *call)
 {
        int ret = 0;
        int num;
 
-       num = syscall_name_to_nr(name);
-       if (num < 0 || num >= NR_syscalls)
-               return -ENOSYS;
+       num = ((struct syscall_metadata *)call->data)->syscall_nr;
 
        mutex_lock(&syscall_trace_lock);
        if (!sys_prof_refcount_enter)
@@ -531,13 +525,11 @@ int reg_prof_syscall_enter(char *name)
        return ret;
 }
 
-void unreg_prof_syscall_enter(char *name)
+void prof_sysenter_disable(struct ftrace_event_call *call)
 {
        int num;
 
-       num = syscall_name_to_nr(name);
-       if (num < 0 || num >= NR_syscalls)
-               return;
+       num = ((struct syscall_metadata *)call->data)->syscall_nr;
 
        mutex_lock(&syscall_trace_lock);
        sys_prof_refcount_enter--;
@@ -613,14 +605,12 @@ end_recursion:
        local_irq_restore(flags);
 }
 
-int reg_prof_syscall_exit(char *name)
+int prof_sysexit_enable(struct ftrace_event_call *call)
 {
        int ret = 0;
        int num;
 
-       num = syscall_name_to_nr(name);
-       if (num < 0 || num >= NR_syscalls)
-               return -ENOSYS;
+       num = ((struct syscall_metadata *)call->data)->syscall_nr;
 
        mutex_lock(&syscall_trace_lock);
        if (!sys_prof_refcount_exit)
@@ -636,13 +626,11 @@ int reg_prof_syscall_exit(char *name)
        return ret;
 }
 
-void unreg_prof_syscall_exit(char *name)
+void prof_sysexit_disable(struct ftrace_event_call *call)
 {
        int num;
 
-       num = syscall_name_to_nr(name);
-       if (num < 0 || num >= NR_syscalls)
-               return;
+       num = ((struct syscall_metadata *)call->data)->syscall_nr;
 
        mutex_lock(&syscall_trace_lock);
        sys_prof_refcount_exit--;