fishinabarrel / linux-kernel-module-rust

Framework for writing Linux kernel modules in safe Rust
GNU General Public License v2.0
1.33k stars 119 forks source link

Automatically pass the right GFP flags depending on context #259

Open geofft opened 4 years ago

geofft commented 4 years ago

@joshtriplett proposed a more ambitious but easier-to-use way to solve the GFP_ flag problem (see also #258): have something like a thread-local variable that tracks what GFP flags you're allowed to use. Then you can just call kmalloc(GFP_AUTO) and have it figure things out for you.

This would be worthwhile in the upstream C code, ultimately, but it seems to make sense to start by implementing it just for Rust, because we can do things like

with_gfp(GFP_ATOMIC, || {
    let g = CriticalSectionGuard();
    let something = Box::new(...);
})

and C doesn't quite have comparable syntax - you'd need to manually put things back when you're out of the critical section.

nelhage commented 4 years ago

Hm, where would we stash the GFP flags? I'm not sure the kernel has a general thread-local mechanism. I think the usual play is to add a field to struct task_struct, but I can imagine pushback for doing that just to support Rust ergonomics. per-cpu variables are widely supported, but those only work if we can ensure we're pinned to a core.