#ifndef _DTRACE_SDT_H_
#define _DTRACE_SDT_H_
+#include <linux/module.h>
#include <asm/dtrace_arch.h>
/*
extern void dtrace_sdt_init(void);
extern void dtrace_sdt_register(struct module *);
+extern void dtrace_sdt_register_module(struct module *);
extern void dtrace_sdt_exit(void);
/*
#include <linux/binfmts.h>
#include <linux/dtrace_cpu.h>
#include <linux/dtrace_os.h>
+#include <linux/dtrace_sdt.h>
#include <linux/fs.h>
#include <linux/hardirq.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#include <linux/mm.h>
#include <asm/ptrace.h>
-#include "dtrace_sdt.h"
#if defined(CONFIG_DT_FASTTRAP) || defined(CONFIG_DT_FASTTRAP_MODULE)
# include <linux/uprobes.h>
#include <linux/memory.h>
#include <linux/module.h>
#include <linux/dtrace_os.h>
+#include <linux/dtrace_sdt.h>
#include <linux/sdt.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/vmalloc.h>
#include <asm-generic/bitsperlong.h>
#include <asm-generic/sections.h>
-#include "dtrace_sdt.h"
const char *sdt_prefix = "__dtrace_probe_";
early_param("nosdt", nosdt);
-static int dtrace_mod_notifier(struct notifier_block *nb, unsigned long val,
- void *args)
+void dtrace_sdt_register_module(struct module *mp)
{
- struct module *mp = args;
int i, cnt;
sdt_probedesc_t *sdp;
asm_instr_t **addrs;
- /*
- * We only need to capture modules in the COMING state, we need a valid
- * module structure as argument, and the module needs to actually have
- * SDT probes. If not, ignore...
- */
- if (val != MODULE_STATE_COMING)
- return NOTIFY_DONE;
- if (!mp)
- return NOTIFY_DONE;
if (mp->sdt_probec == 0 || mp->sdt_probes == NULL)
- return NOTIFY_DONE;
+ return;
/*
* Create a list of addresses (SDT probe locations) that need to be
if (addrs == NULL) {
pr_warning("%s: cannot allocate SDT probe address list (%s)\n",
__func__, mp->name);
- return NOTIFY_DONE;
+ return;
}
for (i = cnt = 0, sdp = mp->sdt_probes; i < mp->sdt_probec;
dtrace_sdt_nop_multi(addrs, cnt);
vfree(addrs);
-
- return NOTIFY_DONE;
}
-static struct notifier_block dtrace_modfix = {
- .notifier_call = dtrace_mod_notifier,
-};
-
void dtrace_sdt_init(void)
{
dtrace_sdt_init_arch();
- register_module_notifier(&dtrace_modfix);
}
#if defined(CONFIG_DT_DT_PERF) || defined(CONFIG_DT_DT_PERF_MODULE)
#include <asm/mmu_context.h>
#include <linux/license.h>
#include <asm/sections.h>
+#include <linux/dtrace_sdt.h>
#include <linux/tracepoint.h>
#include <linux/ftrace.h>
#include <linux/async.h>
{
int err;
+ dtrace_sdt_register_module(mod);
+
mutex_lock(&module_mutex);
/* Find duplicate symbols (must be called under lock). */