forked from Minki/linux
tracing: Remove side effect from module tracepoints that caused a GPF
Remove the @refcnt argument, because it has side-effects, and arguments with side-effects are not skipped by the jump over disabled instrumentation and are executed even when the tracepoint is disabled. This was also causing a GPF as found by Randy Dunlap: Subject: 2.6.33 GP fault only when built with tracing LKML-Reference: <4BA2B69D.3000309@oracle.com> Note, the current 2.6.34-rc has a fix for the actual cause of the GPF, but this fixes one of its triggers. Tested-by: Randy Dunlap <randy.dunlap@oracle.com> Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> LKML-Reference: <4BA97FA7.6040406@cn.fujitsu.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
parent
50354a8a28
commit
ae832d1e03
@ -460,8 +460,7 @@ static inline void __module_get(struct module *module)
|
||||
if (module) {
|
||||
preempt_disable();
|
||||
__this_cpu_inc(module->refptr->count);
|
||||
trace_module_get(module, _THIS_IP_,
|
||||
__this_cpu_read(module->refptr->count));
|
||||
trace_module_get(module, _THIS_IP_);
|
||||
preempt_enable();
|
||||
}
|
||||
}
|
||||
@ -475,8 +474,7 @@ static inline int try_module_get(struct module *module)
|
||||
|
||||
if (likely(module_is_live(module))) {
|
||||
__this_cpu_inc(module->refptr->count);
|
||||
trace_module_get(module, _THIS_IP_,
|
||||
__this_cpu_read(module->refptr->count));
|
||||
trace_module_get(module, _THIS_IP_);
|
||||
}
|
||||
else
|
||||
ret = 0;
|
||||
|
@ -53,9 +53,9 @@ TRACE_EVENT(module_free,
|
||||
|
||||
DECLARE_EVENT_CLASS(module_refcnt,
|
||||
|
||||
TP_PROTO(struct module *mod, unsigned long ip, int refcnt),
|
||||
TP_PROTO(struct module *mod, unsigned long ip),
|
||||
|
||||
TP_ARGS(mod, ip, refcnt),
|
||||
TP_ARGS(mod, ip),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( unsigned long, ip )
|
||||
@ -65,7 +65,7 @@ DECLARE_EVENT_CLASS(module_refcnt,
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->ip = ip;
|
||||
__entry->refcnt = refcnt;
|
||||
__entry->refcnt = __this_cpu_read(mod->refptr->count);
|
||||
__assign_str(name, mod->name);
|
||||
),
|
||||
|
||||
@ -75,16 +75,16 @@ DECLARE_EVENT_CLASS(module_refcnt,
|
||||
|
||||
DEFINE_EVENT(module_refcnt, module_get,
|
||||
|
||||
TP_PROTO(struct module *mod, unsigned long ip, int refcnt),
|
||||
TP_PROTO(struct module *mod, unsigned long ip),
|
||||
|
||||
TP_ARGS(mod, ip, refcnt)
|
||||
TP_ARGS(mod, ip)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(module_refcnt, module_put,
|
||||
|
||||
TP_PROTO(struct module *mod, unsigned long ip, int refcnt),
|
||||
TP_PROTO(struct module *mod, unsigned long ip),
|
||||
|
||||
TP_ARGS(mod, ip, refcnt)
|
||||
TP_ARGS(mod, ip)
|
||||
);
|
||||
|
||||
TRACE_EVENT(module_request,
|
||||
|
@ -800,8 +800,7 @@ void module_put(struct module *module)
|
||||
preempt_disable();
|
||||
__this_cpu_dec(module->refptr->count);
|
||||
|
||||
trace_module_put(module, _RET_IP_,
|
||||
__this_cpu_read(module->refptr->count));
|
||||
trace_module_put(module, _RET_IP_);
|
||||
/* Maybe they're waiting for us to drop reference? */
|
||||
if (unlikely(!module_is_live(module)))
|
||||
wake_up_process(module->waiter);
|
||||
|
Loading…
Reference in New Issue
Block a user