Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/dev/profile/profile.c
Show First 20 Lines • Show All 149 Lines • ▼ Show 20 Lines | typedef struct profile_probe_percpu { | ||||
hrtime_t profc_expected; | hrtime_t profc_expected; | ||||
hrtime_t profc_interval; | hrtime_t profc_interval; | ||||
profile_probe_t *profc_probe; | profile_probe_t *profc_probe; | ||||
#ifdef __FreeBSD__ | #ifdef __FreeBSD__ | ||||
struct callout profc_cyclic; | struct callout profc_cyclic; | ||||
#endif | #endif | ||||
} profile_probe_percpu_t; | } profile_probe_percpu_t; | ||||
static d_open_t profile_open; | |||||
static int profile_unload(void); | static int profile_unload(void); | ||||
static void profile_create(hrtime_t, char *, int); | static void profile_create(hrtime_t, char *, int); | ||||
static void profile_destroy(void *, dtrace_id_t, void *); | static void profile_destroy(void *, dtrace_id_t, void *); | ||||
static void profile_enable(void *, dtrace_id_t, void *); | static void profile_enable(void *, dtrace_id_t, void *); | ||||
static void profile_disable(void *, dtrace_id_t, void *); | static void profile_disable(void *, dtrace_id_t, void *); | ||||
static void profile_load(void *); | static void profile_load(void *); | ||||
static void profile_provide(void *, dtrace_probedesc_t *); | static void profile_provide(void *, dtrace_probedesc_t *); | ||||
Show All 17 Lines | |||||
* this gets its value from PROFILE_MAX_DEFAULT or profile-max-probes if it's | * this gets its value from PROFILE_MAX_DEFAULT or profile-max-probes if it's | ||||
* present in the profile.conf file. | * present in the profile.conf file. | ||||
*/ | */ | ||||
#define PROFILE_MAX_DEFAULT 1000 /* default max. number of probes */ | #define PROFILE_MAX_DEFAULT 1000 /* default max. number of probes */ | ||||
static uint32_t profile_max = PROFILE_MAX_DEFAULT; | static uint32_t profile_max = PROFILE_MAX_DEFAULT; | ||||
/* maximum number of profile probes */ | /* maximum number of profile probes */ | ||||
static uint32_t profile_total; /* current number of profile probes */ | static uint32_t profile_total; /* current number of profile probes */ | ||||
static struct cdevsw profile_cdevsw = { | |||||
.d_version = D_VERSION, | |||||
.d_open = profile_open, | |||||
.d_name = "profile", | |||||
}; | |||||
static dtrace_pattr_t profile_attr = { | static dtrace_pattr_t profile_attr = { | ||||
{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, | { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, | ||||
{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, | { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, | ||||
{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, | { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, | ||||
{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, | { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON }, | ||||
{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, | { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, | ||||
}; | }; | ||||
static dtrace_pops_t profile_pops = { | static dtrace_pops_t profile_pops = { | ||||
.dtps_provide = profile_provide, | .dtps_provide = profile_provide, | ||||
.dtps_provide_module = NULL, | .dtps_provide_module = NULL, | ||||
.dtps_enable = profile_enable, | .dtps_enable = profile_enable, | ||||
.dtps_disable = profile_disable, | .dtps_disable = profile_disable, | ||||
.dtps_suspend = NULL, | .dtps_suspend = NULL, | ||||
.dtps_resume = NULL, | .dtps_resume = NULL, | ||||
.dtps_getargdesc = NULL, | .dtps_getargdesc = NULL, | ||||
.dtps_getargval = NULL, | .dtps_getargval = NULL, | ||||
.dtps_usermode = NULL, | .dtps_usermode = NULL, | ||||
.dtps_destroy = profile_destroy | .dtps_destroy = profile_destroy | ||||
}; | }; | ||||
static struct cdev *profile_cdev; | |||||
static dtrace_provider_id_t profile_id; | static dtrace_provider_id_t profile_id; | ||||
static hrtime_t profile_interval_min = NANOSEC / 5000; /* 5000 hz */ | static hrtime_t profile_interval_min = NANOSEC / 5000; /* 5000 hz */ | ||||
static int profile_aframes = PROF_ARTIFICIAL_FRAMES; | static int profile_aframes = PROF_ARTIFICIAL_FRAMES; | ||||
SYSCTL_DECL(_kern_dtrace); | SYSCTL_DECL(_kern_dtrace); | ||||
SYSCTL_NODE(_kern_dtrace, OID_AUTO, profile, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, | SYSCTL_NODE(_kern_dtrace, OID_AUTO, profile, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, | ||||
"DTrace profile parameters"); | "DTrace profile parameters"); | ||||
SYSCTL_INT(_kern_dtrace_profile, OID_AUTO, aframes, CTLFLAG_RW, &profile_aframes, | SYSCTL_INT(_kern_dtrace_profile, OID_AUTO, aframes, CTLFLAG_RW, &profile_aframes, | ||||
▲ Show 20 Lines • Show All 405 Lines • ▼ Show 20 Lines | if (prof->prof_kind == PROF_TICK) { | ||||
profile_disable_omni(prof); | profile_disable_omni(prof); | ||||
} | } | ||||
} | } | ||||
#endif | #endif | ||||
static void | static void | ||||
profile_load(void *dummy) | profile_load(void *dummy) | ||||
{ | { | ||||
/* Create the /dev/dtrace/profile entry. */ | |||||
profile_cdev = make_dev(&profile_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, | |||||
"dtrace/profile"); | |||||
if (dtrace_register("profile", &profile_attr, DTRACE_PRIV_USER, | if (dtrace_register("profile", &profile_attr, DTRACE_PRIV_USER, | ||||
NULL, &profile_pops, NULL, &profile_id) != 0) | NULL, &profile_pops, NULL, &profile_id) != 0) | ||||
return; | return; | ||||
} | } | ||||
static int | static int | ||||
profile_unload() | profile_unload() | ||||
{ | { | ||||
int error = 0; | int error = 0; | ||||
if ((error = dtrace_unregister(profile_id)) != 0) | if ((error = dtrace_unregister(profile_id)) != 0) | ||||
return (error); | return (error); | ||||
destroy_dev(profile_cdev); | |||||
return (error); | return (error); | ||||
} | } | ||||
/* ARGSUSED */ | /* ARGSUSED */ | ||||
static int | static int | ||||
profile_modevent(module_t mod __unused, int type, void *data __unused) | profile_modevent(module_t mod __unused, int type, void *data __unused) | ||||
{ | { | ||||
int error = 0; | int error = 0; | ||||
Show All 9 Lines | case MOD_SHUTDOWN: | ||||
break; | break; | ||||
default: | default: | ||||
error = EOPNOTSUPP; | error = EOPNOTSUPP; | ||||
break; | break; | ||||
} | } | ||||
return (error); | return (error); | ||||
} | |||||
/* ARGSUSED */ | |||||
static int | |||||
profile_open(struct cdev *dev __unused, int oflags __unused, int devtype __unused, struct thread *td __unused) | |||||
{ | |||||
return (0); | |||||
} | } | ||||
SYSINIT(profile_load, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, profile_load, NULL); | SYSINIT(profile_load, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, profile_load, NULL); | ||||
SYSUNINIT(profile_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, profile_unload, NULL); | SYSUNINIT(profile_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, profile_unload, NULL); | ||||
DEV_MODULE(profile, profile_modevent, NULL); | DEV_MODULE(profile, profile_modevent, NULL); | ||||
MODULE_VERSION(profile, 1); | MODULE_VERSION(profile, 1); | ||||
MODULE_DEPEND(profile, dtrace, 1, 1, 1); | MODULE_DEPEND(profile, dtrace, 1, 1, 1); | ||||
MODULE_DEPEND(profile, opensolaris, 1, 1, 1); | MODULE_DEPEND(profile, opensolaris, 1, 1, 1); |