[RFC PATCH v2 28/30] rust: fs: add memalloc_nofs support
From: Wedson Almeida Filho
Date: Tue May 14 2024 - 09:27:27 EST
From: Wedson Almeida Filho <walmeida@xxxxxxxxxxxxx>
When used in filesystems obviates the need for GFP_NOFS.
Signed-off-by: Wedson Almeida Filho <wedsonaf@xxxxxxxxx>
---
rust/helpers.c | 12 ++++++++++++
rust/kernel/fs.rs | 12 ++++++++++++
2 files changed, 24 insertions(+)
diff --git a/rust/helpers.c b/rust/helpers.c
index edf12868962c..c26aa07cb20f 100644
--- a/rust/helpers.c
+++ b/rust/helpers.c
@@ -273,6 +273,18 @@ void *rust_helper_alloc_inode_sb(struct super_block *sb,
}
EXPORT_SYMBOL_GPL(rust_helper_alloc_inode_sb);
+unsigned int rust_helper_memalloc_nofs_save(void)
+{
+ return memalloc_nofs_save();
+}
+EXPORT_SYMBOL_GPL(rust_helper_memalloc_nofs_save);
+
+void rust_helper_memalloc_nofs_restore(unsigned int flags)
+{
+ memalloc_nofs_restore(flags);
+}
+EXPORT_SYMBOL_GPL(rust_helper_memalloc_nofs_restore);
+
void rust_helper_i_uid_write(struct inode *inode, uid_t uid)
{
i_uid_write(inode, uid);
diff --git a/rust/kernel/fs.rs b/rust/kernel/fs.rs
index 7a1c4884c370..b7a654546d23 100644
--- a/rust/kernel/fs.rs
+++ b/rust/kernel/fs.rs
@@ -417,6 +417,18 @@ impl<T: FileSystem + ?Sized> Tables<T> {
}
}
+/// Calls `cb` in a nofs allocation context.
+///
+/// That is, if an allocation happens within `cb`, it will have the `__GFP_FS` bit cleared.
+pub fn memalloc_nofs<T>(cb: impl FnOnce() -> T) -> T {
+ // SAFETY: Function is safe to be called from any context.
+ let flags = unsafe { bindings::memalloc_nofs_save() };
+ let ret = cb();
+ // SAFETY: Function is safe to be called from any context.
+ unsafe { bindings::memalloc_nofs_restore(flags) };
+ ret
+}
+
/// Kernel module that exposes a single file system implemented by `T`.
#[pin_data]
pub struct Module<T: FileSystem + ?Sized> {
--
2.34.1