Message ID | 20250202-rust-page-v1-3-e3170d7fe55e@asahilina.net (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | rust: page: Support borrowing `struct page` and physaddr conversion | expand |
On Sun, Feb 2, 2025 at 2:06 PM Asahi Lina <lina@asahilina.net> wrote: > > Lets users do (unsafe) complex page read/write operations without having > to repeatedly call into read_raw()/write_raw() (which may be expensive > in some cases). > > The functions themselves are not unsafe, but they do take a closure that > receives a raw pointer, so actually making the access requires unsafe > code. > > Signed-off-by: Asahi Lina <lina@asahilina.net> Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Asahi Lina <lina@asahilina.net> writes: > Lets users do (unsafe) complex page read/write operations without having > to repeatedly call into read_raw()/write_raw() (which may be expensive > in some cases). > > The functions themselves are not unsafe, but they do take a closure that > receives a raw pointer, so actually making the access requires unsafe > code. > > Signed-off-by: Asahi Lina <lina@asahilina.net> Reviewed-by: Fiona Behrens <me@kloenk.dev>
diff --git a/rust/kernel/page.rs b/rust/kernel/page.rs index 0b6cbe02522ab6e6e1810288ad23af4e4aa587d8..fe5f879f9d1a86083fd55c682fad9d52466f79a2 100644 --- a/rust/kernel/page.rs +++ b/rust/kernel/page.rs @@ -101,7 +101,7 @@ pub fn as_ptr(&self) -> *mut bindings::page { /// different addresses. However, even if the addresses are different, the underlying memory is /// still the same for these purposes (e.g., it's still a data race if they both write to the /// same underlying byte at the same time). - fn with_page_mapped<T>(&self, f: impl FnOnce(*mut u8) -> T) -> T { + pub fn with_page_mapped<T>(&self, f: impl FnOnce(*mut u8) -> T) -> T { // SAFETY: `page` is valid due to the type invariants on `Page`. let mapped_addr = unsafe { bindings::kmap_local_page(self.as_ptr()) }; @@ -142,7 +142,7 @@ fn with_page_mapped<T>(&self, f: impl FnOnce(*mut u8) -> T) -> T { /// different addresses. However, even if the addresses are different, the underlying memory is /// still the same for these purposes (e.g., it's still a data race if they both write to the /// same underlying byte at the same time). - fn with_pointer_into_page<T>( + pub fn with_pointer_into_page<T>( &self, off: usize, len: usize,
Lets users do (unsafe) complex page read/write operations without having to repeatedly call into read_raw()/write_raw() (which may be expensive in some cases). The functions themselves are not unsafe, but they do take a closure that receives a raw pointer, so actually making the access requires unsafe code. Signed-off-by: Asahi Lina <lina@asahilina.net> --- rust/kernel/page.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)