# Use is subject to license terms.
EXTRA_CFLAGS := -I$(src)/include -I$(src)/include/uapi \
- -I$(src)/include/$(ARCH)
+ -I$(src)/include/$(UTS_MACHINE)
obj-$(CONFIG_DT_CORE) += dtrace.o
obj-$(CONFIG_DT_FASTTRAP) += fasttrap.o
obj-$(CONFIG_DT_DT_PERF) += dt_perf.o
dtrace-y := dtrace_mod.o dtrace_dev.o \
- dtrace_asm_$(ARCH).o dtrace_isa_$(ARCH).o \
+ dtrace_asm_$(UTS_MACHINE).o \
+ dtrace_isa_$(UTS_MACHINE).o \
dtrace_actdesc.o dtrace_anon.o \
dtrace_buffer.o dtrace_dif.o dtrace_dof.o \
dtrace_ecb.o dtrace_enable.o \
dtrace_spec.o dtrace_state.o dtrace_util.o
fasttrap-y := fasttrap_mod.o fasttrap_dev.o
profile-y := profile_mod.o profile_dev.o
-sdt-y := sdt_mod.o sdt_dev.o sdt_$(ARCH).o
+sdt-y := sdt_mod.o sdt_dev.o sdt_$(UTS_MACHINE).o
systrace-y := systrace_mod.o systrace_dev.o
dt_test-y := dt_test_mod.o dt_test_dev.o
dt_perf-y := dt_perf_mod.o dt_perf_dev.o
{
}
+void probe_p(dtrace_id_t pid, uintptr_t arg0, uintptr_t arg1, uintptr_t arg2,
+ uintptr_t arg3, uintptr_t arg4, uintptr_t arg5, uintptr_t arg6,
+ uintptr_t arg7, uintptr_t arg8, uintptr_t arg9)
+{
+}
+
/*
* Direct calling into dtrace_probe() when passing more than 5 parameters to
* the probe requires a stub function. Otherwise we may not be able to get
* Not at all...
* But we're doing it anyway...
*/
- void (*probe_fn)() = (void *)&dtrace_probe;
+ typeof(probe_p) *probe_fn = (void *)&dtrace_probe;
probe_fn(pid, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8,
arg9);
{
dtrace_state_t *state;
uint32_t priv;
- uid_t uid;
+ kuid_t uid;
dtrace_cred2priv(file->f_cred, &priv, &uid);
if (priv == DTRACE_PRIV_NONE)
dtrace_probedesc_t desc;
dtrace_probekey_t pkey;
uint32_t priv;
- uid_t uid;
+ kuid_t uid;
dt_dbg_ioctl("IOCTL %s (cmd %#x), argp %p\n",
cmd == DTRACEIOC_PROBES ? "PROBES"
* Additionally, it is safe to dereference one's own process
* credential, since this is never NULL after process birth.
*/
- return (uint64_t)current->real_cred->uid;
+ return (uint64_t)from_kuid(NULL, current_real_cred()->uid);
case DIF_VAR_GID:
if (!dtrace_priv_proc(state))
* Additionally, it is safe to dereference one's own process
* credential, since this is never NULL after process birth.
*/
- return (uint64_t)current->real_cred->gid;
+ return (uint64_t)from_kgid(NULL, current_real_cred()->gid);
case DIF_VAR_ERRNO: {
int64_t arg0;
dtrace_recdesc_t *frec;
dtrace_aggid_t aggid;
dtrace_state_t *state = ecb->dte_state;
- int err;
agg = kzalloc(sizeof(dtrace_aggregation_t), GFP_KERNEL);
if (agg == NULL)
* Get an ID for the aggregation (add it to the idr).
*/
mutex_unlock(&dtrace_lock);
-again:
- idr_pre_get(&state->dts_agg_idr, __GFP_NOFAIL);
+
+ idr_preload(GFP_KERNEL);
mutex_lock(&dtrace_lock);
- err = idr_get_new(&state->dts_agg_idr, agg, &aggid);
- if (err == -EAGAIN) {
- mutex_unlock(&dtrace_lock);
- goto again;
+ aggid = idr_alloc_cyclic(&state->dts_agg_idr, agg, 0, 0, GFP_NOWAIT);
+ idr_preload_end();
+ if (aggid < 0) {
+ /* FIXME: need to handle this */
}
state->dts_naggs++;
dtrace_hash_t *dtrace_byfunc;
dtrace_hash_t *dtrace_byname;
-int dtrace_match_priv(const dtrace_probe_t *prp, uint32_t priv, uid_t uid)
+int dtrace_match_priv(const dtrace_probe_t *prp, uint32_t priv, kuid_t uid)
{
if (priv != DTRACE_PRIV_ALL) {
uint32_t ppriv =
return 0;
if (((ppriv & ~match) & DTRACE_PRIV_OWNER) != 0 &&
- uid != prp->dtpr_provider->dtpv_priv.dtpp_uid)
+ !uid_eq(uid, prp->dtpr_provider->dtpv_priv.dtpp_uid))
return 0;
}
}
int dtrace_match_probe(const dtrace_probe_t *prp, const dtrace_probekey_t *pkp,
- uint32_t priv, uid_t uid)
+ uint32_t priv, kuid_t uid)
{
dtrace_provider_t *pvp = prp->dtpr_provider;
int rv;
struct probe_match {
const dtrace_probekey_t *pkp;
uint32_t priv;
- uid_t uid;
+ kuid_t uid;
int (*matched)(dtrace_probe_t *, void *);
void *arg;
int nmatched;
return 0;
}
-int dtrace_match(const dtrace_probekey_t *pkp, uint32_t priv, uid_t uid,
+int dtrace_match(const dtrace_probekey_t *pkp, uint32_t priv, kuid_t uid,
int (*matched)(dtrace_probe_t *, void *), void *arg)
{
dtrace_probe_t template, *probe;
ASSERT(s_cr != NULL);
if ((cr = current_cred()) != NULL &&
- s_cr->euid == cr->euid &&
- s_cr->euid == cr->uid &&
- s_cr->euid == cr->suid &&
- s_cr->egid == cr->egid &&
- s_cr->egid == cr->gid &&
- s_cr->egid == cr->sgid)
+ uid_eq(s_cr->euid, cr->euid) &&
+ uid_eq(s_cr->euid, cr->uid) &&
+ uid_eq(s_cr->euid, cr->suid) &&
+ gid_eq(s_cr->egid, cr->egid) &&
+ gid_eq(s_cr->egid, cr->gid) &&
+ gid_eq(s_cr->egid, cr->sgid))
return 1;
return 0;
dtrace_probe_t *probe;
dtrace_provider_t *provider = (dtrace_provider_t *)prov;
dtrace_id_t id;
- int err;
probe = kmem_cache_alloc(dtrace_probe_cachep, __GFP_NOFAIL);
/*
- * The idr_pre_get() function should be called without holding locks.
+ * The ir_preload() function should be called without holding locks.
* When the provider is the DTrace core itself, dtrace_lock will be
* held when we enter this function.
*/
mutex_unlock(&dtrace_lock);
}
-again:
- idr_pre_get(&dtrace_probe_idr, __GFP_NOFAIL);
+ idr_preload(GFP_KERNEL);
mutex_lock(&dtrace_lock);
- err = idr_get_new(&dtrace_probe_idr, probe, &id);
- if (err == -EAGAIN) {
- mutex_unlock(&dtrace_lock);
- goto again;
+ id = idr_alloc_cyclic(&dtrace_probe_idr, probe, 0, 0, GFP_NOWAIT);
+ idr_preload_end();
+ if (id < 0) {
+ /* FIXME: Need to handle failure */
}
probe->dtpr_id = id;
{
dtrace_probekey_t pkey;
uint32_t priv;
- uid_t uid;
+ kuid_t uid;
dtrace_ecb_create_cache = NULL;
ASSERT(s_cr != NULL);
if ((cr = current_cred()) == NULL ||
- s_cr->euid != cr->euid ||
- s_cr->euid != cr->uid ||
- s_cr->euid != cr->suid ||
- s_cr->egid != cr->egid ||
- s_cr->egid != cr->gid ||
- s_cr->egid != cr->sgid)
+ !uid_eq(s_cr->euid, cr->euid) ||
+ !uid_eq(s_cr->euid, cr->uid) ||
+ !uid_eq(s_cr->euid, cr->suid) ||
+ !gid_eq(s_cr->egid, cr->egid) ||
+ !gid_eq(s_cr->egid, cr->gid) ||
+ !gid_eq(s_cr->egid, cr->sgid))
continue;
}
}
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)
* being the very first entry. This is used in functionality that runs
* through the list of probes.
*
- * We need to drop our locks when calling idr_pre_get(), so we try to
+ * We need to drop our locks when calling idr_preload(), so we try to
* get them back right after.
*/
-again:
mutex_unlock(&dtrace_lock);
mutex_unlock(&dtrace_provider_lock);
mutex_unlock(&cpu_lock);
- idr_pre_get(&dtrace_probe_idr, __GFP_NOFAIL);
+ idr_preload(GFP_KERNEL);
mutex_lock(&cpu_lock);
mutex_lock(&dtrace_provider_lock);
mutex_lock(&dtrace_lock);
- err = idr_get_new(&dtrace_probe_idr, NULL, &id);
- if (err == -EAGAIN)
- goto again;
+ id = idr_alloc_cyclic(&dtrace_probe_idr, NULL, 0, 0, GFP_NOWAIT);
+ idr_preload_end();
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);
}
pkey.dtpk_id = DTRACE_IDNONE;
mutex_lock(&dtrace_lock);
- match = dtrace_match(&pkey, DTRACE_PRIV_ALL, 0,
+ match = dtrace_match(&pkey, DTRACE_PRIV_ALL, make_kuid(NULL, 0),
dtrace_probe_lookup_match, &id);
mutex_unlock(&dtrace_lock);
provider->dtpv_priv.dtpp_flags = priv;
if (cr != NULL) {
- provider->dtpv_priv.dtpp_uid = get_cred(cr)->uid;
+ provider->dtpv_priv.dtpp_uid =
+ make_kuid(NULL, from_kuid(NULL, get_cred(cr)->uid));
put_cred(cr);
}
#ifdef FIXME
const cred_t *cr = file->f_cred;
#endif
- int err;
dtrace_aggid_t aggid;
ASSERT(MUTEX_HELD(&cpu_lock));
* Create a first entry in the aggregation IDR, so that ID 0 is used as
* that gets used as meaning 'none'.
*/
-again:
mutex_unlock(&dtrace_lock);
mutex_unlock(&cpu_lock);
- idr_pre_get(&state->dts_agg_idr, __GFP_NOFAIL);
+ idr_preload(GFP_KERNEL);
mutex_lock(&cpu_lock);
mutex_lock(&dtrace_lock);
- err = idr_get_new(&state->dts_agg_idr, NULL, &aggid);
- if (err == -EAGAIN)
- goto again;
+ aggid = idr_alloc_cyclic(&state->dts_agg_idr, NULL, 0, 0, GFP_NOWAIT);
+ idr_preload_end();
ASSERT(aggid == 0);
* If there were aggregations allocated, they should have been cleaned
* up by now, so we can get rid of the idr.
*/
- idr_remove_all(&state->dts_agg_idr);
idr_destroy(&state->dts_agg_idr);
vfree(state->dts_buffer);
return 0;
}
-void dtrace_cred2priv(const cred_t *cr, uint32_t *privp, uid_t *uidp)
+void dtrace_cred2priv(const cred_t *cr, uint32_t *privp, kuid_t *uidp)
{
#ifdef FIXME
/*
if (tmp != CLEANUP_NONE) {
mutex_unlock(&fasttrap_cleanup_mtx);
- flush_delayed_work_sync(&fasttrap_cleanup);
+ flush_delayed_work(&fasttrap_cleanup);
mutex_lock(&fasttrap_cleanup_mtx);
}
}
extern dtrace_hash_t *dtrace_byfunc;
extern dtrace_hash_t *dtrace_byname;
-extern int dtrace_match_priv(const dtrace_probe_t *, uint32_t, uid_t);
+extern int dtrace_match_priv(const dtrace_probe_t *, uint32_t, kuid_t);
extern int dtrace_match_probe(const dtrace_probe_t *,
- const dtrace_probekey_t *, uint32_t, uid_t);
+ const dtrace_probekey_t *, uint32_t, kuid_t);
extern int dtrace_match_glob(const char *, const char *, int);
extern int dtrace_match_string(const char *, const char *, int);
extern int dtrace_match_nul(const char *, const char *, int);
extern int dtrace_match_nonzero(const char *, const char *, int);
-extern int dtrace_match(const dtrace_probekey_t *, uint32_t, uid_t,
+extern int dtrace_match(const dtrace_probekey_t *, uint32_t, kuid_t,
int (*matched)(dtrace_probe_t *, void *), void *);
extern void dtrace_probekey(const dtrace_probedesc_t *, dtrace_probekey_t *);
extern size_t dtrace_strlen(const char *, size_t);
extern int dtrace_badattr(const dtrace_attribute_t *);
extern int dtrace_badname(const char *);
-extern void dtrace_cred2priv(const cred_t *, uint32_t *, uid_t *);
+extern void dtrace_cred2priv(const cred_t *, uint32_t *, kuid_t *);
typedef void for_each_module_fn(void *, struct module *);
extern void dtrace_for_each_module(for_each_module_fn *fn, void *arg);
#define MUTEX_HELD(lock) mutex_owned(lock)
#ifdef CONFIG_PREEMPT_VOLUNTARY
-# define dtrace_is_preemptive() (!(preempt_count() & PREEMPT_ACTIVE))
+# define dtrace_is_preemptive() (preempt_count() > 0)
# define dtrace_preempt_off() do { \
- add_preempt_count(PREEMPT_ACTIVE); \
+ preempt_count_inc(); \
barrier(); \
} while (0)
# define dtrace_preempt_on() do { \
- sub_preempt_count(PREEMPT_ACTIVE); \
+ preempt_count_dec(); \
barrier(); \
} while (0)
#endif
* Use is subject to license terms.
*/
+#include <linux/uidgid.h>
#include <linux/dtrace/universal.h>
#include <linux/dtrace/stability_defines.h>
typedef struct dtrace_ppriv {
uint32_t dtpp_flags; /* privilege flags */
- uid_t dtpp_uid; /* user ID */
+ kuid_t dtpp_uid; /* user ID */
} dtrace_ppriv_t;
typedef struct dtrace_attribute {