Message ID | 1593436533-8645-1-git-send-email-maobibo@loongson.cn (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [1/2] hugetlb: clear huge pte during flush function on mips platform | expand |
On Mon, Jun 29, 2020 at 09:15:32PM +0800, bibo mao wrote: > From: Bibo Mao <maobibo@loongson.cn> > > If multiple threads are accessing the same huge page at the same > time, hugetlb_cow will be called if one thread write the COW huge > page. And function huge_ptep_clear_flush is called to notify other > threads to clear the huge pte tlb entry. The other threads clear > the huge pte tlb entry and reload it from page table, the reload > huge pte entry may be old. > > This patch fixes this issue on mips platform, and it clears huge > pte entry before notifying other threads to flush current huge > page entry, it is similar with other architectures. > > Signed-off-by: Bibo Mao <maobibo@loongson.cn> > --- > arch/mips/include/asm/hugetlb.h | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) applied to mips-next. Thomas.
diff --git a/arch/mips/include/asm/hugetlb.h b/arch/mips/include/asm/hugetlb.h index 10e3be87..c214440 100644 --- a/arch/mips/include/asm/hugetlb.h +++ b/arch/mips/include/asm/hugetlb.h @@ -46,7 +46,13 @@ static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, static inline void huge_ptep_clear_flush(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) { - flush_tlb_page(vma, addr & huge_page_mask(hstate_vma(vma))); + /* + * clear the huge pte entry firstly, so that the other smp threads will + * not get old pte entry after finishing flush_tlb_page and before + * setting new huge pte entry + */ + huge_ptep_get_and_clear(vma->vm_mm, addr, ptep); + flush_tlb_page(vma, addr); } #define __HAVE_ARCH_HUGE_PTE_NONE