All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vlastimil Babka <vbabka@suse.cz>
To: David Hildenbrand <david@redhat.com>, linux-kernel@vger.kernel.org
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Hugh Dickins <hughd@google.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	David Rientjes <rientjes@google.com>,
	Shakeel Butt <shakeelb@google.com>,
	John Hubbard <jhubbard@nvidia.com>,
	Jason Gunthorpe <jgg@nvidia.com>,
	Mike Kravetz <mike.kravetz@oracle.com>,
	Mike Rapoport <rppt@linux.ibm.com>,
	Yang Shi <shy828301@gmail.com>,
	"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>,
	Matthew Wilcox <willy@infradead.org>,
	Jann Horn <jannh@google.com>, Michal Hocko <mhocko@kernel.org>,
	Nadav Amit <namit@vmware.com>, Rik van Riel <riel@surriel.com>,
	Roman Gushchin <guro@fb.com>,
	Andrea Arcangeli <aarcange@redhat.com>,
	Peter Xu <peterx@redhat.com>, Donald Dutile <ddutile@redhat.com>,
	Christoph Hellwig <hch@lst.de>, Oleg Nesterov <oleg@redhat.com>,
	Jan Kara <jack@suse.cz>, Liang Zhang <zhangliang5@huawei.com>,
	Pedro Gomes <pedrodemargomes@gmail.com>,
	Oded Gabbay <oded.gabbay@gmail.com>,
	linux-mm@kvack.org
Subject: Re: [PATCH v3 11/16] mm/page-flags: reuse PG_mappedtodisk as PG_anon_exclusive for PageAnon() pages
Date: Wed, 13 Apr 2022 16:55:44 +0200	[thread overview]
Message-ID: <c410215b-bae4-4bff-bc7b-3d6953e996fd@suse.cz> (raw)
In-Reply-To: <e015a477-89df-5eb1-5fec-b1108c18e4a4@redhat.com>

On 4/13/22 12:28, David Hildenbrand wrote:
> On 13.04.22 10:25, Vlastimil Babka wrote:
>> On 3/29/22 18:04, David Hildenbrand wrote:
>>>   the pin will be fully reliable and stay consistent with the pages
>>>   mapped into the page table, as the bit cannot get cleared (e.g., by
>>>   fork(), KSM) while the page is pinned. For anonymous pages that
>>>   are mapped R/W, PG_anon_exclusive can be assumed to always be set
>>>   because such pages cannot possibly be shared.
>>>
>>>   The page table lock protecting the page table entry is the primary
>>>   synchronization mechanism for PG_anon_exclusive; GUP-fast that does
>>>   not take the PT lock needs special care when trying to clear the
>>>   flag.
>>>
>>>   Page table entry types and PG_anon_exclusive:
>>>   * Present: PG_anon_exclusive applies.
>>>   * Swap: the information is lost. PG_anon_exclusive was cleared.
>>>   * Migration: the entry holds this information instead.
>>>                PG_anon_exclusive was cleared.
>>>   * Device private: PG_anon_exclusive applies.
>>>   * Device exclusive: PG_anon_exclusive applies.
>>>   * HW Poison: PG_anon_exclusive is stale and not changed.
>>>
>>>   If the page may be pinned (FOLL_PIN), clearing PG_anon_exclusive is
>>>   not allowed and the flag will stick around until the page is freed
>>>   and folio->mapping is cleared.
>> 
>> Or also if it's unpinned?
> 
> I'm afraid I didn't get your question. Once the page is no longer
> pinned, we can succeed in clearing PG_anon_exclusive (just like pinning
> never happened). Does that answer your question?

Yeah it looked like a scenario that's oddly missing in that description, yet
probably obvious. Now I feel it's indeed obvious, so nevermind :)

