perf/bpf: fix a clang compilation issue
authorYonghong Song <yhs@fb.com>
Fri, 8 Sep 2017 01:36:15 +0000 (18:36 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 11 Sep 2017 21:28:45 +0000 (14:28 -0700)
clang does not support variable length array for structure member.
It has the following error during compilation:

kernel/trace/trace_syscalls.c:568:17: error: fields must have a constant size:
'variable length array in structure' extension will never be supported
                unsigned long args[sys_data->nb_args];
                              ^

The fix is to use a fixed array length instead.

Reported-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/syscalls.h
kernel/trace/trace_syscalls.c

index 88951b795ee3d5df26745c0a16efe5635ee6f807..95606a2d556fd299f487240078922abf408e435d 100644 (file)
@@ -200,6 +200,8 @@ static inline int is_syscall_trace_event(struct trace_event_call *tp_event)
 #define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
 #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
 
+#define SYSCALL_DEFINE_MAXARGS 6
+
 #define SYSCALL_DEFINEx(x, sname, ...)                         \
        SYSCALL_METADATA(sname, x, __VA_ARGS__)                 \
        __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
index 9c4eef20301cf09df79a39764d11003126603b6b..696afe72d3b1445738feaa1031a4d7110363d6dd 100644 (file)
@@ -565,7 +565,7 @@ static int perf_call_bpf_enter(struct bpf_prog *prog, struct pt_regs *regs,
        struct syscall_tp_t {
                unsigned long long regs;
                unsigned long syscall_nr;
-               unsigned long args[sys_data->nb_args];
+               unsigned long args[SYSCALL_DEFINE_MAXARGS];
        } param;
        int i;