Re: [PATCH v11 7/8] rust: miscdevice: add mmap support
From: Andreas Hindborg
Date: Mon Dec 16 2024 - 09:54:55 EST
"Alice Ryhl" <aliceryhl@xxxxxxxxxx> writes:
> Add the ability to write a file_operations->mmap hook in Rust when using
> the miscdevice abstraction. The `vma` argument to the `mmap` hook uses
> the `VmAreaNew` type from the previous commit; this type provides the
> correct set of operations for a file_operations->mmap hook.
>
> Acked-by: Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> (for mm bits)
> Signed-off-by: Alice Ryhl <aliceryhl@xxxxxxxxxx>
> ---
> rust/kernel/miscdevice.rs | 37 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 37 insertions(+)
>
> diff --git a/rust/kernel/miscdevice.rs b/rust/kernel/miscdevice.rs
> index 7e2a79b3ae26..e5366f9c6d7f 100644
> --- a/rust/kernel/miscdevice.rs
> +++ b/rust/kernel/miscdevice.rs
> @@ -11,6 +11,8 @@
> use crate::{
> bindings,
> error::{to_result, Error, Result, VTABLE_DEFAULT_ERROR},
> + fs::File,
> + mm::virt::VmAreaNew,
> prelude::*,
> str::CStr,
> types::{ForeignOwnable, Opaque},
> @@ -110,6 +112,15 @@ fn release(device: Self::Ptr) {
> drop(device);
> }
>
> + /// Handle for mmap.
> + fn mmap(
> + _device: <Self::Ptr as ForeignOwnable>::Borrowed<'_>,
> + _file: &File,
> + _vma: &VmAreaNew,
> + ) -> Result {
> + kernel::build_error!(VTABLE_DEFAULT_ERROR)
> + }
> +
> /// Handler for ioctls.
> ///
> /// The `cmd` argument is usually manipulated using the utilties in [`kernel::ioctl`].
> @@ -156,6 +167,7 @@ impl<T: MiscDevice> VtableHelper<T> {
> const VTABLE: bindings::file_operations = bindings::file_operations {
> open: Some(fops_open::<T>),
> release: Some(fops_release::<T>),
> + mmap: maybe_fn(T::HAS_MMAP, fops_mmap::<T>),
> unlocked_ioctl: maybe_fn(T::HAS_IOCTL, fops_ioctl::<T>),
> #[cfg(CONFIG_COMPAT)]
> compat_ioctl: if T::HAS_COMPAT_IOCTL {
> @@ -216,6 +228,31 @@ impl<T: MiscDevice> VtableHelper<T> {
> 0
> }
>
> +/// # Safety
> +///
> +/// `file` must be a valid file that is associated with a `MiscDeviceRegistration<T>`.
> +/// `vma` must be a vma that is currently being mmap'ed with this file.
> +unsafe extern "C" fn fops_mmap<T: MiscDevice>(
> + file: *mut bindings::file,
> + vma: *mut bindings::vm_area_struct,
> +) -> c_int {
> + // SAFETY: The mmap call of a file can access the private data.
> + let private = unsafe { (*file).private_data };
> + // SAFETY: Mmap calls can borrow the private data of the file.
This safety comment seems unrelated to the safety requirements of `ForeignOwnable::borrow`.
Best regards,
Andreas Hindborg