Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

oprofile, perf: Use per-cpu framework

This changes oprofile_perf.c to use the per-cpu framework.

Using the per-cpu framework should avoid error like the following:

arch/arm/oprofile/../../../drivers/oprofile/oprofile_perf.c:28:28: error: variably modified 'perf_events' at file scope

Reported-by: William Cohen <wcohen@redhat.com>
Cc: Will Deacon <will.deacon@arm.com>
Signed-off-by: Robert Richter <robert.richter@amd.com>

+11 -12
+11 -12
drivers/oprofile/oprofile_perf.c
··· 1 1 /* 2 2 * Copyright 2010 ARM Ltd. 3 + * Copyright 2012 Advanced Micro Devices, Inc., Robert Richter 3 4 * 4 5 * Perf-events backend for OProfile. 5 6 */ ··· 26 25 static DEFINE_MUTEX(oprofile_perf_mutex); 27 26 28 27 static struct op_counter_config *counter_config; 29 - static struct perf_event **perf_events[NR_CPUS]; 28 + static DEFINE_PER_CPU(struct perf_event **, perf_events); 30 29 static int num_counters; 31 30 32 31 /* ··· 39 38 u32 cpu = smp_processor_id(); 40 39 41 40 for (id = 0; id < num_counters; ++id) 42 - if (perf_events[cpu][id] == event) 41 + if (per_cpu(perf_events, cpu)[id] == event) 43 42 break; 44 43 45 44 if (id != num_counters) ··· 75 74 { 76 75 struct perf_event *pevent; 77 76 78 - if (!counter_config[event].enabled || perf_events[cpu][event]) 77 + if (!counter_config[event].enabled || per_cpu(perf_events, cpu)[event]) 79 78 return 0; 80 79 81 80 pevent = perf_event_create_kernel_counter(&counter_config[event].attr, ··· 92 91 return -EBUSY; 93 92 } 94 93 95 - perf_events[cpu][event] = pevent; 94 + per_cpu(perf_events, cpu)[event] = pevent; 96 95 97 96 return 0; 98 97 } 99 98 100 99 static void op_destroy_counter(int cpu, int event) 101 100 { 102 - struct perf_event *pevent = perf_events[cpu][event]; 101 + struct perf_event *pevent = per_cpu(perf_events, cpu)[event]; 103 102 104 103 if (pevent) { 105 104 perf_event_release_kernel(pevent); 106 - perf_events[cpu][event] = NULL; 105 + per_cpu(perf_events, cpu)[event] = NULL; 107 106 } 108 107 } 109 108 ··· 258 257 259 258 for_each_possible_cpu(cpu) { 260 259 for (id = 0; id < num_counters; ++id) { 261 - event = perf_events[cpu][id]; 260 + event = per_cpu(perf_events, cpu)[id]; 262 261 if (event) 263 262 perf_event_release_kernel(event); 264 263 } 265 264 266 - kfree(perf_events[cpu]); 265 + kfree(per_cpu(perf_events, cpu)); 267 266 } 268 267 269 268 kfree(counter_config); ··· 277 276 ret = init_driverfs(); 278 277 if (ret) 279 278 return ret; 280 - 281 - memset(&perf_events, 0, sizeof(perf_events)); 282 279 283 280 num_counters = perf_num_counters(); 284 281 if (num_counters <= 0) { ··· 297 298 } 298 299 299 300 for_each_possible_cpu(cpu) { 300 - perf_events[cpu] = kcalloc(num_counters, 301 + per_cpu(perf_events, cpu) = kcalloc(num_counters, 301 302 sizeof(struct perf_event *), GFP_KERNEL); 302 - if (!perf_events[cpu]) { 303 + if (!per_cpu(perf_events, cpu)) { 303 304 pr_info("oprofile: failed to allocate %d perf events " 304 305 "for cpu %d\n", num_counters, cpu); 305 306 ret = -ENOMEM;