• T
    x86/mm/cpa: Prevent large page split when ftrace flips RW on kernel text · 99cb7a17
    Thomas Gleixner 提交于
    commit 7af0145067bc429a09ac4047b167c0971c9f0dc7 upstream.
    
    ftrace does not use text_poke() for enabling trace functionality. It uses
    its own mechanism and flips the whole kernel text to RW and back to RO.
    
    The CPA rework removed a loop based check of 4k pages which tried to
    preserve a large page by checking each 4k page whether the change would
    actually cover all pages in the large page.
    
    This resulted in endless loops for nothing as in testing it turned out that
    it actually never preserved anything. Of course testing missed to include
    ftrace, which is the one and only case which benefitted from the 4k loop.
    
    As a consequence enabling function tracing or ftrace based kprobes results
    in a full 4k split of the kernel text, which affects iTLB performance.
    
    The kernel RO protection is the only valid case where this can actually
    preserve large pages.
    
    All other static protections (RO data, data NX, PCI, BIOS) are truly
    static.  So a conflict with those protections which results in a split
    should only ever happen when a change of memory next to a protected region
    is attempted. But these conflicts are rightfully splitting the large page
    to preserve the protected regions. In fact a change to the protected
    regions itself is a bug and is warned about.
    
    Add an exception for the static protection check for kernel text RO when
    the to be changed region spawns a full large page which allows to preserve
    the large mappings. This also prevents the syslog to be spammed about CPA
    violations when ftrace is used.
    
    The exception needs to be removed once ftrace switched over to text_poke()
    which avoids the whole issue.
    
    Fixes: 585948f4f695 ("x86/mm/cpa: Avoid the 4k pages check completely")
    Reported-by: NSong Liu <songliubraving@fb.com>
    Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
    Tested-by: NSong Liu <songliubraving@fb.com>
    Reviewed-by: NSong Liu <songliubraving@fb.com>
    Acked-by: NPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/alpine.DEB.2.21.1908282355340.1938@nanos.tec.linutronix.deSigned-off-by: NShile Zhang <shile.zhang@linux.alibaba.com>
    Reviewed-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
    99cb7a17
pageattr.c 59.0 KB