diff options
Diffstat (limited to 'kernel/profile.c')
| -rw-r--r-- | kernel/profile.c | 46 | 
1 files changed, 26 insertions, 20 deletions
diff --git a/kernel/profile.c b/kernel/profile.c index 6631e1ef55a..54bf5ba2642 100644 --- a/kernel/profile.c +++ b/kernel/profile.c @@ -52,9 +52,9 @@ static DEFINE_MUTEX(profile_flip_mutex);  int profile_setup(char *str)  { -	static char schedstr[] = "schedule"; -	static char sleepstr[] = "sleep"; -	static char kvmstr[] = "kvm"; +	static const char schedstr[] = "schedule"; +	static const char sleepstr[] = "sleep"; +	static const char kvmstr[] = "kvm";  	int par;  	if (!strncmp(str, sleepstr, strlen(sleepstr))) { @@ -64,12 +64,10 @@ int profile_setup(char *str)  			str += strlen(sleepstr) + 1;  		if (get_option(&str, &par))  			prof_shift = par; -		printk(KERN_INFO -			"kernel sleep profiling enabled (shift: %ld)\n", +		pr_info("kernel sleep profiling enabled (shift: %ld)\n",  			prof_shift);  #else -		printk(KERN_WARNING -			"kernel sleep profiling requires CONFIG_SCHEDSTATS\n"); +		pr_warn("kernel sleep profiling requires CONFIG_SCHEDSTATS\n");  #endif /* CONFIG_SCHEDSTATS */  	} else if (!strncmp(str, schedstr, strlen(schedstr))) {  		prof_on = SCHED_PROFILING; @@ -77,8 +75,7 @@ int profile_setup(char *str)  			str += strlen(schedstr) + 1;  		if (get_option(&str, &par))  			prof_shift = par; -		printk(KERN_INFO -			"kernel schedule profiling enabled (shift: %ld)\n", +		pr_info("kernel schedule profiling enabled (shift: %ld)\n",  			prof_shift);  	} else if (!strncmp(str, kvmstr, strlen(kvmstr))) {  		prof_on = KVM_PROFILING; @@ -86,13 +83,12 @@ int profile_setup(char *str)  			str += strlen(kvmstr) + 1;  		if (get_option(&str, &par))  			prof_shift = par; -		printk(KERN_INFO -			"kernel KVM profiling enabled (shift: %ld)\n", +		pr_info("kernel KVM profiling enabled (shift: %ld)\n",  			prof_shift);  	} else if (get_option(&str, &par)) {  		prof_shift = par;  		prof_on = CPU_PROFILING; -		printk(KERN_INFO "kernel profiling enabled (shift: %ld)\n", +		pr_info("kernel profiling enabled (shift: %ld)\n",  			prof_shift);  	}  	return 1; @@ -549,14 +545,14 @@ static int create_hash_tables(void)  		struct page *page;  		page = alloc_pages_exact_node(node, -				GFP_KERNEL | __GFP_ZERO | GFP_THISNODE, +				GFP_KERNEL | __GFP_ZERO | __GFP_THISNODE,  				0);  		if (!page)  			goto out_cleanup;  		per_cpu(cpu_profile_hits, cpu)[1]  				= (struct profile_hit *)page_address(page);  		page = alloc_pages_exact_node(node, -				GFP_KERNEL | __GFP_ZERO | GFP_THISNODE, +				GFP_KERNEL | __GFP_ZERO | __GFP_THISNODE,  				0);  		if (!page)  			goto out_cleanup; @@ -591,18 +587,28 @@ out_cleanup:  int __ref create_proc_profile(void) /* false positive from hotcpu_notifier */  {  	struct proc_dir_entry *entry; +	int err = 0;  	if (!prof_on)  		return 0; -	if (create_hash_tables()) -		return -ENOMEM; + +	cpu_notifier_register_begin(); + +	if (create_hash_tables()) { +		err = -ENOMEM; +		goto out; +	} +  	entry = proc_create("profile", S_IWUSR | S_IRUGO,  			    NULL, &proc_profile_operations);  	if (!entry) -		return 0; +		goto out;  	proc_set_size(entry, (1 + prof_len) * sizeof(atomic_t)); -	hotcpu_notifier(profile_cpu_callback, 0); -	return 0; +	__hotcpu_notifier(profile_cpu_callback, 0); + +out: +	cpu_notifier_register_done(); +	return err;  } -module_init(create_proc_profile); +subsys_initcall(create_proc_profile);  #endif /* CONFIG_PROC_FS */  | 
