• S
    ftrace: nmi safe code modification · 17666f02
    Steven Rostedt 提交于
    Impact: fix crashes that can occur in NMI handlers, if their code is modified
    
    Modifying code is something that needs special care. On SMP boxes,
    if code that is being modified is also being executed on another CPU,
    that CPU will have undefined results.
    
    The dynamic ftrace uses kstop_machine to make the system act like a
    uniprocessor system. But this does not address NMIs, that can still
    run on other CPUs.
    
    One approach to handle this is to make all code that are used by NMIs
    not be traced. But NMIs can call notifiers that spread throughout the
    kernel and this will be very hard to maintain, and the chance of missing
    a function is very high.
    
    The approach that this patch takes is to have the NMIs modify the code
    if the modification is taking place. The way this works is that just
    writing to code executing on another CPU is not harmful if what is
    written is the same as what exists.
    
    Two buffers are used: an IP buffer and a "code" buffer.
    
    The steps that the patcher takes are:
    
     1) Put in the instruction pointer into the IP buffer
        and the new code into the "code" buffer.
     2) Set a flag that says we are modifying code
     3) Wait for any running NMIs to finish.
     4) Write the code
     5) clear the flag.
     6) Wait for any running NMIs to finish.
    
    If an NMI is executed, it will also write the pending code.
    Multiple writes are OK, because what is being written is the same.
    Then the patcher must wait for all running NMIs to finish before
    going to the next line that must be patched.
    
    This is basically the RCU approach to code modification.
    
    Thanks to Ingo Molnar for suggesting the idea, and to Arjan van de Ven
    for his guidence on what is safe and what is not.
    Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    17666f02
ftrace.h 383 字节