diff options
Diffstat (limited to 'kernel/ksysfs.c')
| -rw-r--r-- | kernel/ksysfs.c | 35 | 
1 files changed, 35 insertions, 0 deletions
diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c index e53bc30e9ba..08dd8ed86c7 100644 --- a/kernel/ksysfs.c +++ b/kernel/ksysfs.c @@ -14,6 +14,7 @@  #include <linux/module.h>  #include <linux/init.h>  #include <linux/kexec.h> +#include <linux/profile.h>  #include <linux/sched.h>  #define KERNEL_ATTR_RO(_name) \ @@ -53,6 +54,37 @@ static ssize_t uevent_helper_store(struct kobject *kobj,  KERNEL_ATTR_RW(uevent_helper);  #endif +#ifdef CONFIG_PROFILING +static ssize_t profiling_show(struct kobject *kobj, +				  struct kobj_attribute *attr, char *buf) +{ +	return sprintf(buf, "%d\n", prof_on); +} +static ssize_t profiling_store(struct kobject *kobj, +				   struct kobj_attribute *attr, +				   const char *buf, size_t count) +{ +	int ret; + +	if (prof_on) +		return -EEXIST; +	/* +	 * This eventually calls into get_option() which +	 * has a ton of callers and is not const.  It is +	 * easiest to cast it away here. +	 */ +	profile_setup((char *)buf); +	ret = profile_init(); +	if (ret) +		return ret; +	ret = create_proc_profile(); +	if (ret) +		return ret; +	return count; +} +KERNEL_ATTR_RW(profiling); +#endif +  #ifdef CONFIG_KEXEC  static ssize_t kexec_loaded_show(struct kobject *kobj,  				 struct kobj_attribute *attr, char *buf) @@ -109,6 +141,9 @@ static struct attribute * kernel_attrs[] = {  	&uevent_seqnum_attr.attr,  	&uevent_helper_attr.attr,  #endif +#ifdef CONFIG_PROFILING +	&profiling_attr.attr, +#endif  #ifdef CONFIG_KEXEC  	&kexec_loaded_attr.attr,  	&kexec_crash_loaded_attr.attr,  |