• Huacai Chen's avatar
    LoongArch: Set _PAGE_DIRTY only if _PAGE_WRITE is set in {pmd,pte}_mkdirty() · bf2f34a5
    Huacai Chen authored
    Now {pmd,pte}_mkdirty() set _PAGE_DIRTY bit unconditionally, this causes
    random segmentation fault after commit 0ccf7f16 ("mm/thp: carry
    over dirty bit when thp splits on pmd").
    
    The reason is: when fork(), parent process use pmd_wrprotect() to clear
    huge page's _PAGE_WRITE and _PAGE_DIRTY (for COW); then pte_mkdirty() set
    _PAGE_DIRTY as well as _PAGE_MODIFIED while splitting dirty huge pages;
    once _PAGE_DIRTY is set, there will be no tlb modify exception so the COW
    machanism fails; and at last memory corruption occurred between parent
    and child processes.
    
    So, we should set _PAGE_DIRTY only when _PAGE_WRITE is set in {pmd,pte}_
    mkdirty().
    
    Cc: stable@vger.kernel.org
    Cc: Peter Xu <peterx@redhat.com>
    Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
    bf2f34a5
pgtable.h 14 KB