diff options
Diffstat (limited to 'arch/s390/kernel/perf_cpum_sf.c')
-rw-r--r-- | arch/s390/kernel/perf_cpum_sf.c | 17 |
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 | ||
263 | static void setup_pmc_cpu(void *flags) | 264 | static 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 | ||
304 | static void release_pmc_hardware(void) | 302 | static 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 | ||
312 | static int reserve_pmc_hardware(void) | 311 | static 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; |