>>> We won't be clearing PG_anon_exclusive on destructive unmapping (i.e.,
>>> zapping) of page table entries, page freeing code will handle that when
>>> also invalidate page->mapping to not indicate PageAnon() anymore.
>>> Letting information about exclusivity stick around will be an important
>>> property when adding sanity checks to unpinning code.
>>>
>>> Note that we properly clear the flag in free_pages_prepare() via
>>> PAGE_FLAGS_CHECK_AT_PREP for each individual subpage of a compound page,
>>> so there is no need to manually clear the flag.
>>>
>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>> 
>> Acked-by: Vlastimil Babka <vbabka@suse.cz>
> 
> Thanks!
> 
>> 
>>> --- a/mm/memory.c
>>> +++ b/mm/memory.c
>>> @@ -3663,6 +3663,17 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
>>>  		goto out_nomap;
>>>  	}
>>>  
>>> +	/*
>>> +	 * PG_anon_exclusive reuses PG_mappedtodisk for anon pages. A swap pte
>>> +	 * must never point at an anonymous page in the swapcache that is
>>> +	 * PG_anon_exclusive. Sanity check that this holds and especially, that
>>> +	 * no filesystem set PG_mappedtodisk on a page in the swapcache. Sanity
>>> +	 * check after taking the PT lock and making sure that nobody
>>> +	 * concurrently faulted in this page and set PG_anon_exclusive.
>>> +	 */
>>> +	BUG_ON(!PageAnon(page) && PageMappedToDisk(page));
>>> +	BUG_ON(PageAnon(page) && PageAnonExclusive(page));
>>> +
>> 
>> Hmm, dunno why not VM_BUG_ON?
> 
> Getting PageAnonExclusive accidentally set by a file system would result
> in an extremely unpleasant security issue. I most surely want to catch
> something like that in any case, especially in the foreseeable future.

