Merge tag 'v5.5-rc1' into core/kprobes, to resolve conflicts
[platform/kernel/linux-starfive.git] / kernel / trace / trace_syscalls.c
index 5393525..73140d8 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/module.h>      /* for MODULE_NAME_LEN via KSYM_SYMBOL_LEN */
 #include <linux/ftrace.h>
 #include <linux/perf_event.h>
+#include <linux/xarray.h>
 #include <asm/syscall.h>
 
 #include "trace_output.h"
@@ -30,6 +31,7 @@ syscall_get_enter_fields(struct trace_event_call *call)
 extern struct syscall_metadata *__start_syscalls_metadata[];
 extern struct syscall_metadata *__stop_syscalls_metadata[];
 
+static DEFINE_XARRAY(syscalls_metadata_sparse);
 static struct syscall_metadata **syscalls_metadata;
 
 #ifndef ARCH_HAS_SYSCALL_MATCH_SYM_NAME
@@ -101,6 +103,9 @@ find_syscall_meta(unsigned long syscall)
 
 static struct syscall_metadata *syscall_nr_to_meta(int nr)
 {
+       if (IS_ENABLED(CONFIG_HAVE_SPARSE_SYSCALL_NR))
+               return xa_load(&syscalls_metadata_sparse, (unsigned long)nr);
+
        if (!syscalls_metadata || nr >= NR_syscalls || nr < 0)
                return NULL;
 
@@ -526,12 +531,16 @@ void __init init_ftrace_syscalls(void)
        struct syscall_metadata *meta;
        unsigned long addr;
        int i;
-
-       syscalls_metadata = kcalloc(NR_syscalls, sizeof(*syscalls_metadata),
-                                   GFP_KERNEL);
-       if (!syscalls_metadata) {
-               WARN_ON(1);
-               return;
+       void *ret;
+
+       if (!IS_ENABLED(CONFIG_HAVE_SPARSE_SYSCALL_NR)) {
+               syscalls_metadata = kcalloc(NR_syscalls,
+                                       sizeof(*syscalls_metadata),
+                                       GFP_KERNEL);
+               if (!syscalls_metadata) {
+                       WARN_ON(1);
+                       return;
+               }
        }
 
        for (i = 0; i < NR_syscalls; i++) {
@@ -541,7 +550,16 @@ void __init init_ftrace_syscalls(void)
                        continue;
 
                meta->syscall_nr = i;
-               syscalls_metadata[i] = meta;
+
+               if (!IS_ENABLED(CONFIG_HAVE_SPARSE_SYSCALL_NR)) {
+                       syscalls_metadata[i] = meta;
+               } else {
+                       ret = xa_store(&syscalls_metadata_sparse, i, meta,
+                                       GFP_KERNEL);
+                       WARN(xa_is_err(ret),
+                               "Syscall memory allocation failed\n");
+               }
+
        }
 }