Message ID | 20161216063940.GA1334@bbox (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Dez 16 2016, Minchan Kim <minchan@kernel.org> wrote: > Below helps? > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index e10a4fe..dc37c9a 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -1611,6 +1611,7 @@ int madvise_free_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma, > tlb->fullmm); > orig_pmd = pmd_mkold(orig_pmd); > orig_pmd = pmd_mkclean(orig_pmd); > + orig_pmd = pmd_wrprotect(orig_pmd); > > set_pmd_at(mm, addr, pmd, orig_pmd); > tlb_remove_pmd_tlb_entry(tlb, pmd, addr); Thanks, this fixes the issue (tested with 4.9). Andreas.
Hello, Andreas Sorry for long delay. I was on vacation. On Fri, Dec 16, 2016 at 03:16:20PM +0100, Andreas Schwab wrote: > On Dez 16 2016, Minchan Kim <minchan@kernel.org> wrote: > > > Below helps? > > > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > > index e10a4fe..dc37c9a 100644 > > --- a/mm/huge_memory.c > > +++ b/mm/huge_memory.c > > @@ -1611,6 +1611,7 @@ int madvise_free_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma, > > tlb->fullmm); > > orig_pmd = pmd_mkold(orig_pmd); > > orig_pmd = pmd_mkclean(orig_pmd); > > + orig_pmd = pmd_wrprotect(orig_pmd); > > > > set_pmd_at(mm, addr, pmd, orig_pmd); > > tlb_remove_pmd_tlb_entry(tlb, pmd, addr); > > Thanks, this fixes the issue (tested with 4.9). It was a quick hack to know what exact problem is there and your confirming helped a lot to understand the problem clear. More right approach is to support pmd dirty handling in general page fault handler rather than tweaking MADV_FREE. I just sent a new patch with Ccing you. Could you test it, please? Thanks!
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index e10a4fe..dc37c9a 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1611,6 +1611,7 @@ int madvise_free_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma, tlb->fullmm); orig_pmd = pmd_mkold(orig_pmd); orig_pmd = pmd_mkclean(orig_pmd); + orig_pmd = pmd_wrprotect(orig_pmd); set_pmd_at(mm, addr, pmd, orig_pmd); tlb_remove_pmd_tlb_entry(tlb, pmd, addr);