aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/perf_counter.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/perf_counter.c')
-rw-r--r--kernel/perf_counter.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c
index 8bf997d86bf4..5c6fae4f43d8 100644
--- a/kernel/perf_counter.c
+++ b/kernel/perf_counter.c
@@ -2969,8 +2969,10 @@ static void perf_counter_comm_event(struct perf_comm_event *comm_event)
2969 struct perf_cpu_context *cpuctx; 2969 struct perf_cpu_context *cpuctx;
2970 struct perf_counter_context *ctx; 2970 struct perf_counter_context *ctx;
2971 unsigned int size; 2971 unsigned int size;
2972 char *comm = comm_event->task->comm; 2972 char comm[TASK_COMM_LEN];
2973 2973
2974 memset(comm, 0, sizeof(comm));
2975 strncpy(comm, comm_event->task->comm, sizeof(comm));
2974 size = ALIGN(strlen(comm)+1, sizeof(u64)); 2976 size = ALIGN(strlen(comm)+1, sizeof(u64));
2975 2977
2976 comm_event->comm = comm; 2978 comm_event->comm = comm;
@@ -3089,8 +3091,15 @@ static void perf_counter_mmap_event(struct perf_mmap_event *mmap_event)
3089 char *buf = NULL; 3091 char *buf = NULL;
3090 const char *name; 3092 const char *name;
3091 3093
3094 memset(tmp, 0, sizeof(tmp));
3095
3092 if (file) { 3096 if (file) {
3093 buf = kzalloc(PATH_MAX, GFP_KERNEL); 3097 /*
3098 * d_path works from the end of the buffer backwards, so we
3099 * need to add enough zero bytes after the string to handle
3100 * the 64bit alignment we do later.
3101 */
3102 buf = kzalloc(PATH_MAX + sizeof(u64), GFP_KERNEL);
3094 if (!buf) { 3103 if (!buf) {
3095 name = strncpy(tmp, "//enomem", sizeof(tmp)); 3104 name = strncpy(tmp, "//enomem", sizeof(tmp));
3096 goto got_name; 3105 goto got_name;
@@ -3101,9 +3110,11 @@ static void perf_counter_mmap_event(struct perf_mmap_event *mmap_event)
3101 goto got_name; 3110 goto got_name;
3102 } 3111 }
3103 } else { 3112 } else {
3104 name = arch_vma_name(mmap_event->vma); 3113 if (arch_vma_name(mmap_event->vma)) {
3105 if (name) 3114 name = strncpy(tmp, arch_vma_name(mmap_event->vma),
3115 sizeof(tmp));
3106 goto got_name; 3116 goto got_name;
3117 }
3107 3118
3108 if (!vma->vm_mm) { 3119 if (!vma->vm_mm) {
3109 name = strncpy(tmp, "[vdso]", sizeof(tmp)); 3120 name = strncpy(tmp, "[vdso]", sizeof(tmp));
@@ -3672,7 +3683,7 @@ static const struct pmu perf_ops_task_clock = {
3672void perf_tpcounter_event(int event_id) 3683void perf_tpcounter_event(int event_id)
3673{ 3684{
3674 struct perf_sample_data data = { 3685 struct perf_sample_data data = {
3675 .regs = get_irq_regs(); 3686 .regs = get_irq_regs(),
3676 .addr = 0, 3687 .addr = 0,
3677 }; 3688 };
3678 3689
@@ -3688,16 +3699,12 @@ extern void ftrace_profile_disable(int);
3688 3699
3689static void tp_perf_counter_destroy(struct perf_counter *counter) 3700static void tp_perf_counter_destroy(struct perf_counter *counter)
3690{ 3701{
3691 ftrace_profile_disable(perf_event_id(&counter->attr)); 3702 ftrace_profile_disable(counter->attr.config);
3692} 3703}
3693 3704
3694static const struct pmu *tp_perf_counter_init(struct perf_counter *counter) 3705static const struct pmu *tp_perf_counter_init(struct perf_counter *counter)
3695{ 3706{
3696 int event_id = perf_event_id(&counter->attr); 3707 if (ftrace_profile_enable(counter->attr.config))
3697 int ret;
3698
3699 ret = ftrace_profile_enable(event_id);
3700 if (ret)
3701 return NULL; 3708 return NULL;
3702 3709
3703 counter->destroy = tp_perf_counter_destroy; 3710 counter->destroy = tp_perf_counter_destroy;