aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/cpu/perf_event_p4.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/perf_event_p4.c b/arch/x86/kernel/cpu/perf_event_p4.c
index b8c2d379eea..a603930271f 100644
--- a/arch/x86/kernel/cpu/perf_event_p4.c
+++ b/arch/x86/kernel/cpu/perf_event_p4.c
@@ -418,6 +418,7 @@ static int p4_hw_config(struct perf_event *event)
418{ 418{
419 int cpu = get_cpu(); 419 int cpu = get_cpu();
420 int rc = 0; 420 int rc = 0;
421 unsigned int evnt;
421 u32 escr, cccr; 422 u32 escr, cccr;
422 423
423 /* 424 /*
@@ -436,6 +437,14 @@ static int p4_hw_config(struct perf_event *event)
436 event->hw.config = p4_set_ht_bit(event->hw.config); 437 event->hw.config = p4_set_ht_bit(event->hw.config);
437 438
438 if (event->attr.type == PERF_TYPE_RAW) { 439 if (event->attr.type == PERF_TYPE_RAW) {
440
441 /* user data may have out-of-bound event index */
442 evnt = p4_config_unpack_event(event->attr.config);
443 if (evnt >= ARRAY_SIZE(p4_event_bind_map)) {
444 rc = -EINVAL;
445 goto out;
446 }
447
439 /* 448 /*
440 * We don't control raw events so it's up to the caller 449 * We don't control raw events so it's up to the caller
441 * to pass sane values (and we don't count the thread number 450 * to pass sane values (and we don't count the thread number
@@ -451,8 +460,8 @@ static int p4_hw_config(struct perf_event *event)
451 } 460 }
452 461
453 rc = x86_setup_perfctr(event); 462 rc = x86_setup_perfctr(event);
463out:
454 put_cpu(); 464 put_cpu();
455
456 return rc; 465 return rc;
457} 466}
458 467