powerpc/perf: Fix loop exit condition in nest_imc_event_init
authorAnju T Sudhakar <anju@linux.vnet.ibm.com>
Tue, 18 Dec 2018 06:20:41 +0000 (11:50 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 2 May 2019 16:54:59 +0000 (02:54 +1000)
The data structure (i.e struct imc_mem_info) to hold the memory address
information for nest imc units is allocated based on the number of nodes
in the system.

nest_imc_event_init() traverse this struct array to calculate the memory
base address for the event-cpu. If we fail to find a match for the event
cpu's chip-id in imc_mem_info struct array, then the do-while loop will
iterate until we crash.

Fix this by changing the loop exit condition based on the number of
non zero vbase elements in the array, since the allocation is done for
nr_chips + 1.

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Fixes: 885dcd709ba91 ("powerpc/perf: Add nest IMC PMU support")
Signed-off-by: Anju T Sudhakar <anju@linux.vnet.ibm.com>
Reviewed-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/perf/imc-pmu.c
arch/powerpc/platforms/powernv/opal-imc.c

index 6159e9edddfd0941b5b1e1aae0790edbd60ca536..2d12f0037e3a541b8e35814cad7d1820ebef9fac 100644 (file)
@@ -499,7 +499,7 @@ static int nest_imc_event_init(struct perf_event *event)
                        break;
                }
                pcni++;
-       } while (pcni);
+       } while (pcni->vbase != 0);
 
        if (!flag)
                return -ENODEV;
index 58a07948c76e783bdcd9eb14deb527bdb08508d6..3d27f02695e41fc5942cf978478d25dcbea46f8b 100644 (file)
@@ -127,7 +127,7 @@ static int imc_get_mem_addr_nest(struct device_node *node,
                                                                nr_chips))
                goto error;
 
-       pmu_ptr->mem_info = kcalloc(nr_chips, sizeof(*pmu_ptr->mem_info),
+       pmu_ptr->mem_info = kcalloc(nr_chips + 1, sizeof(*pmu_ptr->mem_info),
                                    GFP_KERNEL);
        if (!pmu_ptr->mem_info)
                goto error;