From: Kirill Tkhai <ktkhai@virtuozzo.com> To: Peter Xu <peterx@redhat.com>, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: "Maya B . Gokhale" <gokhale2@llnl.gov>, Linus Torvalds <torvalds@linux-foundation.org>, Yang Shi <yang.shi@linux.alibaba.com>, Marty Mcfadden <mcfadden8@llnl.gov>, Kirill Shutemov <kirill@shutemov.name>, Oleg Nesterov <oleg@redhat.com>, Jann Horn <jannh@google.com>, Jan Kara <jack@suse.cz>, Andrea Arcangeli <aarcange@redhat.com>, Christoph Hellwig <hch@lst.de>, Andrew Morton <akpm@linux-foundation.org> Subject: Re: [PATCH 1/4] mm: Trial do_wp_page() simplification Date: Mon, 24 Aug 2020 11:36:22 +0300 Message-ID: <42bc9a68-ef9e-2542-0b21-392a7f47bd74@virtuozzo.com> (raw) In-Reply-To: <20200821234958.7896-2-peterx@redhat.com> On 22.08.2020 02:49, Peter Xu wrote: > From: Linus Torvalds <torvalds@linux-foundation.org> > > How about we just make sure we're the only possible valid user fo the > page before we bother to reuse it? > > Simplify, simplify, simplify. > > And get rid of the nasty serialization on the page lock at the same time. > > Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> > [peterx: add subject prefix] > Signed-off-by: Peter Xu <peterx@redhat.com> > --- > mm/memory.c | 59 +++++++++++++++-------------------------------------- > 1 file changed, 17 insertions(+), 42 deletions(-) > > diff --git a/mm/memory.c b/mm/memory.c > index 602f4283122f..cb9006189d22 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -2927,50 +2927,25 @@ static vm_fault_t do_wp_page(struct vm_fault *vmf) > * not dirty accountable. > */ > if (PageAnon(vmf->page)) { > - int total_map_swapcount; > - if (PageKsm(vmf->page) && (PageSwapCache(vmf->page) || > - page_count(vmf->page) != 1)) > + struct page *page = vmf->page; > + > + /* PageKsm() doesn't necessarily raise the page refcount */ No, this is wrong. PageKSM() always raises refcount. There was another problem: KSM may raise refcount without lock_page(), and only then it takes the lock. See get_ksm_page(GET_KSM_PAGE_NOLOCK) for the details. So, reliable protection against parallel access requires to freeze page counter, which is made in reuse_ksm_page(). > + if (PageKsm(page) || page_count(page) != 1) > + goto copy; > + if (!trylock_page(page)) > + goto copy; > + if (PageKsm(page) || page_mapcount(page) != 1 || page_count(page) != 1) { > + unlock_page(page); > goto copy; > - if (!trylock_page(vmf->page)) { > - get_page(vmf->page); > - pte_unmap_unlock(vmf->pte, vmf->ptl); > - lock_page(vmf->page); > - vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd, > - vmf->address, &vmf->ptl); > - if (!pte_same(*vmf->pte, vmf->orig_pte)) { > - update_mmu_tlb(vma, vmf->address, vmf->pte); > - unlock_page(vmf->page); > - pte_unmap_unlock(vmf->pte, vmf->ptl); > - put_page(vmf->page); > - return 0; > - } > - put_page(vmf->page); > - } > - if (PageKsm(vmf->page)) { > - bool reused = reuse_ksm_page(vmf->page, vmf->vma, > - vmf->address); > - unlock_page(vmf->page); > - if (!reused) > - goto copy; > - wp_page_reuse(vmf); > - return VM_FAULT_WRITE; > - } > - if (reuse_swap_page(vmf->page, &total_map_swapcount)) { > - if (total_map_swapcount == 1) { > - /* > - * The page is all ours. Move it to > - * our anon_vma so the rmap code will > - * not search our parent or siblings. > - * Protected against the rmap code by > - * the page lock. > - */ > - page_move_anon_rmap(vmf->page, vma); > - } > - unlock_page(vmf->page); > - wp_page_reuse(vmf); > - return VM_FAULT_WRITE; > } > - unlock_page(vmf->page); > + /* > + * Ok, we've got the only map reference, and the only > + * page count reference, and the page is locked, > + * it's dark out, and we're wearing sunglasses. Hit it. > + */ > + wp_page_reuse(vmf); > + unlock_page(page); > + return VM_FAULT_WRITE; > } else if (unlikely((vma->vm_flags & (VM_WRITE|VM_SHARED)) == > (VM_WRITE|VM_SHARED))) { > return wp_page_shared(vmf); >
next prev parent reply index Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-08-21 23:49 [PATCH 0/4] mm: Simplfy cow handling Peter Xu 2020-08-21 23:49 ` [PATCH 1/4] mm: Trial do_wp_page() simplification Peter Xu 2020-08-24 8:36 ` Kirill Tkhai [this message] 2020-08-24 14:30 ` Jan Kara 2020-08-24 15:37 ` Kirill Tkhai 2020-08-24 18:22 ` Linus Torvalds 2020-09-01 7:01 ` Hugh Dickins 2020-09-14 14:38 ` Jason Gunthorpe 2020-09-14 17:32 ` Linus Torvalds 2020-09-14 18:34 ` Peter Xu 2020-09-14 21:15 ` Peter Xu 2020-09-14 22:55 ` Jason Gunthorpe 2020-09-14 22:59 ` Linus Torvalds 2020-09-14 23:28 ` Jason Gunthorpe 2020-09-15 0:19 ` Linus Torvalds 2020-09-15 14:50 ` Peter Xu 2020-09-15 15:17 ` Peter Xu 2020-09-15 16:05 ` Jason Gunthorpe 2020-09-15 18:29 ` Jason Gunthorpe 2020-09-15 19:13 ` Peter Xu 2020-09-15 19:38 ` Jason Gunthorpe 2020-09-15 21:33 ` Peter Xu 2020-09-15 23:22 ` Jason Gunthorpe 2020-09-16 1:50 ` John Hubbard 2020-09-16 17:48 ` Jason Gunthorpe 2020-09-16 18:46 ` Peter Xu 2020-09-17 11:25 ` Jason Gunthorpe 2020-09-17 18:11 ` Linus Torvalds 2020-09-17 19:38 ` Jason Gunthorpe 2020-09-17 19:51 ` Linus Torvalds 2020-09-18 16:40 ` Peter Xu 2020-09-18 17:16 ` Linus Torvalds 2020-09-18 19:57 ` Peter Xu 2020-09-18 17:32 ` Jason Gunthorpe 2020-09-18 20:40 ` Peter Xu 2020-09-18 20:59 ` Linus Torvalds 2020-09-19 0:28 ` Jason Gunthorpe 2020-09-18 21:06 ` John Hubbard 2020-09-19 0:01 ` Jason Gunthorpe 2020-09-21 8:35 ` Jan Kara 2020-09-21 12:03 ` Jason Gunthorpe 2020-09-21 13:42 ` Michal Hocko 2020-09-21 14:18 ` Peter Xu 2020-09-21 14:28 ` Michal Hocko 2020-09-21 14:38 ` Tejun Heo 2020-09-21 14:43 ` Christian Brauner 2020-09-21 14:55 ` Michal Hocko 2020-09-21 15:04 ` Christian Brauner 2020-09-21 16:06 ` Michal Hocko 2020-09-23 7:53 ` Michal Hocko 2020-09-21 14:41 ` Christian Brauner 2020-09-21 14:57 ` Michal Hocko 2020-09-21 16:31 ` Peter Xu 2020-09-17 18:14 ` Peter Xu 2020-09-17 18:26 ` Linus Torvalds 2020-09-17 19:03 ` Peter Xu 2020-09-17 19:42 ` Linus Torvalds 2020-09-17 19:55 ` John Hubbard 2020-09-17 20:06 ` Jason Gunthorpe 2020-09-17 20:19 ` John Hubbard 2020-09-17 20:25 ` Jason Gunthorpe 2020-09-17 20:35 ` Linus Torvalds 2020-09-17 21:40 ` Peter Xu 2020-09-17 22:09 ` Jason Gunthorpe 2020-09-17 22:25 ` Linus Torvalds 2020-09-17 22:48 ` Ira Weiny 2020-09-18 9:36 ` Jan Kara 2020-09-18 9:44 ` Jan Kara 2020-09-18 16:19 ` Jason Gunthorpe 2020-09-15 10:23 ` Leon Romanovsky 2020-09-15 15:56 ` Jason Gunthorpe 2020-09-15 15:03 ` Oleg Nesterov 2020-09-15 16:18 ` Peter Xu 2020-08-21 23:49 ` [PATCH 2/4] mm/ksm: Remove reuse_ksm_page() Peter Xu 2020-08-21 23:49 ` [PATCH 3/4] mm/gup: Remove enfornced COW mechanism Peter Xu 2020-09-14 14:27 ` Oleg Nesterov 2020-09-14 17:59 ` Peter Xu 2020-09-14 19:03 ` Linus Torvalds 2020-08-21 23:49 ` [PATCH 4/4] mm: Add PGREUSE counter Peter Xu 2020-08-22 16:14 ` Linus Torvalds 2020-08-24 0:24 ` Peter Xu 2020-08-22 16:05 ` [PATCH 0/4] mm: Simplfy cow handling Linus Torvalds 2020-08-23 23:58 ` Peter Xu 2020-08-24 8:38 ` Kirill Tkhai 2020-08-27 14:15 ` Peter Xu 2021-02-02 14:40 [PATCH 1/4] mm: Trial do_wp_page() simplification Gal Pressman 2021-02-02 16:31 ` Peter Xu 2021-02-02 16:44 ` Jason Gunthorpe 2021-02-02 17:05 ` Peter Xu 2021-02-02 17:13 ` Jason Gunthorpe 2021-02-03 12:43 ` Gal Pressman 2021-02-03 14:00 ` Jason Gunthorpe 2021-02-03 14:47 ` Gal Pressman
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=42bc9a68-ef9e-2542-0b21-392a7f47bd74@virtuozzo.com \ --to=ktkhai@virtuozzo.com \ --cc=aarcange@redhat.com \ --cc=akpm@linux-foundation.org \ --cc=gokhale2@llnl.gov \ --cc=hch@lst.de \ --cc=jack@suse.cz \ --cc=jannh@google.com \ --cc=kirill@shutemov.name \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=mcfadden8@llnl.gov \ --cc=oleg@redhat.com \ --cc=peterx@redhat.com \ --cc=torvalds@linux-foundation.org \ --cc=yang.shi@linux.alibaba.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
LKML Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/lkml/0 lkml/git/0.git git clone --mirror https://lore.kernel.org/lkml/1 lkml/git/1.git git clone --mirror https://lore.kernel.org/lkml/2 lkml/git/2.git git clone --mirror https://lore.kernel.org/lkml/3 lkml/git/3.git git clone --mirror https://lore.kernel.org/lkml/4 lkml/git/4.git git clone --mirror https://lore.kernel.org/lkml/5 lkml/git/5.git git clone --mirror https://lore.kernel.org/lkml/6 lkml/git/6.git git clone --mirror https://lore.kernel.org/lkml/7 lkml/git/7.git git clone --mirror https://lore.kernel.org/lkml/8 lkml/git/8.git git clone --mirror https://lore.kernel.org/lkml/9 lkml/git/9.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 lkml lkml/ https://lore.kernel.org/lkml \ linux-kernel@vger.kernel.org public-inbox-index lkml Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-kernel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git