tracing: cleanups, updates, and fixes
Subsystems (6)
Steven Rostedt
maintainerIngo,
Please pull the latest tip/perf/core tree, which can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
tip/perf/core
Head SHA1: 47b0edcb599ea6eb9ef16d3a08932a0e01485293
Geunsik Lim (2):
ftrace: sched_switch plugin is deprecated
ftrace: Append wakeup_rt description of ftrace doc
Jiri Olsa (1):
ftrace: Change filter/notrace set functions to return exit code
Johannes Berg (1):
printk/tracing: Add console output tracing
Steven Rostedt (4):
tracing/softirq: Move __raise_softirq_irqoff() out of header
tracing/rcu: Add trace_##name##__rcuidle() static tracepoint for inside rcu_idle_exit() sections x86/tracing: Denote the power and cpuidle tracepoints as _rcuidle() cpuidle/tracing: Denote the tracepoints as being in rcu_idle_exit() section
Thomas Meyer (1):
tracing/trivial: Use kcalloc instead of kzalloc to allocate array
----
Documentation/trace/ftrace.txt | 7 ++++++ arch/x86/kernel/process.c | 24 ++++++++++---------- drivers/cpuidle/cpuidle.c | 8 +++--- include/linux/ftrace.h | 4 +- include/linux/interrupt.h | 7 +----- include/linux/tracepoint.h | 22 +++++++++++++++--- include/trace/events/power.h | 2 + include/trace/events/printk.h | 41 ++++++++++++++++++++++++++++++++++++ kernel/irq/chip.c | 2 + kernel/printk.c | 5 ++++ kernel/softirq.c | 6 +++++ kernel/trace/ftrace.c | 17 ++++++++------ kernel/trace/trace.c | 6 ++-- kernel/trace/trace_events_filter.c | 7 ++--- kernel/trace/trace_syscalls.c | 4 +- 15 files changed, 118 insertions(+), 44 deletions(-)
Steven Rostedt
maintainerPATCH 1/9 ftrace: Change filter/notrace set functions to return exit code
From: Jiri Olsa <[email protected]>
Currently the ftrace_set_filter and ftrace_set_notrace functions do not return any return code. So there's no way for ftrace_ops user to tell wether the filter was correctly applied.
The set_ftrace_filter interface returns error in case the filter did not match:
# echo krava > set_ftrace_filter bash: echo: write error: Invalid argument
Changing both ftrace_set_filter and ftrace_set_notrace functions to return zero if the filter was applied correctly or -E* values in case of error.
--- include/linux/ftrace.h | 4 ++-- kernel/trace/ftrace.c | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-)
include/linux/ftrace.h +2 -2
@@ -178,9 +178,9 @@ struct dyn_ftrace { };int ftrace_force_update (void ); -void ftrace_set_filter (struct ftrace_ops *ops,unsigned char *buf, +int ftrace_set_filter (struct ftrace_ops *ops,unsigned char *buf,int len,int reset); -void ftrace_set_notrace (struct ftrace_ops *ops,unsigned char *buf, +int ftrace_set_notrace (struct ftrace_ops *ops,unsigned char *buf,int len,int reset);void ftrace_set_global_filter (unsigned char *buf,int len,int reset);void ftrace_set_global_notrace (unsigned char *buf,int len,int reset);
kernel/trace/ftrace.c +9 -6
@@ -3146,8 +3146,10 @@ ftrace_set_regex(struct ftrace_ops *ops, unsigned char *buf, int len,mutex_lock (&ftrace_regex_lock);if (reset)ftrace_filter_reset (hash); -if (buf) -ftrace_match_records (hash, buf, len); +if (buf && !ftrace_match_records (hash, buf, len)) { + ret = -EINVAL ; + goto out_regex_unlock; + }mutex_lock (&ftrace_lock); ret =ftrace_hash_move (ops, enable, orig_hash, hash);
@@ -3157,6 +3159,7 @@ ftrace_set_regex(struct ftrace_ops *ops, unsigned char *buf, int len,mutex_unlock (&ftrace_lock); + out_regex_unlock:mutex_unlock (&ftrace_regex_lock);free_ftrace_hash (hash);
@@ -3173,10 +3176,10 @@ ftrace_set_regex(struct ftrace_ops *ops, unsigned char *buf, int len,* Filters denote which functions should be enabled when tracing is enabled. * If @buf is NULL and reset is set, all functions will be enabled for tracing. */ -void ftrace_set_filter (struct ftrace_ops *ops,unsigned char *buf, +int ftrace_set_filter (struct ftrace_ops *ops,unsigned char *buf,int len,int reset) { -ftrace_set_regex (ops, buf, len, reset,1 ); +return ftrace_set_regex (ops, buf, len, reset,1 ); }EXPORT_SYMBOL_GPL (ftrace_set_filter);
@@ -3191,10 +3194,10 @@ EXPORT_SYMBOL_GPL(ftrace_set_filter);* is enabled. If @buf is NULL and reset is set, all functions will be enabled * for tracing. */ -void ftrace_set_notrace (struct ftrace_ops *ops,unsigned char *buf, +int ftrace_set_notrace (struct ftrace_ops *ops,unsigned char *buf,int len,int reset) { -ftrace_set_regex (ops, buf, len, reset,0 ); +return ftrace_set_regex (ops, buf, len, reset,0 ); }EXPORT_SYMBOL_GPL (ftrace_set_notrace);/**
Signature · 1 line
1.7.8.3
Steven Rostedt
maintainerPATCH 2/9 tracing/softirq: Move __raise_softirq_irqoff() out of header
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
The __raise_softirq_irqoff() contains a tracepoint. As tracepoints in headers can cause issues, and not to mention, bloats the kernel when they are in a static inline, it is best to move the function that contains the tracepoint out of the header and into softirq.c.
--- include/linux/interrupt.h | 7 +------ kernel/irq/chip.c | 2 ++ kernel/softirq.c | 6 ++++++ 3 files changed, 9 insertions(+), 6 deletions(-)
include/linux/interrupt.h +1 -6
@@ -20,7 +20,6 @@#include <linux/atomic.h> #include <asm/ptrace.h> #include <asm/system.h> -#include <trace/events/irq.h> /* * These correspond to the IORESOURCE_IRQ_* defines in
@@ -456,11 +455,7 @@ asmlinkage void do_softirq(void); asmlinkage void __do_softirq(void);extern void open_softirq (int nr,void (*action)(struct softirq_action *));extern void softirq_init (void ); -static inline void __raise_softirq_irqoff (unsigned int nr) -{ -trace_softirq_raise (nr); -or_softirq_pending (1UL << nr); -} +extern void __raise_softirq_irqoff (unsigned int nr);extern void raise_softirq_irqoff (unsigned int nr);extern void raise_softirq (unsigned int nr);
kernel/irq/chip.c +2 -0
@@ -16,6 +16,8 @@#include <linux/interrupt.h> #include <linux/kernel_stat.h> +#include <trace/events/irq.h> +#include "internals.h" /**
kernel/softirq.c +6 -0
@@ -385,6 +385,12 @@ void raise_softirq(unsigned int nr)local_irq_restore (flags); } +void __raise_softirq_irqoff (unsigned int nr) +{ +trace_softirq_raise (nr); +or_softirq_pending (1UL << nr); +} +void open_softirq (int nr,void (*action)(struct softirq_action *)) { softirq_vec[nr].action = action;
Signature · 1 line
1.7.8.3
Steven Rostedt
maintainerPATCH 3/9 tracing/rcu: Add trace_##name##__rcuidle() static tracepoint for inside rcu_idle_exit() sections
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
Added is a new static inline function that lets *any* tracepoint be used inside a rcu_idle_exit() section. And this also solves the problem where the same tracepoint may be used inside a rcu_idle_exit() section as well as outside of one.
I added a new tracepoint function with a "_rcuidle" extension. All tracepoints can be used with either the normal "trace_foobar()" function, or the "trace_foobar_rcuidle()" function when inside a rcu_idle_exit() section.
All tracepoints defined by TRACE_EVENT() or any of the derivatives will have a "_rcuidle()" function also defined. When a tracepoint is used within an rcu_idle_exit() section, the "_rcuidle()" version must be used. This denotes that the tracepoint is within rcu_idle_exit() and it allows the rcu read locks within the tracepoint to still be valid, as this version takes us out of rcu_idle_exit().
Another nice aspect about this patch is that "static inline"s are not compiled into text when not used. So only the tracepoints that actually use the _rcuidle() version will have them defined in the actual text that is booted.
--- include/linux/tracepoint.h | 22 ++++++++++++++++++---- 1 files changed, 18 insertions(+), 4 deletions(-)
include/linux/tracepoint.h +18 -4
@@ -114,7 +114,7 @@ static inline void tracepoint_synchronize_unregister(void)* as "(void *, void)". The DECLARE_TRACE_NOARGS() will pass in just * "void *data", where as the DECLARE_TRACE() will pass in "void *data, proto". */ -#define __DO_TRACE (tp, proto, args, cond) \ +#define __DO_TRACE (tp, proto, args, cond, prercu, postrcu) \ do { \ struct tracepoint_func *it_func_ptr; \ void *it_func; \
@@ -122,6 +122,7 @@ static inline void tracepoint_synchronize_unregister(void) \if (!(cond)) \return ; \ + prercu; \rcu_read_lock_sched_notrace (); \ it_func_ptr =rcu_dereference_sched ((tp)->funcs); \if (it_func_ptr) { \
@@ -132,6 +133,7 @@ static inline void tracepoint_synchronize_unregister(void) }while ((++it_func_ptr)->func); \ } \rcu_read_unlock_sched_notrace (); \ + postrcu; \ }while (0 )/*
@@ -139,7 +141,7 @@ static inline void tracepoint_synchronize_unregister(void)* not add unwanted padding between the beginning of the section and the * structure. Force alignment to the same alignment as the section start. */ -#define __DECLARE_TRACE (name, proto, args, cond, data_proto, data_args) \ +#define __DECLARE_TRACE (name, proto, args, cond, data_proto, data_args) \ extern struct tracepoint __tracepoint_##name; \ static inline void trace_##name(proto) \ { \
@@ -147,7 +149,17 @@ static inline void tracepoint_synchronize_unregister(void) __DO_TRACE(&__tracepoint_##name, \ TP_PROTO(data_proto), \ TP_ARGS(data_args), \ - TP_CONDITION(cond)); \ + TP_CONDITION(cond),,); \ + } \ + static inline void trace_##name##_rcuidle(proto) \ + { \ + if (static_branch(&__tracepoint_##name.key)) \ + __DO_TRACE(&__tracepoint_##name, \ + TP_PROTO(data_proto), \ + TP_ARGS(data_args), \ + TP_CONDITION(cond), \ + rcu_idle_exit(), \ + rcu_idle_enter()); \ } \ static inline int \ register_trace_##name(void (*probe)(data_proto), void *data) \
@@ -190,9 +202,11 @@ static inline void tracepoint_synchronize_unregister(void) EXPORT_SYMBOL(__tracepoint_##name)#else /* !CONFIG_TRACEPOINTS */ -#define __DECLARE_TRACE (name, proto, args, cond, data_proto, data_args) \ +#define __DECLARE_TRACE (name, proto, args, cond, data_proto, data_args) \ static inline void trace_##name(proto) \ { } \ + static inline void trace_##name##_rcuidle(proto) \ + { } \ static inline int \ register_trace_##name(void (*probe)(data_proto), \ void *data) \
Signature · 1 line
1.7.8.3
Steven Rostedt
maintainerPATCH 4/9 x86/tracing: Denote the power and cpuidle tracepoints as _rcuidle()
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
The power and cpuidle tracepoints are called within a rcu_idle_exit() section, and must be denoted with the _rcuidle() version of the tracepoint.
--- arch/x86/kernel/process.c | 24 ++++++++++++------------ include/trace/events/power.h | 2 ++ 2 files changed, 14 insertions(+), 12 deletions(-)
arch/x86/kernel/process.c +12 -12
@@ -377,8 +377,8 @@ static inline int hlt_use_halt(void)void default_idle (void ) {if (hlt_use_halt ()) { -trace_power_start (POWER_CSTATE ,1 ,smp_processor_id ()); -trace_cpu_idle (1 ,smp_processor_id ()); +trace_power_start_rcuidle (POWER_CSTATE ,1 ,smp_processor_id ()); +trace_cpu_idle_rcuidle (1 ,smp_processor_id ());current_thread_info ()->status &= ~TS_POLLING ;/* * TS_POLLING-cleared state must be visible before we
@@ -391,8 +391,8 @@ void default_idle(void)else local_irq_enable ();current_thread_info ()->status |=TS_POLLING ; -trace_power_end (smp_processor_id ()); -trace_cpu_idle (PWR_EVENT_EXIT ,smp_processor_id ()); +trace_power_end_rcuidle (smp_processor_id ()); +trace_cpu_idle_rcuidle (PWR_EVENT_EXIT ,smp_processor_id ()); }else {local_irq_enable ();/* loop is done by the caller */
@@ -450,8 +450,8 @@ EXPORT_SYMBOL_GPL(cpu_idle_wait);static void mwait_idle (void ) {if (!need_resched ()) { -trace_power_start (POWER_CSTATE ,1 ,smp_processor_id ()); -trace_cpu_idle (1 ,smp_processor_id ()); +trace_power_start_rcuidle (POWER_CSTATE ,1 ,smp_processor_id ()); +trace_cpu_idle_rcuidle (1 ,smp_processor_id ());if (this_cpu_has (X86_FEATURE_CLFLUSH_MONITOR ))clflush ((void *)¤t_thread_info ()->flags);
@@ -461,8 +461,8 @@ static void mwait_idle(void)__sti_mwait (0 ,0 ); elselocal_irq_enable (); -trace_power_end (smp_processor_id ()); -trace_cpu_idle (PWR_EVENT_EXIT ,smp_processor_id ()); +trace_power_end_rcuidle (smp_processor_id ()); +trace_cpu_idle_rcuidle (PWR_EVENT_EXIT ,smp_processor_id ()); }else local_irq_enable (); }
@@ -474,13 +474,13 @@ static void mwait_idle(void)*/ static void poll_idle (void ) { -trace_power_start (POWER_CSTATE ,0 ,smp_processor_id ()); -trace_cpu_idle (0 ,smp_processor_id ()); +trace_power_start_rcuidle (POWER_CSTATE ,0 ,smp_processor_id ()); +trace_cpu_idle_rcuidle (0 ,smp_processor_id ());local_irq_enable ();while (!need_resched ())cpu_relax (); -trace_power_end (smp_processor_id ()); -trace_cpu_idle (PWR_EVENT_EXIT ,smp_processor_id ()); +trace_power_end_rcuidle (smp_processor_id ()); +trace_cpu_idle_rcuidle (PWR_EVENT_EXIT ,smp_processor_id ()); }/*
include/trace/events/power.h +2 -0
@@ -151,6 +151,8 @@ enum {events get removed */ static inline void trace_power_start (u64 type,u64 state,u64 cpuid) {};static inline void trace_power_end (u64 cpuid) {}; +static inline void trace_power_start_rcuidle (u64 type,u64 state,u64 cpuid) {}; +static inline void trace_power_end_rcuidle (u64 cpuid) {};static inline void trace_power_frequency (u64 type,u64 state,u64 cpuid) {};#endif /* _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED */
Signature · 1 line
1.7.8.3
Steven Rostedt
maintainerPATCH 5/9 cpuidle/tracing: Denote the tracepoints as being in rcu_idle_exit() section
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
As the tracepoints in the cpuidle code are called when rcu_idle_exit() is in effect, the _rcuidle() version must be used, otherwise the rcu_read_lock()s that protect the tracepoint will not be honored.
--- drivers/cpuidle/cpuidle.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-)
drivers/cpuidle/cpuidle.c +4 -4
@@ -94,13 +94,13 @@ int cpuidle_idle_call(void) target_state = &drv->states[next_state]; -trace_power_start (POWER_CSTATE , next_state, dev->cpu); -trace_cpu_idle (next_state, dev->cpu); +trace_power_start_rcuidle (POWER_CSTATE , next_state, dev->cpu); +trace_cpu_idle_rcuidle (next_state, dev->cpu); entered_state = target_state->enter (dev, drv, next_state); -trace_power_end (dev->cpu); -trace_cpu_idle (PWR_EVENT_EXIT , dev->cpu); +trace_power_end_rcuidle (dev->cpu); +trace_cpu_idle_rcuidle (PWR_EVENT_EXIT , dev->cpu);if (entered_state >=0 ) {/* Update cpuidle counters */
Signature · 1 line
1.7.8.3
Steven Rostedt
maintainerPATCH 6/9 ftrace: sched_switch plugin is deprecated
In reply to Steven RostedtFrom: Geunsik Lim <[email protected]>
Actually, sched_switch function tracer is merged into wakeup/wakeup_rt Update 'mini-HOWTO' for ftrace(Kernel function tracer).
If we want to trace "sched:sched_switch" to trace sched_switch func, We may utilize event option.(e.g: trace-cmd list -e | grep sched) This patch is based on Linux-3.3.rc2-SMP-PREEMPT
--- kernel/trace/trace.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
kernel/trace/trace.c +3 -3
@@ -2764,12 +2764,12 @@ static const char readme_msg[] ="tracing mini-HOWTO:\n\n" "# mount -t debugfs nodev /sys/kernel/debug\n\n" "# cat /sys/kernel/debug/tracing/available_tracers\n" -"wakeup preemptirqsoff preemptoff irqsoff function sched_switch nop\n\n" +"wakeup wakeup_rt preemptirqsoff preemptoff irqsoff function nop\n\n" "# cat /sys/kernel/debug/tracing/current_tracer\n" "nop\n" -"# echo sched_switch > /sys/kernel/debug/tracing/current_tracer\n" +"# echo wakeup > /sys/kernel/debug/tracing/current_tracer\n" "# cat /sys/kernel/debug/tracing/current_tracer\n" -"sched_switch\n" +"wakeup\n" "# cat /sys/kernel/debug/tracing/trace_options\n" "noprint-parent nosym-offset nosym-addr noverbose\n" "# echo print-parent > /sys/kernel/debug/tracing/trace_options\n"
Signature · 1 line
1.7.8.3
Steven Rostedt
maintainerPATCH 7/9 ftrace: Append wakeup_rt description of ftrace doc
In reply to Steven RostedtFrom: Geunsik Lim <[email protected]>
Append and update the description about wakeup/wakeup_rt usage.
--- Documentation/trace/ftrace.txt | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-)
Documentation/trace/ftrace.txt +7 -0
@@ -226,6 +226,13 @@ Here is the list of current tracers that may be configured. Traces and records the max latency that it takes for the highest priority task to get scheduled after it has been woken up. + Traces all tasks as an average developer would expect. + + "wakeup_rt" + + Traces and records the max latency that it takes for just + RT tasks (as the current "wakeup" does). This is useful + for those interested in wake up timings of RT tasks. "hw-branch-tracer"
Signature · 1 line
1.7.8.3
Steven Rostedt
maintainerPATCH 8/9 printk/tracing: Add console output tracing
In reply to Steven RostedtFrom: Johannes Berg <[email protected]>
Add a printk.console trace point to record any printk messages into the trace, regardless of the current console loglevel. This can help correlate (existing) printk debugging with other tracing.
--- include/trace/events/printk.h | 41 +++++++++++++++++++++++++++++++++++++++++ kernel/printk.c | 5 +++++ 2 files changed, 46 insertions(+), 0 deletions(-) create mode 100644 include/trace/events/printk.h
include/trace/events/printk.h new file +41 -0
@@ -0,0 +1,41 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM printk + +#if !defined(_TRACE_PRINTK_H) || defined(TRACE_HEADER_MULTI_READ ) +#define _TRACE_PRINTK_H + +#include <linux/tracepoint.h> + +TRACE_EVENT_CONDITION (console, + TP_PROTO(const char *log_buf, unsigned start, unsigned end, + unsigned log_buf_len), + +TP_ARGS (log_buf, start, end, log_buf_len), + +TP_CONDITION (start != end), + +TP_STRUCT__entry ( +__dynamic_array (char, msg, end - start +1 ) + ), + +TP_fast_assign ( + if ((start & (log_buf_len - 1)) > (end & (log_buf_len - 1))) { + memcpy(__get_dynamic_array(msg), + log_buf + (start & (log_buf_len - 1)), + log_buf_len - (start & (log_buf_len - 1))); + memcpy((char *)__get_dynamic_array(msg) + + log_buf_len - (start & (log_buf_len - 1)), + log_buf, end & (log_buf_len - 1)); + } else +memcpy (__get_dynamic_array (msg), + log_buf + (start & (log_buf_len -1 )), + end - start); + ((char *)__get_dynamic_array(msg))[end - start] = 0; + ), + +TP_printk ("%s" ,__get_str (msg)) +); +#endif /* _TRACE_PRINTK_H */ + +/* This part must be outside protection */ +#include <trace/define_trace.h>
kernel/printk.c +5 -0
@@ -44,6 +44,9 @@#include <asm/uaccess.h> +#define CREATE_TRACE_POINTS +#include <trace/events/printk.h> +/* * Architectures can override it: */
@@ -542,6 +545,8 @@ MODULE_PARM_DESC(ignore_loglevel, "ignore loglevel setting, to"static void _call_console_drivers (unsigned start,unsigned end,int msg_log_level) { +trace_console (&LOG_BUF (0 ), start, end, log_buf_len); +if ((msg_log_level < console_loglevel || ignore_loglevel) && console_drivers && start != end) {if ((start &LOG_BUF_MASK ) > (end &LOG_BUF_MASK )) {
Signature · 1 line
1.7.8.3
Steven Rostedt
maintainerPATCH 9/9 tracing/trivial: Use kcalloc instead of kzalloc to allocate array
In reply to Steven RostedtFrom: Thomas Meyer <[email protected]>
The advantage of kcalloc is, that will prevent integer overflows which could result from the multiplication of number of elements and size and it is also a bit nicer to read.
The semantic patch that makes this change is available in https://lkml.org/lkml/2011/11/25/107
--- kernel/trace/ftrace.c | 2 +- kernel/trace/trace_events_filter.c | 7 +++---- kernel/trace/trace_syscalls.c | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-)
kernel/trace/ftrace.c +1 -1
@@ -1129,7 +1129,7 @@ static struct ftrace_hash *alloc_ftrace_hash(int size_bits)return NULL ; size =1 << size_bits; - hash->buckets =kzalloc (sizeof (*hash->buckets) * size,GFP_KERNEL ); + hash->buckets =kcalloc (size,sizeof (*hash->buckets),GFP_KERNEL );if (!hash->buckets) {kfree (hash);
kernel/trace/trace_events_filter.c +3 -4
@@ -685,7 +685,7 @@ find_event_field(struct ftrace_event_call *call, char *name)static int __alloc_pred_stack (struct pred_stack *stack,int n_preds) { - stack->preds =kzalloc (sizeof (*stack->preds)*(n_preds +1 ),GFP_KERNEL ); + stack->preds =kcalloc (n_preds +1 ,sizeof (*stack->preds),GFP_KERNEL );if (!stack->preds)return -ENOMEM ; stack->index = n_preds;
@@ -826,8 +826,7 @@ static int __alloc_preds(struct event_filter *filter, int n_preds)if (filter->preds)__free_preds (filter); - filter->preds = -kzalloc (sizeof (*filter->preds) * n_preds,GFP_KERNEL ); + filter->preds =kcalloc (n_preds,sizeof (*filter->preds),GFP_KERNEL );if (!filter->preds)return -ENOMEM ;
@@ -1486,7 +1485,7 @@ static int fold_pred(struct filter_pred *preds, struct filter_pred *root) children =count_leafs (preds, &preds[root->left]); children +=count_leafs (preds, &preds[root->right]); - root->ops =kzalloc (sizeof (*root->ops) * children,GFP_KERNEL ); + root->ops =kcalloc (children,sizeof (*root->ops),GFP_KERNEL );if (!root->ops)return -ENOMEM ;
kernel/trace/trace_syscalls.c +2 -2
@@ -468,8 +468,8 @@ int __init init_ftrace_syscalls(void)unsigned long addr;int i; - syscalls_metadata =kzalloc (sizeof (*syscalls_metadata) * - NR_syscalls,GFP_KERNEL ); + syscalls_metadata =kcalloc (NR_syscalls,sizeof (*syscalls_metadata), +GFP_KERNEL );if (!syscalls_metadata) {WARN_ON (1 );return -ENOMEM ;
Signature · 1 line
1.7.8.3