(arg == 0 && kind == DTRACEACT_PRINTA));
#endif
- act = vzalloc(sizeof (dtrace_actdesc_t));
+ act = kzalloc(sizeof (dtrace_actdesc_t), GFP_KERNEL);
if (act == NULL)
return NULL;
vfree(str);
}
- vfree(act);
+ kfree(act);
}
case DTRACEIOC_PROBEMATCH:
case DTRACEIOC_PROBES: {
+ int id;
dtrace_probe_t *probe = NULL;
dtrace_probedesc_t desc;
dtrace_probekey_t pkey;
mutex_lock(&dtrace_lock);
+ id = desc.dtpd_id;
if (cmd == DTRACEIOC_PROBEMATCH) {
int m = 0;
- while ((probe = dtrace_probe_get_next(desc.dtpd_id))
+ while ((probe = dtrace_probe_get_next(&id))
!= NULL) {
if ((m = dtrace_match_probe(
probe, &pkey, priv, uid)))
break;
- desc.dtpd_id = probe->dtpr_id + 1;
+ id++;
}
if (m < 0) {
return -EINVAL;
}
} else {
- while ((probe = dtrace_probe_get_next(desc.dtpd_id))
+ while ((probe = dtrace_probe_get_next(&id))
!= NULL) {
if (dtrace_match_priv(probe, priv, uid))
break;
- desc.dtpd_id = probe->dtpr_id + 1;
+ id++;
}
}
mutex_lock(&dtrace_provider_lock);
mutex_lock(&dtrace_lock);
+ rc = dtrace_probe_init();
+ if (rc) {
+ pr_err("Failed to initialize DTrace core\n");
+
+ mutex_unlock(&cpu_lock);
+ mutex_unlock(&dtrace_provider_lock);
+ mutex_unlock(&dtrace_lock);
+
+ return rc;
+ }
+
/*
* Register the device for the DTrace core.
*/
register_cpu_setup_func((cpu_setup_func_t *)dtrace_cpu_setup, NULL);
#endif
- dtrace_probe_init();
-
#ifdef FIXME
dtrace_taskq = taskq_create("dtrace_taskq", 1, maxclsyspri, 1, INT_MAX,
0);
}
if ((svar = (*svarp)[id]) == NULL) {
- svar = vzalloc(sizeof(dtrace_statvar_t));
+ svar = kzalloc(sizeof(dtrace_statvar_t), GFP_KERNEL);
svar->dtsv_var = *v;
if ((svar->dtsv_size = dsize) != 0) {
ASSERT(dp->dtdo_buf != NULL);
ASSERT(dp->dtdo_refcnt != 0);
- new = vzalloc(sizeof(dtrace_difo_t));
+ new = kzalloc(sizeof(dtrace_difo_t), GFP_KERNEL);
ASSERT(dp->dtdo_buf != NULL);
sz = dp->dtdo_len * sizeof(dif_instr_t);
vfree((void *)(uintptr_t)svar->dtsv_data);
}
- vfree(svar);
+ kfree(svar);
svarp[id] = NULL;
}
vfree(dp->dtdo_inttab);
vfree(dp->dtdo_strtab);
vfree(dp->dtdo_vartab);
- vfree(dp);
+ kfree(dp);
}
void dtrace_difo_release(dtrace_difo_t *dp, dtrace_vstate_t *vstate)
dofd = (dof_difohdr_t *)(uintptr_t)(daddr + sec->dofs_offset);
n = (sec->dofs_size - sizeof(*dofd)) / sizeof(dof_secidx_t) + 1;
- dp = vzalloc(sizeof(dtrace_difo_t));
+ dp = kzalloc(sizeof(dtrace_difo_t), GFP_KERNEL);
if (dp == NULL) {
dtrace_dof_error(dof, "out-of-memory");
return NULL;
if (dp->dtdo_vartab != NULL)
vfree(dp->dtdo_vartab);
- vfree(dp);
+ kfree(dp);
return NULL;
}
if (sec == NULL)
return NULL;
- ep = vzalloc(sizeof(dtrace_ecbdesc_t));
+ ep = kzalloc(sizeof(dtrace_ecbdesc_t), GFP_KERNEL);
if (ep == NULL)
return NULL;
ep->dted_uarg = ecb->dofe_uarg;
err:
if (pred != NULL)
dtrace_predicate_release(pred, vstate);
- vfree(ep);
+ kfree(ep);
return NULL;
}
ASSERT(MUTEX_HELD(&dtrace_lock));
ASSERT(curr->dtrace_helpers == NULL);
- dth = vzalloc(sizeof(dtrace_helpers_t));
+ dth = kzalloc(sizeof(dtrace_helpers_t), GFP_KERNEL);
if (dth == NULL)
return NULL;
dth->dthps_actions = vzalloc(sizeof(dtrace_helper_action_t *) *
DTRACE_NHELPER_ACTIONS);
if (dth->dthps_actions == NULL) {
- vfree(dth);
+ kfree(dth);
return NULL;
}
}
vfree(helper->dtha_actions);
- vfree(helper);
+ kfree(helper);
}
static int dtrace_helper_action_add(int which, dtrace_ecbdesc_t *ep)
if (count >= dtrace_helper_actions_max)
return -ENOSPC;
- helper = vzalloc(sizeof(dtrace_helper_action_t));
+ helper = kzalloc(sizeof(dtrace_helper_action_t), GFP_KERNEL);
if (helper == NULL)
return -ENOMEM;
return -EALREADY;
}
- hprov = vzalloc(sizeof(dtrace_helper_provider_t));
+ hprov = kzalloc(sizeof(dtrace_helper_provider_t), GFP_KERNEL);
if (hprov == NULL)
return -ENOMEM;
hprov->dthp_prov = *dofhp;
dth->dthps_provs = vzalloc(dth->dthps_maxprovs *
sizeof(dtrace_helper_provider_t *));
if (dth->dthps_provs == NULL) {
- vfree(hprov);
+ kfree(hprov);
return -ENOMEM;
}
dof = (dof_hdr_t *)(uintptr_t)hprov->dthp_prov.dofhp_dof;
dtrace_dof_destroy(dof);
- vfree(hprov);
+ kfree(hprov);
} else
mutex_unlock(&dtrace_lock);
}
return -1;
}
+ dt_dbg_dof("DOF 0x%p from helper {'%s', %p, %p}...\n",
+ dof, dhp ? dhp->dofhp_mod : "<none>",
+ dhp ? dhp->dofhp_addr : NULL,
+ dhp ? dhp->dofhp_dof : NULL);
+
vstate = &dth->dthps_vstate;
if ((rv = dtrace_dof_slurp(dof, vstate, NULL, &enab,
dtrace_vstate_fini(&help->dthps_vstate);
vfree(help->dthps_actions);
- vfree(help);
+ kfree(help);
--dtrace_helpers;
mutex_unlock(&dtrace_lock);
continue;
for (last = NULL; helper != NULL; helper = helper->dtha_next) {
- new = vzalloc(sizeof(dtrace_helper_action_t));
+ new = kzalloc(sizeof(dtrace_helper_action_t),
+ GFP_KERNEL);
new->dtha_generation = helper->dtha_generation;
if ((dp = helper->dtha_predicate) != NULL) {
dtrace_state_t *state = ecb->dte_state;
int err;
- agg = vzalloc(sizeof(dtrace_aggregation_t));
+ agg = kzalloc(sizeof(dtrace_aggregation_t), GFP_KERNEL);
if (agg == NULL)
return NULL;
ASSERT(ntuple != 0);
err:
- vfree(agg);
+ kfree(agg);
return NULL;
success:
idr_remove(&state->dts_agg_idr, agg->dtag_id);
state->dts_naggs--;
- vfree(agg);
+ kfree(agg);
}
static int dtrace_ecb_action_add(dtrace_ecb_t *ecb, dtrace_actdesc_t *desc)
}
}
- action = vzalloc(sizeof(dtrace_action_t));
+ action = kzalloc(sizeof(dtrace_action_t), GFP_KERNEL);
if (action == NULL)
return -ENOMEM;
if (DTRACEACT_ISAGG(act->dta_kind))
dtrace_ecb_aggregation_destroy(ecb, act);
else
- vfree(act);
+ kfree(act);
}
}
ASSERT(MUTEX_HELD(&dtrace_lock));
- ecb = vzalloc(sizeof(dtrace_ecb_t));
+ ecb = kzalloc(sizeof(dtrace_ecb_t), GFP_KERNEL);
if (ecb == NULL)
return NULL;
ASSERT(state->dts_ecbs[epid - 1] == ecb);
state->dts_ecbs[epid - 1] = NULL;
- vfree(ecb);
+ kfree(ecb);
}
void dtrace_ecb_resize(dtrace_ecb_t *ecb)
{
dtrace_enabling_t *enab;
- enab = vzalloc(sizeof (dtrace_enabling_t));
+ enab = kzalloc(sizeof (dtrace_enabling_t), GFP_KERNEL);
if (enab == NULL)
return NULL;
* We're going to create a new ECB description that matches the
* specified ECB in every way, but has the specified probe description.
*/
- new = vzalloc(sizeof (dtrace_ecbdesc_t));
+ new = kzalloc(sizeof (dtrace_ecbdesc_t), GFP_KERNEL);
if ((pred = ecb->dted_pred.dtpdd_predicate) != NULL)
dtrace_predicate_hold(pred);
dtrace_actdesc_release(act, vstate);
}
- vfree(ep);
+ kfree(ep);
}
vfree(enab->dten_desc);
enab->dten_next->dten_prev = enab->dten_prev;
}
- vfree(enab);
+ kfree(enab);
}
int dtrace_enabling_retain(dtrace_enabling_t *enab)
dtrace_hash_t *dtrace_hash_create(uintptr_t stroffs, uintptr_t nextoffs,
uintptr_t prevoffs)
{
- dtrace_hash_t *hash = vzalloc(sizeof(dtrace_hash_t));
+ dtrace_hash_t *hash = kzalloc(sizeof(dtrace_hash_t), GFP_KERNEL);
if (hash == NULL)
return NULL;
sizeof(dtrace_hashbucket_t *));
if (hash->dth_tab == NULL) {
- vfree(hash);
+ kfree(hash);
return NULL;
}
#endif
vfree(hash->dth_tab);
- vfree(hash);
+ kfree(hash);
}
static int dtrace_hash_resize(dtrace_hash_t *hash)
return 0;
}
- bucket = vzalloc(sizeof(dtrace_hashbucket_t));
+ bucket = kzalloc(sizeof(dtrace_hashbucket_t), GFP_KERNEL);
if (bucket == NULL)
return -ENOMEM;
return NULL;
}
+/*
+ * FIXME:
+ * It would be more accurate to calculate a lookup cost based on the number
+ * of buckets in the hash table slot, the length of the chain, and the length
+ * of the string being looked up.
+ * The hash tables can also be optimized by storing the hashval in each element
+ * rather than always performing string comparisons.
+ */
int dtrace_hash_collisions(dtrace_hash_t *hash, dtrace_probe_t *template)
{
int hashval = DTRACE_HASHSTR(hash, template);
ASSERT(hash->dth_nbuckets > 0);
hash->dth_nbuckets--;
- vfree(bucket);
+ kfree(bucket);
return;
}
ASSERT(MUTEX_HELD(&dtrace_lock));
ASSERT(dp->dtdo_refcnt != 0);
- pred = vzalloc(sizeof (dtrace_predicate_t));
+ pred = kzalloc(sizeof (dtrace_predicate_t), GFP_KERNEL);
if (pred == NULL)
return NULL;
if (--pred->dtp_refcnt == 0) {
dtrace_difo_release(dp, vstate);
- vfree(pred);
+ kfree(pred);
}
}
500 * (NANOSEC / MILLISEC));
dtrace_genid_t dtrace_probegen;
+struct kmem_cache *dtrace_probe_cachep;
static struct idr dtrace_probe_idr;
static uint64_t dtrace_vtime_references;
dtrace_id_t id;
int err;
- probe = kzalloc(sizeof(dtrace_probe_t), __GFP_NOFAIL);
+ probe = kmem_cache_alloc(dtrace_probe_cachep, __GFP_NOFAIL);
/*
* The idr_pre_get() function should be called without holding locks.
}
probe->dtpr_id = id;
- probe->dtpr_gen = dtrace_probegen++;
- probe->dtpr_mod = dtrace_strdup(mod);
- probe->dtpr_func = dtrace_strdup(func);
- probe->dtpr_name = dtrace_strdup(name);
+ probe->dtpr_ecb = NULL;
+ probe->dtpr_ecb_last = NULL;
probe->dtpr_arg = arg;
+ probe->dtpr_predcache = DTRACE_CACHEIDNONE;
probe->dtpr_aframes = aframes;
probe->dtpr_provider = provider;
+ probe->dtpr_mod = dtrace_strdup(mod);
+ probe->dtpr_func = dtrace_strdup(func);
+ probe->dtpr_name = dtrace_strdup(name);
+ probe->dtpr_nextmod = probe->dtpr_prevmod = NULL;
+ probe->dtpr_nextfunc = probe->dtpr_prevfunc = NULL;
+ probe->dtpr_nextname = probe->dtpr_prevname = NULL;
+ probe->dtpr_gen = dtrace_probegen++;
dtrace_hash_add(dtrace_bymod, probe);
dtrace_hash_add(dtrace_byfunc, probe);
}
EXPORT_SYMBOL(dtrace_probe);
-void dtrace_probe_init(void)
+int dtrace_probe_init(void)
{
dtrace_id_t id;
int err;
+ dtrace_probe_cachep = KMEM_CACHE(dtrace_probe, SLAB_HWCACHE_ALIGN);
+ if (dtrace_probe_cachep == NULL)
+ return -ENOMEM;
+
idr_init(&dtrace_probe_idr);
/*
if (err == -EAGAIN)
goto again;
- ASSERT(id == 0);
+ return id == 0 ? 0 : -EAGAIN;
}
void dtrace_probe_exit(void)
{
idr_remove_all(&dtrace_probe_idr);
idr_destroy(&dtrace_probe_idr);
+ kmem_cache_destroy(dtrace_probe_cachep);
}
void dtrace_probe_remove_id(dtrace_id_t id)
}
EXPORT_SYMBOL(dtrace_probe_lookup);
-dtrace_probe_t *dtrace_probe_get_next(dtrace_id_t id)
+dtrace_probe_t *dtrace_probe_get_next(dtrace_id_t *idp)
{
- return idr_get_next(&dtrace_probe_idr, &id);
+ return idr_get_next(&dtrace_probe_idr, idp);
}
int dtrace_probe_for_each(int (*fn)(int id, void *p, void *data), void *data)
return -EINVAL;
}
- provider = vzalloc(sizeof (dtrace_provider_t));
+ provider = kzalloc(sizeof (dtrace_provider_t), GFP_KERNEL);
if (provider == NULL)
return -ENOMEM;
provider->dtpv_name = dtrace_strdup(name);
if (provider->dtpv_name == NULL) {
- vfree(provider);
+ kfree(provider);
return -ENOMEM;
}
provider->dtpv_attr = *pap;
kfree(probe->dtpr_mod);
kfree(probe->dtpr_func);
kfree(probe->dtpr_name);
- kfree(probe);
+ kmem_cache_free(dtrace_probe_cachep, probe);
dtrace_probe_remove_id(probe_id);
}
}
kfree(old->dtpv_name);
- vfree(old);
+ kfree(old);
return 0;
}
return -EINVAL;
}
- meta = vzalloc(sizeof(dtrace_meta_t));
+ meta = kzalloc(sizeof(dtrace_meta_t), GFP_KERNEL);
if (meta == NULL)
return -ENOMEM;
meta->dtm_mops = *mops;
- meta->dtm_name = vmalloc(strlen(name) + 1);
+ meta->dtm_name = kmalloc(strlen(name) + 1, GFP_KERNEL);
if (meta->dtm_name == NULL) {
- vfree(meta);
+ kfree(meta);
return -ENOMEM;
}
strcpy(meta->dtm_name, name);
mutex_unlock(&dtrace_lock);
mutex_unlock(&dtrace_meta_lock);
- vfree(old->dtm_name);
- vfree(old);
+ kfree(old->dtm_name);
+ kfree(old);
return 0;
}
static uint_t fasttrap_cleanup_state;
static uint_t fasttrap_cleanup_work;
+static struct kmem_cache *tracepoint_cachep;
+
/*
* Generation count on modifications to the global tracepoint lookup table.
*/
*/
rc = dtrace_tracepoint_enable(pid, pc, &new_tp->ftt_mtp);
if (rc != 0) {
- pr_warn("FASTTRAP: Failed to enable tp: rc %d\n", rc);
+ pr_warn("FASTTRAP: Failed to enable tp "
+ "(PID %d, pc %lx): rc %d\n", pid, pc, rc);
rc = FASTTRAP_ENABLE_PARTIAL;
}
static void fasttrap_pid_destroy(void *arg, dtrace_id_t id, void *parg)
{
- /* FIXME */
+ fasttrap_probe_t *probe = parg;
+ int i;
+
+ ASSERT(probe != NULL);
+ ASSERT(!probe->ftp_enabled);
+ ASSERT(atomic_read(&fasttrap_total) >= probe->ftp_ntps);
+
+ atomic_add(-probe->ftp_ntps, &fasttrap_total);
+
+ if (probe->ftp_gen + 1 >= fasttrap_mod_gen)
+ fasttrap_mod_barrier(probe->ftp_gen);
+
+ for (i = 0; i < probe->ftp_ntps; i++)
+ kmem_cache_free(tracepoint_cachep, probe->ftp_tps[i].fit_tp);
+
+ kfree(probe);
}
static const dtrace_pattr_t pid_attr = {
ntps = dhpb->dthpb_noffs + dhpb->dthpb_nenoffs;
ASSERT(ntps > 0);
- pp = vzalloc(offsetof(fasttrap_probe_t, ftp_tps[ntps]));
+ pp = kzalloc(offsetof(fasttrap_probe_t, ftp_tps[ntps]), GFP_KERNEL);
if (pp == NULL) {
pr_warn("Unable to create probe %s: out-of-memory\n",
dhpb->dthpb_name);
atomic_add(ntps, &fasttrap_total);
if (atomic_read(&fasttrap_total) > fasttrap_max) {
- vfree(pp);
+ kfree(pp);
atomic_add(-ntps, &fasttrap_total);
mutex_unlock(&provider->ftp_cmtx);
return;
* First create a tracepoint for each actual point of interest.
*/
for (i = 0; i < dhpb->dthpb_noffs; i++) {
- tp = vzalloc(sizeof(fasttrap_tracepoint_t));
+ tp = kmem_cache_alloc(tracepoint_cachep, GFP_KERNEL);
if (tp == NULL)
goto fail;
tp->ftt_proc = provider->ftp_proc;
tp->ftt_pc = dhpb->dthpb_base + dhpb->dthpb_offs[i];
tp->ftt_pid = provider->ftp_pid;
+ memset(&tp->ftt_mtp, 0, sizeof(fasttrap_machtp_t));
+ tp->ftt_ids = NULL;
+ tp->ftt_retids = NULL;
+ tp->ftt_next = NULL;
dt_dbg_dof(" Tracepoint at 0x%lx (0x%llx + 0x%x)\n",
tp->ftt_pc, dhpb->dthpb_base, dhpb->dthpb_offs[i]);
* Then create a tracepoint for each is-enabled point.
*/
for (j = 0; i < ntps; i++, j++) {
- tp = vzalloc(sizeof(fasttrap_tracepoint_t));
+ tp = kmem_cache_alloc(tracepoint_cachep, GFP_KERNEL);
if (tp == NULL)
goto fail;
tp->ftt_pc = dhpb->dthpb_base + dhpb->dthpb_enoffs[j];
tp->ftt_pid = provider->ftp_pid;
+ tp->ftt_ids = NULL;
+ tp->ftt_retids = NULL;
+ tp->ftt_next = NULL;
+
pp->ftp_tps[i].fit_tp = tp;
pp->ftp_tps[i].fit_id.fti_probe = pp;
pp->ftp_tps[i].fit_id.fti_ptype = DTFTP_IS_ENABLED;
dhpb->dthpb_name);
for (i = 0; i < ntps; i++)
- vfree(pp->ftp_tps[i].fit_tp);
+ kmem_cache_free(tracepoint_cachep, pp->ftp_tps[i].fit_tp);
- vfree(pp);
+ kfree(pp);
atomic_add(-ntps, &fasttrap_total);
mutex_unlock(&provider->ftp_cmtx);
}
mutex_unlock(&bucket->ftb_mtx);
- vfree(fprc);
+ kfree(fprc);
}
static void fasttrap_provider_free(fasttrap_provider_t *provider)
fasttrap_proc_release(provider->ftp_proc);
- vfree(provider);
+ kfree(provider);
unregister_pid_provider(pid);
}
*/
mutex_unlock(&bucket->ftb_mtx);
- new_fprc = vzalloc(sizeof(fasttrap_proc_t));
+ new_fprc = kzalloc(sizeof(fasttrap_proc_t), GFP_KERNEL);
if (new_fprc == NULL)
return NULL;
fprc->ftpc_rcount);
mutex_unlock(&fprc->ftpc_mtx);
- vfree(new_fprc);
+ kfree(new_fprc);
return fprc;
}
if ((proc = fasttrap_proc_lookup(pid)) == NULL)
goto fail;
- if ((new_fp = vzalloc(sizeof(fasttrap_provider_t))) == NULL)
+ if ((new_fp = kzalloc(sizeof(fasttrap_provider_t), GFP_KERNEL)) == NULL)
goto fail;
new_fp->ftp_pid = pid;
*fpp = fp->ftp_next;
fasttrap_provider_free(fp);
- module_put(THIS_MODULE);
- }
+ module_put(THIS_MODULE); }
}
mutex_unlock(&bucket->ftb_mtx);
dtrace_fasttrap_exec_ptr = &fasttrap_exec_exit;
#endif
+ tracepoint_cachep = KMEM_CACHE(fasttrap_tracepoint, 0);
+
fasttrap_max = FASTTRAP_MAX_DEFAULT;
atomic_set(&fasttrap_total, 0);
vfree(fasttrap_procs.fth_table);
fasttrap_procs.fth_nent = 0;
+ kmem_cache_destroy(tracepoint_cachep);
+
#ifdef FIXME
ASSERT(dtrace_fasttrap_exec_ptr == &fasttrap_exec_exit);
dtrace_fasttrap_exec_ptr = NULL;
extern struct mutex dtrace_meta_lock;
extern dtrace_genid_t dtrace_probegen;
+extern struct kmem_cache *dtrace_probe_cachep;
extern dtrace_pops_t dtrace_provider_ops;
extern void dtrace_probe_description(const dtrace_probe_t *,
dtrace_probedesc_t *);
extern void dtrace_probe_provide(dtrace_probedesc_t *, dtrace_provider_t *);
-extern void dtrace_probe_init(void);
+extern int dtrace_probe_init(void);
extern void dtrace_probe_exit(void);
extern void dtrace_probe_remove_id(dtrace_id_t);
extern dtrace_probe_t *dtrace_probe_lookup_id(dtrace_id_t);
-extern dtrace_probe_t *dtrace_probe_get_next(dtrace_id_t);
+extern dtrace_probe_t *dtrace_probe_get_next(dtrace_id_t *);
extern int dtrace_probe_for_each(int (*)(int, void *, void *), void *);
/*
if (dtrace_probe_lookup(profile_id, NULL, NULL, name) != 0)
return;
- prof = vzalloc(sizeof(profile_probe_t));
+ prof = kzalloc(sizeof(profile_probe_t), GFP_KERNEL);
if (prof == NULL) {
pr_warn("Unable to create probe %s: out-of-memory\n", name);
return;
atomic_inc(&profile_total);
if (atomic_read(&profile_total) > profile_max) {
- vfree(prof);
+ kfree(prof);
atomic_dec(&profile_total);
return;
}
profile_probe_t *prof = parg;
ASSERT(prof->prof_cyclic == CYCLIC_NONE);
- vfree(prof);
+ kfree(prof);
ASSERT(atomic_read(&profile_total) >= 1);
atomic_dec(&profile_total);
}
}
- nname = vmalloc(len = strlen(name) + 1);
+ nname = kmalloc(len = strlen(name) + 1, GFP_KERNEL);
if (nname == NULL) {
- pr_warn("Unable to create probe%s: out-of-memory\n",
+ pr_warn("Unable to create probe %s: out-of-memory\n",
name);
continue;
}
nname[i] = '\0';
- sdp = vzalloc(sizeof(sdt_probe_t));
+ sdp = kzalloc(sizeof(sdt_probe_t), GFP_KERNEL);
if (sdp == NULL) {
pr_warn("Unable to create probe %s: out-of-memory\n",
nname);
else
sdt_probetab[ndx] = sdp->sdp_hashnext;
- vfree(sdp->sdp_name);
+ kfree(sdp->sdp_name);
sdp = sdp->sdp_next;
- vfree(old);
+ kfree(old);
}
}
else if (sz > 5 && memcmp(nm, "stub_", 5) == 0)
nm += 5;
- if (dtrace_probe_lookup(syscall_id, NULL, nm, "entry") != 0)
+ if (dtrace_probe_lookup(syscall_id, dtrace_kmod->name, nm,
+ "entry") != 0)
continue;
dtrace_probe_create(syscall_id, dtrace_kmod->name, nm, "entry",