| From 2eed6b0b9d3391d4d144f50c7b26659c2ac8fe57 Mon Sep 17 00:00:00 2001 |
| From: Anju T Sudhakar <anju@linux.vnet.ibm.com> |
| Date: Tue, 18 Dec 2018 11:50:41 +0530 |
| Subject: powerpc/perf: Fix loop exit condition in nest_imc_event_init |
| |
| [ Upstream commit 860b7d2286236170a36f94946d03ca9888d32571 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/perf/imc-pmu.c | 2 +- |
| arch/powerpc/platforms/powernv/opal-imc.c | 2 +- |
| 2 files changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/arch/powerpc/perf/imc-pmu.c b/arch/powerpc/perf/imc-pmu.c |
| index 6159e9edddfd0..2d12f0037e3a5 100644 |
| --- a/arch/powerpc/perf/imc-pmu.c |
| +++ b/arch/powerpc/perf/imc-pmu.c |
| @@ -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; |
| diff --git a/arch/powerpc/platforms/powernv/opal-imc.c b/arch/powerpc/platforms/powernv/opal-imc.c |
| index 58a07948c76e7..3d27f02695e41 100644 |
| --- a/arch/powerpc/platforms/powernv/opal-imc.c |
| +++ b/arch/powerpc/platforms/powernv/opal-imc.c |
| @@ -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; |
| -- |
| 2.20.1 |
| |