aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/perf_cpum_sf.c
diff options
context:
space:
mode:
authorHendrik Brueckner <brueckner@linux.vnet.ibm.com>2013-12-12 10:52:48 -0500
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2013-12-16 08:37:52 -0500
commite28bb79d9935293a8eea5f3c771fde89db645ba7 (patch)
tree0d552a218e87c70ca55b5b103b5ef2a71477d400 /arch/s390/kernel/perf_cpum_sf.c
parent55baa2f831ae4a41da9617ab9e7cef5ebc991ec9 (diff)
s390/perf,oprofile: Share sampling facility
Introduce reserve/release functions to share the sampling facility between perf and oprofile. Also improve error handling for the sampling facility support in perf. Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/perf_cpum_sf.c')
-rw-r--r--arch/s390/kernel/perf_cpum_sf.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c
index 52bf36ee91aa..ae5e0192160d 100644
--- a/arch/s390/kernel/perf_cpum_sf.c
+++ b/arch/s390/kernel/perf_cpum_sf.c
@@ -260,16 +260,12 @@ static int sf_disable(void)
260 260
261#define PMC_INIT 0 261#define PMC_INIT 0
262#define PMC_RELEASE 1 262#define PMC_RELEASE 1
263#define PMC_FAILURE 2
263static void setup_pmc_cpu(void *flags) 264static void setup_pmc_cpu(void *flags)
264{ 265{
265 int err; 266 int err;
266 struct cpu_hw_sf *cpusf = &__get_cpu_var(cpu_hw_sf); 267 struct cpu_hw_sf *cpusf = &__get_cpu_var(cpu_hw_sf);
267 268
268 /* XXX Improve error handling and pass a flag in the *flags
269 * variable to indicate failures. Alternatively, ignore
270 * (print) errors here and let the PMU functions fail if
271 * the per-cpu PMU_F_RESERVED flag is not.
272 */
273 err = 0; 269 err = 0;
274 switch (*((int *) flags)) { 270 switch (*((int *) flags)) {
275 case PMC_INIT: 271 case PMC_INIT:
@@ -299,6 +295,8 @@ static void setup_pmc_cpu(void *flags)
299 "setup_pmc_cpu: released: cpuhw=%p\n", cpusf); 295 "setup_pmc_cpu: released: cpuhw=%p\n", cpusf);
300 break; 296 break;
301 } 297 }
298 if (err)
299 *((int *) flags) |= PMC_FAILURE;
302} 300}
303 301
304static void release_pmc_hardware(void) 302static void release_pmc_hardware(void)
@@ -307,13 +305,22 @@ static void release_pmc_hardware(void)
307 305
308 irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT); 306 irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT);
309 on_each_cpu(setup_pmc_cpu, &flags, 1); 307 on_each_cpu(setup_pmc_cpu, &flags, 1);
308 perf_release_sampling();
310} 309}
311 310
312static int reserve_pmc_hardware(void) 311static int reserve_pmc_hardware(void)
313{ 312{
314 int flags = PMC_INIT; 313 int flags = PMC_INIT;
314 int err;
315 315
316 err = perf_reserve_sampling();
317 if (err)
318 return err;
316 on_each_cpu(setup_pmc_cpu, &flags, 1); 319 on_each_cpu(setup_pmc_cpu, &flags, 1);
320 if (flags & PMC_FAILURE) {
321 release_pmc_hardware();
322 return -ENODEV;
323 }
317 irq_subclass_register(IRQ_SUBCLASS_MEASUREMENT_ALERT); 324 irq_subclass_register(IRQ_SUBCLASS_MEASUREMENT_ALERT);
318 325
319 return 0; 326 return 0;