markers: use rcu_*_sched_notrace and notrace
Make marker critical code use notrace to make sure they can be used as an ftrace callback. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
committed by
Ingo Molnar
parent
e3f8c4b911
commit
021aeb057f
@@ -81,7 +81,7 @@ struct marker_entry {
|
|||||||
* though the function pointer change and the marker enabling are two distinct
|
* though the function pointer change and the marker enabling are two distinct
|
||||||
* operations that modifies the execution flow of preemptible code.
|
* operations that modifies the execution flow of preemptible code.
|
||||||
*/
|
*/
|
||||||
void __mark_empty_function(void *probe_private, void *call_private,
|
notrace void __mark_empty_function(void *probe_private, void *call_private,
|
||||||
const char *fmt, va_list *args)
|
const char *fmt, va_list *args)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -97,7 +97,8 @@ EXPORT_SYMBOL_GPL(__mark_empty_function);
|
|||||||
* need to put a full smp_rmb() in this branch. This is why we do not use
|
* need to put a full smp_rmb() in this branch. This is why we do not use
|
||||||
* rcu_dereference() for the pointer read.
|
* rcu_dereference() for the pointer read.
|
||||||
*/
|
*/
|
||||||
void marker_probe_cb(const struct marker *mdata, void *call_private, ...)
|
notrace void marker_probe_cb(const struct marker *mdata,
|
||||||
|
void *call_private, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
char ptype;
|
char ptype;
|
||||||
@@ -107,7 +108,7 @@ void marker_probe_cb(const struct marker *mdata, void *call_private, ...)
|
|||||||
* sure the teardown of the callbacks can be done correctly when they
|
* sure the teardown of the callbacks can be done correctly when they
|
||||||
* are in modules and they insure RCU read coherency.
|
* are in modules and they insure RCU read coherency.
|
||||||
*/
|
*/
|
||||||
rcu_read_lock_sched();
|
rcu_read_lock_sched_notrace();
|
||||||
ptype = mdata->ptype;
|
ptype = mdata->ptype;
|
||||||
if (likely(!ptype)) {
|
if (likely(!ptype)) {
|
||||||
marker_probe_func *func;
|
marker_probe_func *func;
|
||||||
@@ -145,7 +146,7 @@ void marker_probe_cb(const struct marker *mdata, void *call_private, ...)
|
|||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rcu_read_unlock_sched();
|
rcu_read_unlock_sched_notrace();
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(marker_probe_cb);
|
EXPORT_SYMBOL_GPL(marker_probe_cb);
|
||||||
|
|
||||||
@@ -157,12 +158,13 @@ EXPORT_SYMBOL_GPL(marker_probe_cb);
|
|||||||
*
|
*
|
||||||
* Should be connected to markers "MARK_NOARGS".
|
* Should be connected to markers "MARK_NOARGS".
|
||||||
*/
|
*/
|
||||||
static void marker_probe_cb_noarg(const struct marker *mdata, void *call_private, ...)
|
static notrace void marker_probe_cb_noarg(const struct marker *mdata,
|
||||||
|
void *call_private, ...)
|
||||||
{
|
{
|
||||||
va_list args; /* not initialized */
|
va_list args; /* not initialized */
|
||||||
char ptype;
|
char ptype;
|
||||||
|
|
||||||
rcu_read_lock_sched();
|
rcu_read_lock_sched_notrace();
|
||||||
ptype = mdata->ptype;
|
ptype = mdata->ptype;
|
||||||
if (likely(!ptype)) {
|
if (likely(!ptype)) {
|
||||||
marker_probe_func *func;
|
marker_probe_func *func;
|
||||||
@@ -195,7 +197,7 @@ static void marker_probe_cb_noarg(const struct marker *mdata, void *call_private
|
|||||||
multi[i].func(multi[i].probe_private, call_private,
|
multi[i].func(multi[i].probe_private, call_private,
|
||||||
mdata->format, &args);
|
mdata->format, &args);
|
||||||
}
|
}
|
||||||
rcu_read_unlock_sched();
|
rcu_read_unlock_sched_notrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_old_closure(struct rcu_head *head)
|
static void free_old_closure(struct rcu_head *head)
|
||||||
|
Reference in New Issue
Block a user