mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Shrikanth Hegde <sshegde@linux.ibm.com>
To: Hari Bathini <hbathini@linux.ibm.com>, linuxppc-dev@lists.ozlabs.org
Cc: mpe@ellerman.id.au, npiggin@gmail.com,
	christophe.leroy@csgroup.eu, linux-kernel@vger.kernel.org,
	msuchanek@suse.de, ritesh.list@gmail.com, maddy@linux.ibm.com
Subject: Re: [PATCH] powerpc/ftrace: Don't restore r13 during ftrace_regs_caller
Date: Mon, 21 Sep 2026 12:23:17 +0530	[thread overview]
Message-ID: <8202e4e2-db26-4c9f-88b1-af5f0ffd5421@linux.ibm.com> (raw)
In-Reply-To: <2a1d71ab-dab1-42c8-8c55-f131a4b6e48b@linux.ibm.com>

Hi Hari,

On 9/21/26 12:07 PM, Hari Bathini wrote:
> 
> 
> On 18/09/26 8:38 pm, Shrikanth Hegde wrote:
>> Michal reported a stack-protector failure and subsequent panic when
>> running kernel builds. This was observed with full/lazy preemption.
>> Initially it was suspected as KVM, but later turned out to be due
>> to a bcc tool running in parallel.
>>
>> Issue was recreated using a bcc tool.
>> For example, running below in parallel leads to crash.
>> ./funccount sched* -d 100 and make -j 64
>>
>> The same crash was observed when running kprobe for schedule() function,
>> while simpler function tracer for schedule() didn't cause the crash.
>> This helped to narrow it down to ftrace backed kprobes area.
>>
>> The crash occurs as follows:
>>
>> ftrace_regs_caller entry on CPU A
>>      |
>>      +-> save r13 = CPU A PACA into pt_regs
>>      |
>>      +-> call kprobe_ftrace_handler()
>>              |
>>              +-> ftrace_test_recursion_unlock()
>>                      |
>>                      +-> preempt_enable
>>                      +-> task can schedule and migrate to CPU B
>>                      +-> task resumes with live r13 = CPU B PACA
>>      |
>>      +-> REST_GPRS(2, 31)
>>              |
>>              +-> restore saved r13 = CPU A PACA
>>      |
>>      |-> The task then continues running on CPU B with r13 pointing
>>      |   to CPU A's PACA.
>>
>> The stack-protector canary is accessed through the PACA. After the task
>> migrates, CPU A may run a different task and update its PACA with that
>> task's canary. Restoring the saved r13 then causes the migrated task's
>> saved stack canary to be compared against the canary in CPU A's PACA,
>> resulting in a stack-protector failure.
>>
>> Similarly, current is resolved through the PACA. With a stale r13,
>> preempt_count() can access the state of the task referenced by CPU A's
>> PACA instead of the task running on CPU B. This results in corrupted
>> preempt-count warnings and scheduling-while-atomic failures.
>>
>> This path for example is called when using kprobes and parallel kernel builds
>> can cause preemptions during ftrace_test_recursion_unlock.
>>
>> Do not restore r13 from the saved register frame. If the task did not
>> migrate, the live r13 already has the saved value. If it migrated, the
>> live r13 contains the correct PACA pointer for the CPU on which the task
>> resumed.
>>
> 
> Looks good to me except for a minor nit below.
> 
> Reviewed-by: Hari Bathini <hbathini@linux.ibm.com>
> 
>> Fixes: 153086644fd1 ("powerpc/ftrace: Add support for -mprofile-kernel ftrace ABI")
>> Reported-by: Michal Suchánek <msuchanek@suse.de>
>> Closes: https://lore.kernel.org/all/aqKfsVArHHaIK6M9@kunlun.suse.cz/
>> Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com>
>> ---
>> PS:
>> Fixes is the initial commit that introduced this restore regs almost
>> 10 years ago, all commit afterwords are code refactors changing the
>> code layout. Also backporting all the way maybe tricky.
>> Backport can easily happen till aebd1fb45c622.
>>
>>   arch/powerpc/kernel/trace/ftrace_entry.S | 4 +++-
>>   1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/powerpc/kernel/trace/ftrace_entry.S b/arch/powerpc/kernel/trace/ftrace_entry.S
>> index 6599fe3c6234..54c8727b48cd 100644
>> --- a/arch/powerpc/kernel/trace/ftrace_entry.S
>> +++ b/arch/powerpc/kernel/trace/ftrace_entry.S
>> @@ -220,7 +220,9 @@
>>       /* Restore gprs */
>>       .if \allregs == 1
> 
>> -    REST_GPRS(2, 31, r1)
>> +    REST_GPRS(2, 12, r1)
>> +    /* Do not restore a stale PACA pointer if the task migrated */
>> +    REST_GPRS(14, 31, r1)
> 
> Given that r13 is not paca on ppc32, shouldn't the above change
> only apply to PPC64?

Yes. Good catch. Will make the above change only for PPC64.

Thanks for reviewing.

>>       .else
>>       REST_GPRS(3, 10, r1)
>>   #if defined(CONFIG_LIVEPATCH_64) || defined(CONFIG_PPC_FTRACE_OUT_OF_LINE)
> 
> - Hari
> 


      reply	other threads:[~2026-09-21  6:53 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-18 15:08 Shrikanth Hegde
2026-09-19  6:11 ` Christophe Leroy (CS GROUP)
2026-09-21  6:37 ` Hari Bathini
2026-09-21  6:53   ` Shrikanth Hegde [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8202e4e2-db26-4c9f-88b1-af5f0ffd5421@linux.ibm.com \
    --to=sshegde@linux.ibm.com \
    --cc=christophe.leroy@csgroup.eu \
    --cc=hbathini@linux.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=maddy@linux.ibm.com \
    --cc=mpe@ellerman.id.au \
    --cc=msuchanek@suse.de \
    --cc=npiggin@gmail.com \
    --cc=ritesh.list@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®