Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tracing/syscalls: Pass in hardcoded 6 into syscall_get_arguments()

The only users that calls syscall_get_arguments() with a variable and not a
hard coded '6' is ftrace_syscall_enter(). syscall_get_arguments() can be
optimized by removing a variable input, and always grabbing 6 arguments
regardless of what the system call actually uses.

Change ftrace_syscall_enter() to pass the 6 args into a local stack array
and copy the necessary arguments into the trace event as needed.

This is needed to remove two parameters from syscall_get_arguments().

Link: http://lkml.kernel.org/r/20161107213233.627583542@goodmis.org

Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>

+6 -3
+6 -3
kernel/trace/trace_syscalls.c
··· 314 314 struct ring_buffer_event *event; 315 315 struct ring_buffer *buffer; 316 316 unsigned long irq_flags; 317 + unsigned long args[6]; 317 318 int pc; 318 319 int syscall_nr; 319 320 int size; ··· 348 347 349 348 entry = ring_buffer_event_data(event); 350 349 entry->nr = syscall_nr; 351 - syscall_get_arguments(current, regs, 0, sys_data->nb_args, entry->args); 350 + syscall_get_arguments(current, regs, 0, 6, args); 351 + memcpy(entry->args, args, sizeof(unsigned long) * sys_data->nb_args); 352 352 353 353 event_trigger_unlock_commit(trace_file, buffer, event, entry, 354 354 irq_flags, pc); ··· 585 583 struct syscall_metadata *sys_data; 586 584 struct syscall_trace_enter *rec; 587 585 struct hlist_head *head; 586 + unsigned long args[6]; 588 587 bool valid_prog_array; 589 588 int syscall_nr; 590 589 int rctx; ··· 616 613 return; 617 614 618 615 rec->nr = syscall_nr; 619 - syscall_get_arguments(current, regs, 0, sys_data->nb_args, 620 - (unsigned long *)&rec->args); 616 + syscall_get_arguments(current, regs, 0, 6, args); 617 + memcpy(&rec->args, args, sizeof(unsigned long) * sys_data->nb_args); 621 618 622 619 if ((valid_prog_array && 623 620 !perf_call_bpf_enter(sys_data->enter_event, regs, sys_data, rec)) ||