linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: David Hildenbrand <david@redhat.com>
To: Asahi Lina <lina@asahilina.net>, Zi Yan <ziy@nvidia.com>
Cc: "Miguel Ojeda" <ojeda@kernel.org>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Boqun Feng" <boqun.feng@gmail.com>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <benno.lossin@proton.me>,
	"Andreas Hindborg" <a.hindborg@kernel.org>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Trevor Gross" <tmgross@umich.edu>,
	"Jann Horn" <jannh@google.com>,
	"Matthew Wilcox" <willy@infradead.org>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Danilo Krummrich" <dakr@kernel.org>,
	"Wedson Almeida Filho" <wedsonaf@gmail.com>,
	"Valentin Obst" <kernel@valentinobst.de>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	linux-mm@kvack.org, airlied@redhat.com,
	"Abdiel Janulgue" <abdiel.janulgue@gmail.com>,
	rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
	asahi@lists.linux.dev, "Oscar Salvador" <osalvador@suse.de>,
	"Muchun Song" <muchun.song@linux.dev>
Subject: Re: [PATCH 0/6] rust: page: Support borrowing `struct page` and physaddr conversion
Date: Tue, 4 Feb 2025 12:59:35 +0100	[thread overview]
Message-ID: <f1498b22-0bc1-489a-8c2c-35aa48c7fe7d@redhat.com> (raw)
In-Reply-To: <82047858-480a-45e3-b826-3a46fbebe842@asahilina.net>

>>> Add DavidH and OscarS for memory hot-remove questions.
>>>
>>> IIUC, struct page could be freed if a chunk of memory is hot-removed.
>>
>> Right, but only after there are no users anymore (IOW, memory was freed
>> back to the buddy). PFN walkers might still stumble over them, but I
>> would not expect (or recommend) rust to do that.
> 
> The physaddr to page function does look up pages by pfn, but it's
> intended to be used by drivers that know what they're doing. There are
> two variants of the API, one that is completely unchecked (a fast path
> for cases where the driver definitely allocated these pages itself, for
> example just grabbing the `struct page` back from a decoded PTE it
> wrote), and one that has this check:
> 
> pfn_valid(pfn) && page_is_ram(pfn)
> 
> Which is intended as a safety net to allow drivers to look up
> firmware-reserved pages too, and fail gracefully if the kernel doesn't
> know about them (because they weren't declared in the
> bootloader/firmware memory map correctly) or doesn't have them mapped in
> the direct map (because they were declared no-map).
 > > Is there anything else that can reasonably be done here to make the API
> safer to call on an arbitrary pfn?

In PFN walkers we use pfn_to_online_page() to make sure that (1) the 
memmap really exists; and (2) that it has meaning (e.g., was actually 
initialized).

It can still race with memory offlining, and it refuses ZONE_DEVICE 
pages. For the latter, we have a different way to check validity. See 
memory_failure() that first calls pfn_to_online_page() to then check 
get_dev_pagemap().

> 
> If the answer is "no" then that's fine. It's still an unsafe function
> and we need to document in the safety section that it should only be
> used for memory that is either known to be allocated and pinned and will
> not be freed while the `struct page` is borrowed, or memory that is
> reserved and not owned by the buddy allocator, so in practice correct
> use would not be racy with memory hot-remove anyway.
> 
> This is already the case for the drm/asahi use case, where the pfns
> looked up will only ever be one of:
> 
> - GEM objects that are mapped to the GPU and whose physical pages are
> therefore pinned (and the VM is locked while this happens so the objects
> cannot become unpinned out from under the running code),

How exactly are these pages pinned/obtained?

> - Raw pages allocated from the page allocator for use as GPU page tables,

That makes sense.

> - System memory that is marked reserved by the firmware/bootloader,

E.g., in arch/x86/mm/ioremap.c:__ioremap_check_ram() we refuse anything 
that has a valid memmap and is *not* marked as PageReserved, to prevent 
remapping arbitrary *real* RAM.

Is that case here similar?

