Question about earlier dynamic ftrace implementation with interrupt

Juhan Jin juhan.jin at foxmail.com
Wed Jul 30 17:57:58 PDT 2025


I was looking at earlier dynamic ftrace implementation which used 
stop_machine for text patching, and I have a question about interrupt
occurred between patched instructions.

Let's use commit 6724a76cff85 (riscv: ftrace: Reduce the detour code 
size to half, 2023-01-12) as code base. This commit places 2 4-byte
NOPs at the start of each function. These NOPs can be patched to 
AUIPC t0, imm and JALR t0, t0(imm) to enable function tracer.

Say we want to enable function tracer for kernel function `func`.
Consider the following scenario: 

- Before enabling `func` for function tracer, its first 2 instructions
  are NOP and NOP. 

- After hart A executes the first NOP at the start of `func`, an 
  interrupt occurs and hart A handles it.

- While hart A is handling this interrupt, hart B enables function 
  tracer for `func` and stop_machine is called. IPI to hart A is 
  pending.

- After hart A handles this interrupt and sret, the pending IPI is 
  serviced. So instead of executing the second NOP, hart A executes
  IPI handler for stop_machine and enter quiescent state.

- Hart B patches the 2 NOPs at the start of `func` to AUIPC and JALR

- Hart A is released from quiescent state and resumes execution.
  However, hart A will now execute JALR instead of NOP.

- NOP plus JALR leads to illegal jump target

Is this scenario possible or did I just overlook something?






More information about the linux-riscv mailing list