• Lai Jiangshan's avatar
    ftrace: protect running nmi (V3) · e9d9df44
    Lai Jiangshan authored
    When I review the sensitive code ftrace_nmi_enter(), I found
    the atomic variable nmi_running does protect NMI VS do_ftrace_mod_code(),
    but it can not protects NMI(entered nmi) VS NMI(ftrace_nmi_enter()).
    
    cpu#1                   | cpu#2                 | cpu#3
    ftrace_nmi_enter()      | do_ftrace_mod_code()  |
      not modify            |                       |
    ------------------------|-----------------------|--
    executing               | set mod_code_write = 1|
    executing             --|-----------------------|--------------------
    executing               |                       | ftrace_nmi_enter()
    executing               |                       |    do modify
    ------------------------|-----------------------|-----------------
    ftrace_nmi_exit()       |                       |
    
    cpu#3 may be being modified the code which is still being executed on cpu#1,
    it will have undefined results and possibly take a GPF, this patch
    prevents it occurred.
    Signed-off-by: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
    LKML-Reference: <49C0B411.30003@cn.fujitsu.com>
    Signed-off-by: default avatarSteven Rostedt <srostedt@redhat.com>
    e9d9df44
ftrace.c 12.5 KB