> - (Potentially) invalid PFNs that aren't part of the System RAM region
> at all and don't have a struct page to begin with, which we check for,
> so the API returns an error. This would only happen if the bootloader
> didn't declare some used firmware ranges at all, so Linux doesn't know
> about them.
> 
>>
>>>
>>> Another case struct page can be freed is when hugetlb vmemmap
>>> optimization
>>> is used. Muchun (cc'd) is the maintainer of hugetlbfs.
>>
>> Here, the "struct page" remains valid though; it can still be accessed,
>> although we disallow writes (which would be wrong).
>>
>> If you only allocate a page and free it later, there is no need to worry
>> about either on the rust side.
> 
> This is what the safe API does. (Also the unsafe physaddr APIs if all
> you ever do is convert an allocated page to a physaddr and back, which
> is the only thing the GPU page table code does during normal use. The
> walking leaf PFNs story is only for GPU device coredumps when the
> firmware crashes.)

I would hope that we can lock down this interface as much as possible.

Ideally, we would never go from pfn->page, unless

(a) we remember somehow that we came from page->pfn. E.g., we allocated
     these pages or someone else provided us with these pages. The memmap
     cannot go away. I know it's hard.
(b) the pages are flagged as being special, similar to
     __ioremap_check_ram().

-- 
Cheers,

David / dhildenb



  reply	other threads:[~2025-02-04 11:59 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-02 13:05 Asahi Lina
2025-02-02 13:05 ` [PATCH 1/6] rust: types: Add Ownable/Owned types Asahi Lina
2025-02-03  9:13   ` Alice Ryhl
2025-02-03 14:17     ` Asahi Lina
2025-02-03 18:17       ` Alice Ryhl
2025-02-03 19:17         ` Asahi Lina
2025-02-19  8:34           ` Andreas Hindborg
2025-02-19  8:37   ` Andreas Hindborg
2025-02-02 13:05 ` [PATCH 2/6] rust: page: Convert to Ownable Asahi Lina
2025-02-03  9:17   ` Alice Ryhl
2025-02-03  9:39   ` Fiona Behrens
2025-02-19  8:46   ` Andreas Hindborg
2025-02-02 13:05 ` [PATCH 3/6] rust: page: Make with_page_mapped() and with_pointer_into_page() public Asahi Lina
2025-02-03  9:10   ` Alice Ryhl
2025-02-03  9:43   ` Fiona Behrens
2025-02-19  8:48   ` Andreas Hindborg
2025-02-02 13:05 ` [PATCH 4/6] rust: addr: Add a module to declare core address types Asahi Lina
2025-02-03  9:09   ` Alice Ryhl
2025-02-03 15:04   ` Boqun Feng
2025-02-04 11:50     ` Asahi Lina
2025-02-04 14:50       ` Boqun Feng
2025-02-19  8:51   ` Andreas Hindborg
2025-02-02 13:05 ` [PATCH 5/6] rust: page: Add physical address conversion functions Asahi Lina
2025-02-03  9:35   ` Alice Ryhl
2025-02-04 11:43     ` Asahi Lina
2025-02-03  9:53   ` Fiona Behrens
2025-02-03 10:01     ` Alice Ryhl
2025-02-19  9:06   ` Andreas Hindborg
2025-02-02 13:05 ` [PATCH 6/6] rust: page: Make Page::as_ptr() pub(crate) Asahi Lina
2025-02-03  9:08   ` Alice Ryhl
2025-02-19  9:08   ` Andreas Hindborg
2025-02-03  9:58 ` [PATCH 0/6] rust: page: Support borrowing `struct page` and physaddr conversion Simona Vetter
2025-02-03 14:32   ` Asahi Lina
2025-02-03 21:05     ` Zi Yan
2025-02-04 10:26       ` David Hildenbrand
2025-02-04 11:41         ` Asahi Lina
2025-02-04 11:59           ` David Hildenbrand [this message]
2025-02-04 13:05             ` Asahi Lina
2025-02-04 14:38               ` David Hildenbrand
2025-02-04 17:59                 ` Asahi Lina
2025-02-04 20:10                   ` David Hildenbrand
2025-02-04 21:06                     ` Asahi Lina
2025-02-06 17:58                       ` David Hildenbrand
2025-02-06 19:18                         ` Asahi Lina
2025-02-06 19:27                           ` Asahi Lina
2025-02-12 19:06                             ` David Hildenbrand
2025-02-12 19:01                           ` David Hildenbrand
2025-02-05  7:40                 ` Simona Vetter
2025-02-12 19:07                   ` David Hildenbrand
2025-02-04 10:33   ` David Hildenbrand
2025-02-04 18:39     ` Jason Gunthorpe
2025-02-04 19:01       ` Asahi Lina
2025-02-04 20:05       ` David Hildenbrand
2025-02-04 20:26         ` Jason Gunthorpe
2025-02-04 20:41           ` David Hildenbrand
2025-02-04 20:47             ` David Hildenbrand
2025-02-04 21:18               ` Asahi Lina
2025-02-06 18:02                 ` David Hildenbrand
2025-02-04 20:49             ` Jason Gunthorpe
2025-02-05 23:17               ` Matthew Wilcox
2025-02-06 18:04                 ` David Hildenbrand
2025-02-03 10:22 ` Danilo Krummrich
2025-02-03 14:41   ` Asahi Lina
2025-02-15 19:47     ` Asahi Lina
2025-02-17  8:50       ` Abdiel Janulgue
2025-02-19  9:24         ` Andreas Hindborg
2025-03-06 19:21 Oliver Mangold

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=f1498b22-0bc1-489a-8c2c-35aa48c7fe7d@redhat.com \
    --to=david@redhat.com \
    --cc=a.hindborg@kernel.org \
    --cc=abdiel.janulgue@gmail.com \
    --cc=airlied@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=asahi@lists.linux.dev \
    --cc=benno.lossin@proton.me \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=dakr@kernel.org \
    --cc=gary@garyguo.net \
    --cc=jannh@google.com \
    --cc=kernel@valentinobst.de \
    --cc=lina@asahilina.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=muchun.song@linux.dev \
    --cc=ojeda@kernel.org \
    --cc=osalvador@suse.de \
    --cc=pbonzini@redhat.com \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=tmgross@umich.edu \
    --cc=wedsonaf@gmail.com \
    --cc=willy@infradead.org \
    --cc=ziy@nvidia.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox