|
@@ -55,8 +55,8 @@ static DEFINE_MUTEX(markers_mutex);
|
|
struct marker_entry {
|
|
struct marker_entry {
|
|
struct hlist_node hlist;
|
|
struct hlist_node hlist;
|
|
char *format;
|
|
char *format;
|
|
- void (*call)(const struct marker *mdata, /* Probe wrapper */
|
|
|
|
- void *call_private, const char *fmt, ...);
|
|
|
|
|
|
+ /* Probe wrapper */
|
|
|
|
+ void (*call)(const struct marker *mdata, void *call_private, ...);
|
|
struct marker_probe_closure single;
|
|
struct marker_probe_closure single;
|
|
struct marker_probe_closure *multi;
|
|
struct marker_probe_closure *multi;
|
|
int refcount; /* Number of times armed. 0 if disarmed. */
|
|
int refcount; /* Number of times armed. 0 if disarmed. */
|
|
@@ -91,15 +91,13 @@ EXPORT_SYMBOL_GPL(__mark_empty_function);
|
|
* marker_probe_cb Callback that prepares the variable argument list for probes.
|
|
* marker_probe_cb Callback that prepares the variable argument list for probes.
|
|
* @mdata: pointer of type struct marker
|
|
* @mdata: pointer of type struct marker
|
|
* @call_private: caller site private data
|
|
* @call_private: caller site private data
|
|
- * @fmt: format string
|
|
|
|
* @...: Variable argument list.
|
|
* @...: Variable argument list.
|
|
*
|
|
*
|
|
* Since we do not use "typical" pointer based RCU in the 1 argument case, we
|
|
* Since we do not use "typical" pointer based RCU in the 1 argument case, we
|
|
* 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,
|
|
|
|
- const char *fmt, ...)
|
|
|
|
|
|
+void marker_probe_cb(const struct marker *mdata, void *call_private, ...)
|
|
{
|
|
{
|
|
va_list args;
|
|
va_list args;
|
|
char ptype;
|
|
char ptype;
|
|
@@ -120,8 +118,9 @@ void marker_probe_cb(const struct marker *mdata, void *call_private,
|
|
/* Must read the ptr before private data. They are not data
|
|
/* Must read the ptr before private data. They are not data
|
|
* dependant, so we put an explicit smp_rmb() here. */
|
|
* dependant, so we put an explicit smp_rmb() here. */
|
|
smp_rmb();
|
|
smp_rmb();
|
|
- va_start(args, fmt);
|
|
|
|
- func(mdata->single.probe_private, call_private, fmt, &args);
|
|
|
|
|
|
+ va_start(args, call_private);
|
|
|
|
+ func(mdata->single.probe_private, call_private, mdata->format,
|
|
|
|
+ &args);
|
|
va_end(args);
|
|
va_end(args);
|
|
} else {
|
|
} else {
|
|
struct marker_probe_closure *multi;
|
|
struct marker_probe_closure *multi;
|
|
@@ -136,9 +135,9 @@ void marker_probe_cb(const struct marker *mdata, void *call_private,
|
|
smp_read_barrier_depends();
|
|
smp_read_barrier_depends();
|
|
multi = mdata->multi;
|
|
multi = mdata->multi;
|
|
for (i = 0; multi[i].func; i++) {
|
|
for (i = 0; multi[i].func; i++) {
|
|
- va_start(args, fmt);
|
|
|
|
- multi[i].func(multi[i].probe_private, call_private, fmt,
|
|
|
|
- &args);
|
|
|
|
|
|
+ va_start(args, call_private);
|
|
|
|
+ multi[i].func(multi[i].probe_private, call_private,
|
|
|
|
+ mdata->format, &args);
|
|
va_end(args);
|
|
va_end(args);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -150,13 +149,11 @@ EXPORT_SYMBOL_GPL(marker_probe_cb);
|
|
* marker_probe_cb Callback that does not prepare the variable argument list.
|
|
* marker_probe_cb Callback that does not prepare the variable argument list.
|
|
* @mdata: pointer of type struct marker
|
|
* @mdata: pointer of type struct marker
|
|
* @call_private: caller site private data
|
|
* @call_private: caller site private data
|
|
- * @fmt: format string
|
|
|
|
* @...: Variable argument list.
|
|
* @...: Variable argument list.
|
|
*
|
|
*
|
|
* Should be connected to markers "MARK_NOARGS".
|
|
* Should be connected to markers "MARK_NOARGS".
|
|
*/
|
|
*/
|
|
-void marker_probe_cb_noarg(const struct marker *mdata,
|
|
|
|
- void *call_private, const char *fmt, ...)
|
|
|
|
|
|
+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;
|
|
@@ -172,7 +169,8 @@ void marker_probe_cb_noarg(const struct marker *mdata,
|
|
/* Must read the ptr before private data. They are not data
|
|
/* Must read the ptr before private data. They are not data
|
|
* dependant, so we put an explicit smp_rmb() here. */
|
|
* dependant, so we put an explicit smp_rmb() here. */
|
|
smp_rmb();
|
|
smp_rmb();
|
|
- func(mdata->single.probe_private, call_private, fmt, &args);
|
|
|
|
|
|
+ func(mdata->single.probe_private, call_private, mdata->format,
|
|
|
|
+ &args);
|
|
} else {
|
|
} else {
|
|
struct marker_probe_closure *multi;
|
|
struct marker_probe_closure *multi;
|
|
int i;
|
|
int i;
|
|
@@ -186,8 +184,8 @@ void marker_probe_cb_noarg(const struct marker *mdata,
|
|
smp_read_barrier_depends();
|
|
smp_read_barrier_depends();
|
|
multi = mdata->multi;
|
|
multi = mdata->multi;
|
|
for (i = 0; multi[i].func; i++)
|
|
for (i = 0; multi[i].func; i++)
|
|
- multi[i].func(multi[i].probe_private, call_private, fmt,
|
|
|
|
- &args);
|
|
|
|
|
|
+ multi[i].func(multi[i].probe_private, call_private,
|
|
|
|
+ mdata->format, &args);
|
|
}
|
|
}
|
|
preempt_enable();
|
|
preempt_enable();
|
|
}
|
|
}
|