Add a method to `Page` that allows construction of an instance from `struct
page` pointer.
Signed-off-by: Andreas Hindborg <a.hindborg@samsung.com>
---
rust/kernel/page.rs | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/rust/kernel/page.rs b/rust/kernel/page.rs
index 4591b7b01c3d2..803f3e3d76b22 100644
--- a/rust/kernel/page.rs
+++ b/rust/kernel/page.rs
@@ -191,6 +191,17 @@ pub fn nid(&self) -> i32 {
unsafe { bindings::page_to_nid(self.as_ptr()) }
}
+ /// Create a `&Page` from a raw `struct page` pointer
+ ///
+ /// # Safety
+ ///
+ /// `ptr` must be valid for use as a reference for the duration of `'a`.
+ pub unsafe fn from_raw<'a>(ptr: *const bindings::page) -> &'a Self {
+ // SAFETY: By function safety requirements, ptr is not null and is
+ // valid for use as a reference.
+ unsafe { &*Opaque::cast_from(ptr).cast::<Self>() }
+ }
+
/// Runs a piece of code with this page mapped to an address.
///
/// The page is unmapped when this call returns.
--
2.51.2
On Fri, Feb 20, 2026 at 10:52 AM Andreas Hindborg <a.hindborg@kernel.org> wrote: > > + /// Create a `&Page` from a raw `struct page` pointer Please end sentences with a period. > + // SAFETY: By function safety requirements, ptr is not null and is Please use Markdown in comments: `ptr`. > + /// `ptr` must be valid for use as a reference for the duration of `'a`. Since we will likely try to starting introducing at least a subset of the Safety Standard soon, we should try to use standard terms. So I think this "valid for use as a reference" is not an established one, no? Isn't "convertible to a shared reference" the official term? https://doc.rust-lang.org/std/ptr/index.html#pointer-to-reference-conversion In fact, I see `as_ref_unchecked()` and `as_mut_unchecked()` just got stabilized for 1.95.0, so we should probably starting using those were applicable as we bump the minimum, but we should probably use already a similar wording as the standard library for the safety section and the comment: "`ptr` must be [convertible to a reference](...)." where the term is a link to that section. Cc'ing Benno. I have created a (future) issue for that: https://github.com/Rust-for-Linux/linux/issues/1225 Cc'ing Tamir since this is close to the cast work, so it may interest him as well. Cheers, Miguel
Miguel Ojeda <miguel.ojeda.sandonis@gmail.com> writes: > On Fri, Feb 20, 2026 at 10:52 AM Andreas Hindborg <a.hindborg@kernel.org> wrote: >> >> + /// Create a `&Page` from a raw `struct page` pointer > > Please end sentences with a period. Ok. > >> + // SAFETY: By function safety requirements, ptr is not null and is > > Please use Markdown in comments: `ptr`. Ok. > >> + /// `ptr` must be valid for use as a reference for the duration of `'a`. > > Since we will likely try to starting introducing at least a subset of > the Safety Standard soon, we should try to use standard terms. > > So I think this "valid for use as a reference" is not an established > one, no? Isn't "convertible to a shared reference" the official term? > > https://doc.rust-lang.org/std/ptr/index.html#pointer-to-reference-conversion > > In fact, I see `as_ref_unchecked()` and `as_mut_unchecked()` just got > stabilized for 1.95.0, so we should probably starting using those were > applicable as we bump the minimum, but we should probably use already > a similar wording as the standard library for the safety section and > the comment: > > "`ptr` must be [convertible to a reference](...)." I'll change the wording to the "convertible" one. Best regards, Andreas Hindborg
On Fri, Feb 20, 2026 at 12:34 PM Miguel Ojeda <miguel.ojeda.sandonis@gmail.com> wrote: > > On Fri, Feb 20, 2026 at 10:52 AM Andreas Hindborg <a.hindborg@kernel.org> wrote: > > > > + /// Create a `&Page` from a raw `struct page` pointer > > Please end sentences with a period. > > > + // SAFETY: By function safety requirements, ptr is not null and is > > Please use Markdown in comments: `ptr`. > > > + /// `ptr` must be valid for use as a reference for the duration of `'a`. > > Since we will likely try to starting introducing at least a subset of > the Safety Standard soon, we should try to use standard terms. > > So I think this "valid for use as a reference" is not an established > one, no? Isn't "convertible to a shared reference" the official term? > > https://doc.rust-lang.org/std/ptr/index.html#pointer-to-reference-conversion > > In fact, I see `as_ref_unchecked()` and `as_mut_unchecked()` just got > stabilized for 1.95.0, so we should probably starting using those were > applicable as we bump the minimum, but we should probably use already > a similar wording as the standard library for the safety section and > the comment: > > "`ptr` must be [convertible to a reference](...)." > > where the term is a link to that section. Cc'ing Benno. > > I have created a (future) issue for that: > > https://github.com/Rust-for-Linux/linux/issues/1225 > > Cc'ing Tamir since this is close to the cast work, so it may interest > him as well. Thanks Miguel -- FWIW there's no current cast work on my plate, I believe everything was merged except for provenance which was a bit too hard to work with given MSRV.
On Fri, Feb 20, 2026 at 10:52 AM Andreas Hindborg <a.hindborg@kernel.org> wrote:
>
> Add a method to `Page` that allows construction of an instance from `struct
> page` pointer.
>
> Signed-off-by: Andreas Hindborg <a.hindborg@samsung.com>
> ---
> rust/kernel/page.rs | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/rust/kernel/page.rs b/rust/kernel/page.rs
> index 4591b7b01c3d2..803f3e3d76b22 100644
> --- a/rust/kernel/page.rs
> +++ b/rust/kernel/page.rs
> @@ -191,6 +191,17 @@ pub fn nid(&self) -> i32 {
> unsafe { bindings::page_to_nid(self.as_ptr()) }
> }
>
> + /// Create a `&Page` from a raw `struct page` pointer
> + ///
> + /// # Safety
> + ///
> + /// `ptr` must be valid for use as a reference for the duration of `'a`.
> + pub unsafe fn from_raw<'a>(ptr: *const bindings::page) -> &'a Self {
> + // SAFETY: By function safety requirements, ptr is not null and is
> + // valid for use as a reference.
> + unsafe { &*Opaque::cast_from(ptr).cast::<Self>() }
If you're going to do a pointer cast, then keep it simple and just do
&*ptr.cast().
Alice
Alice Ryhl <aliceryhl@google.com> writes:
> On Fri, Feb 20, 2026 at 10:52 AM Andreas Hindborg <a.hindborg@kernel.org> wrote:
>>
>> Add a method to `Page` that allows construction of an instance from `struct
>> page` pointer.
>>
>> Signed-off-by: Andreas Hindborg <a.hindborg@samsung.com>
>> ---
>> rust/kernel/page.rs | 11 +++++++++++
>> 1 file changed, 11 insertions(+)
>>
>> diff --git a/rust/kernel/page.rs b/rust/kernel/page.rs
>> index 4591b7b01c3d2..803f3e3d76b22 100644
>> --- a/rust/kernel/page.rs
>> +++ b/rust/kernel/page.rs
>> @@ -191,6 +191,17 @@ pub fn nid(&self) -> i32 {
>> unsafe { bindings::page_to_nid(self.as_ptr()) }
>> }
>>
>> + /// Create a `&Page` from a raw `struct page` pointer
>> + ///
>> + /// # Safety
>> + ///
>> + /// `ptr` must be valid for use as a reference for the duration of `'a`.
>> + pub unsafe fn from_raw<'a>(ptr: *const bindings::page) -> &'a Self {
>> + // SAFETY: By function safety requirements, ptr is not null and is
>> + // valid for use as a reference.
>> + unsafe { &*Opaque::cast_from(ptr).cast::<Self>() }
>
> If you're going to do a pointer cast, then keep it simple and just do
> &*ptr.cast().
Ok.
Best regards,
Andreas Hindborg
© 2016 - 2026 Red Hat, Inc.