diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 036ccf6f2d55..b15ef8586ae4 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -14,7 +14,7 @@ obj-$(CONFIG_VME_BUS) += vme_user/ obj-$(CONFIG_IIO) += iio/ obj-$(CONFIG_FB_SM750) += sm750fb/ obj-$(CONFIG_MFD_NVEC) += nvec/ -obj-$(CONFIG_ASHMEM) += android/ +obj-$(CONFIG_ANDROID_STAGING) += android/ obj-$(CONFIG_LTE_GDM724X) += gdm724x/ obj-$(CONFIG_FB_TFT) += fbtft/ obj-$(CONFIG_MOST) += most/ diff --git a/drivers/staging/android/Kconfig b/drivers/staging/android/Kconfig index 36f44131eea7..19d8416e484e 100644 --- a/drivers/staging/android/Kconfig +++ b/drivers/staging/android/Kconfig @@ -1,9 +1,25 @@ # SPDX-License-Identifier: GPL-2.0 menu "Android" +config ANDROID_STAGING + bool + config ASHMEM bool "Enable the Anonymous Shared Memory Subsystem" depends on SHMEM + select ANDROID_STAGING + help + The ashmem subsystem is a new shared memory allocator, similar to + POSIX SHM but with different behavior and sporting a simpler + file-based API. + + It is, in theory, a good memory allocator for low-memory devices, + because it can discard shared memory units when under memory pressure. + +config ASHMEM_RUST + bool "Enable the Anonymous Shared Memory Subsystem in Rust" + depends on SHMEM && RUST && !ASHMEM + select ANDROID_STAGING help The ashmem subsystem is a new shared memory allocator, similar to POSIX SHM but with different behavior and sporting a simpler diff --git a/drivers/staging/android/Makefile b/drivers/staging/android/Makefile index e9a55a5e6529..39121ac44581 100644 --- a/drivers/staging/android/Makefile +++ b/drivers/staging/android/Makefile @@ -2,3 +2,4 @@ ccflags-y += -I$(src) # needed for trace events obj-$(CONFIG_ASHMEM) += ashmem.o +obj-$(CONFIG_ASHMEM_RUST) += ashmem_rust.o diff --git a/drivers/staging/android/ashmem_rust.rs b/drivers/staging/android/ashmem_rust.rs new file mode 100644 index 000000000000..77de00d9e26a --- /dev/null +++ b/drivers/staging/android/ashmem_rust.rs @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0 + +// Copyright (C) 2024 Google LLC. + +//! Anonymous Shared Memory Subsystem for Android. +//! +//! The ashmem subsystem is a new shared memory allocator, similar to POSIX SHM but with different +//! behavior and sporting a simpler file-based API. +//! +//! It is, in theory, a good memory allocator for low-memory devices, because it can discard shared +//! memory units when under memory pressure. + +use core::pin::Pin; +use kernel::{ + c_str, + error::Result, + fs::File, + miscdevice::{MiscDevice, MiscDeviceOptions, MiscDeviceRegistration}, + prelude::*, +}; + +module! { + type: AshmemModule, + name: "ashmem_rust", + author: "Alice Ryhl", + description: "Anonymous Shared Memory Subsystem", + license: "GPL", +} + +struct AshmemModule { + _misc: Pin>>, +} + +impl kernel::Module for AshmemModule { + fn init(_module: &'static kernel::ThisModule) -> Result { + pr_info!("Using Rust implementation."); + + Ok(Self { + _misc: Box::pin_init( + MiscDeviceRegistration::register(MiscDeviceOptions { + name: c_str!("ashmem"), + }), + GFP_KERNEL, + )?, + }) + } +} + +/// Represents an open ashmem file. +#[pin_data] +struct Ashmem {} + +#[vtable] +impl MiscDevice for Ashmem { + type Ptr = Pin>; + + fn open(_: &File, _: &MiscDeviceRegistration) -> Result>> { + Box::try_pin_init(Ashmem {}, GFP_KERNEL) + } +}