OK then.


  reply	other threads:[~2022-04-13 14:55 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-29 16:04 [PATCH v3 00/16] mm: COW fixes part 2: reliable GUP pins of anonymous pages David Hildenbrand
2022-03-29 16:04 ` [PATCH v3 01/16] mm/rmap: fix missing swap_free() in try_to_unmap() after arch_unmap_one() failed David Hildenbrand
2022-04-11 16:04   ` Vlastimil Babka
2022-03-29 16:04 ` [PATCH v3 02/16] mm/hugetlb: take src_mm->write_protect_seq in copy_hugetlb_page_range() David Hildenbrand
2022-04-11 16:15   ` Vlastimil Babka
2022-03-29 16:04 ` [PATCH v3 03/16] mm/memory: slightly simplify copy_present_pte() David Hildenbrand
2022-04-11 16:38   ` Vlastimil Babka
2022-03-29 16:04 ` [PATCH v3 04/16] mm/rmap: split page_dup_rmap() into page_dup_file_rmap() and page_try_dup_anon_rmap() David Hildenbrand
2022-04-11 18:18   ` Vlastimil Babka
2022-04-12  8:06     ` David Hildenbrand
2022-03-29 16:04 ` [PATCH v3 05/16] mm/rmap: convert RMAP flags to a proper distinct rmap_t type David Hildenbrand
2022-04-12  8:11   ` Vlastimil Babka
2022-03-29 16:04 ` [PATCH v3 06/16] mm/rmap: remove do_page_add_anon_rmap() David Hildenbrand
2022-04-12  8:13   ` Vlastimil Babka
2022-03-29 16:04 ` [PATCH v3 07/16] mm/rmap: pass rmap flags to hugepage_add_anon_rmap() David Hildenbrand
2022-04-12  8:37   ` Vlastimil Babka
2022-03-29 16:04 ` [PATCH v3 08/16] mm/rmap: drop "compound" parameter from page_add_new_anon_rmap() David Hildenbrand
2022-04-12  8:47   ` Vlastimil Babka
2022-04-12  9:37     ` David Hildenbrand
2022-04-13 12:26       ` Matthew Wilcox
2022-04-13 12:28         ` David Hildenbrand
2022-04-13 12:48           ` Matthew Wilcox
2022-04-13 16:20             ` David Hildenbrand
2022-03-29 16:04 ` [PATCH v3 09/16] mm/rmap: use page_move_anon_rmap() when reusing a mapped PageAnon() page exclusively David Hildenbrand
2022-04-12  9:26   ` Vlastimil Babka
2022-04-12  9:28     ` David Hildenbrand
2022-03-29 16:04 ` [PATCH v3 10/16] mm/huge_memory: remove outdated VM_WARN_ON_ONCE_PAGE from unmap_page() David Hildenbrand
2022-04-12  9:37   ` Vlastimil Babka
2022-03-29 16:04 ` [PATCH v3 11/16] mm/page-flags: reuse PG_mappedtodisk as PG_anon_exclusive for PageAnon() pages David Hildenbrand
2022-04-13  8:25   ` Vlastimil Babka
2022-04-13 10:28     ` David Hildenbrand
2022-04-13 14:55       ` Vlastimil Babka [this message]
2022-03-29 16:04 ` [PATCH v3 12/16] mm: remember exclusively mapped anonymous pages with PG_anon_exclusive David Hildenbrand
2022-04-13 16:28   ` Vlastimil Babka
2022-04-13 16:39     ` David Hildenbrand
2022-04-13 18:28       ` Vlastimil Babka
2022-04-19 16:46         ` David Hildenbrand
2022-04-13 18:29   ` Vlastimil Babka
2022-03-29 16:04 ` [PATCH v3 13/16] mm/gup: disallow follow_page(FOLL_PIN) David Hildenbrand
2022-04-14 15:18   ` Vlastimil Babka
2022-03-29 16:04 ` [PATCH v3 14/16] mm: support GUP-triggered unsharing of anonymous pages David Hildenbrand
2022-04-14 17:15   ` Vlastimil Babka
2022-04-19 16:29     ` David Hildenbrand
2022-04-19 16:31       ` Vlastimil Babka
2022-03-29 16:04 ` [PATCH v3 15/16] mm/gup: trigger FAULT_FLAG_UNSHARE when R/O-pinning a possibly shared anonymous page David Hildenbrand
2022-04-19 15:56   ` Vlastimil Babka
2022-03-29 16:04 ` [PATCH v3 16/16] mm/gup: sanity-check with CONFIG_DEBUG_VM that anonymous pages are exclusive when (un)pinning David Hildenbrand
2022-04-19 17:40   ` Vlastimil Babka
2022-04-21  9:15     ` David Hildenbrand
2022-04-22  6:54       ` Vlastimil Babka
2022-03-29 16:09 ` [PATCH v3 00/16] mm: COW fixes part 2: reliable GUP pins of anonymous pages David Hildenbrand

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=c410215b-bae4-4bff-bc7b-3d6953e996fd@suse.cz \
    --to=vbabka@suse.cz \
    --cc=aarcange@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=david@redhat.com \
    --cc=ddutile@redhat.com \
    --cc=guro@fb.com \
    --cc=hch@lst.de \
    --cc=hughd@google.com \
    --cc=jack@suse.cz \
    --cc=jannh@google.com \
    --cc=jgg@nvidia.com \
    --cc=jhubbard@nvidia.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@kernel.org \
    --cc=mike.kravetz@oracle.com \
    --cc=namit@vmware.com \
    --cc=oded.gabbay@gmail.com \
    --cc=oleg@redhat.com \
    --cc=pedrodemargomes@gmail.com \
    --cc=peterx@redhat.com \
    --cc=riel@surriel.com \
    --cc=rientjes@google.com \
    --cc=rppt@linux.ibm.com \
    --cc=shakeelb@google.com \
    --cc=shy828301@gmail.com \
    --cc=torvalds@linux-foundation.org \
    --cc=willy@infradead.org \
    --cc=zhangliang5@huawei.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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.