[PATCH v6 1/3] perf/core: Fix NULL pmu_ctx passed to pmu->sched_task()

Puranjay Mohan <[email protected]>
Newsgroups gmane.linux.kernel.bpf,gmane.linux.kernel.perf.user,gmane.linux.ports.arm.kernel,gmane.linux.kernel,gmane.linux.kernel.stable
Message-ID <[email protected]>
perf_pmu_sched_task() returns early when cpuctx->task_ctx is set, and
cpc->task_epc is only non-NULL while a task context is scheduled in on
this CPU. __perf_pmu_sched_task() therefore always passes NULL:

  Unable to handle kernel NULL pointer dereference at virtual address 00
  pc : armv8pmu_sched_task+0x14/0x50
  Call trace:
   armv8pmu_sched_task+0x14/0x50 (P)
   perf_pmu_sched_task+0xac/0x108
   __perf_event_task_sched_out+0x6c/0xe0

Pass &cpc->epc instead. __perf_init_event_pmu_context() sets its ->pmu
when the PMU is registered; ->ctx stays NULL until a CPU-wide event
attaches. That is enough here because armv8pmu_sched_task() is the only
in-tree implementation that dereferences the argument at all, and it
only reads ->pmu. The oops therefore needs BRBE, which arrived in v6.17.

Fixes: bd2756811766 ("perf: Rewrite core context handling")
Cc: [email protected]
Acked-by: Usama Arif <[email protected]>
Signed-off-by: Puranjay Mohan <[email protected]>
---
 kernel/events/core.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/events/core.c b/kernel/events/core.c
index b282de3e7d7ca..9815894b67e77 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3907,7 +3907,8 @@ static void __perf_pmu_sched_task(struct perf_cpu_pmu_context *cpc,
 	perf_ctx_lock(cpuctx, cpuctx->task_ctx);
 	perf_pmu_disable(pmu);
 
-	pmu->sched_task(cpc->task_epc, task, sched_in);
+	pmu->sched_task(cpc->task_epc ? cpc->task_epc : &cpc->epc,
+			task, sched_in);
 
 	perf_pmu_enable(pmu);
 	perf_ctx_unlock(cpuctx, cpuctx->task_ctx);
-- 
2.53.0-Meta
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.