perf_counter/powerpc: Check oprofile_cpu_type for NULL before using it
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 6 Aug 2009 11:16:44 +0000 (21:16 +1000)
committerIngo Molnar <mingo@elte.hu>
Thu, 6 Aug 2009 11:55:09 +0000 (13:55 +0200)
If the current CPU doesn't support performance counters,
cur_cpu_spec->oprofile_cpu_type can be NULL. The current
perf_counter modules don't test for that case and would thus
crash at boot time.

Bug reported by David Woodhouse.

Reported-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Paul Mackerras <paulus@samba.org>
LKML-Reference: <19066.48028.446975.501454@cargo.ozlabs.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/powerpc/kernel/mpc7450-pmu.c
arch/powerpc/kernel/power4-pmu.c
arch/powerpc/kernel/power5+-pmu.c
arch/powerpc/kernel/power5-pmu.c
arch/powerpc/kernel/power6-pmu.c
arch/powerpc/kernel/power7-pmu.c
arch/powerpc/kernel/ppc970-pmu.c

index c244133c67a67bcdd1591b9049f7487e78974b22..cc466d039af6c8ec2a3984c2597dc6cceae2da67 100644 (file)
@@ -407,7 +407,8 @@ struct power_pmu mpc7450_pmu = {
 
 static int init_mpc7450_pmu(void)
 {
-       if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/7450"))
+       if (!cur_cpu_spec->oprofile_cpu_type ||
+           strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/7450"))
                return -ENODEV;
 
        return register_power_pmu(&mpc7450_pmu);
index db90b0c5c27bbc05f9d66dc8a70c18f108e9ecf3..3c90a3d9173e47a60109312be18603851e163c28 100644 (file)
@@ -606,7 +606,8 @@ static struct power_pmu power4_pmu = {
 
 static int init_power4_pmu(void)
 {
-       if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power4"))
+       if (!cur_cpu_spec->oprofile_cpu_type ||
+           strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power4"))
                return -ENODEV;
 
        return register_power_pmu(&power4_pmu);
index f4adca8e98a423a92941ad00c83ab6c174a7484e..31918af3e3553d551e9870fb2d4060727dab75f5 100644 (file)
@@ -678,8 +678,9 @@ static struct power_pmu power5p_pmu = {
 
 static int init_power5p_pmu(void)
 {
-       if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5+")
-           && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5++"))
+       if (!cur_cpu_spec->oprofile_cpu_type ||
+           (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5+")
+            && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5++")))
                return -ENODEV;
 
        return register_power_pmu(&power5p_pmu);
index 29b2c6c0e83a2a37b582fe1e98a986ff0daefaba..867f6f663963d411dfc654ddc72caf198d0ed5cb 100644 (file)
@@ -618,7 +618,8 @@ static struct power_pmu power5_pmu = {
 
 static int init_power5_pmu(void)
 {
-       if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5"))
+       if (!cur_cpu_spec->oprofile_cpu_type ||
+           strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5"))
                return -ENODEV;
 
        return register_power_pmu(&power5_pmu);
index 09ae5bf5bda78fb86b64b1d14d44f9722b63b9a6..fa21890531da732cf466e11869ff69d028188324 100644 (file)
@@ -537,7 +537,8 @@ static struct power_pmu power6_pmu = {
 
 static int init_power6_pmu(void)
 {
-       if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power6"))
+       if (!cur_cpu_spec->oprofile_cpu_type ||
+           strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power6"))
                return -ENODEV;
 
        return register_power_pmu(&power6_pmu);
index 5a9f5cbd40a48e9c19c4afaae64e86a57fd5c18d..388cf57ad827b8d187c49dc34eb0ec8deaf48db5 100644 (file)
@@ -366,7 +366,8 @@ static struct power_pmu power7_pmu = {
 
 static int init_power7_pmu(void)
 {
-       if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power7"))
+       if (!cur_cpu_spec->oprofile_cpu_type ||
+           strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power7"))
                return -ENODEV;
 
        return register_power_pmu(&power7_pmu);
index 833097ac45dc4aad00e7e3e8d43b060efccada77..75dccb71a04337fc3f26dd0902de37e279886651 100644 (file)
@@ -488,8 +488,9 @@ static struct power_pmu ppc970_pmu = {
 
 static int init_ppc970_pmu(void)
 {
-       if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970")
-           && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970MP"))
+       if (!cur_cpu_spec->oprofile_cpu_type ||
+           (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970")
+            && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970MP")))
                return -ENODEV;
 
        return register_power_pmu(&ppc970_pmu);