On Thu, Nov 30, 2023 at 01:46:36PM +0100, Christian Brauner wrote: > On Wed, Nov 29, 2023 at 05:48:15PM +0100, Peter Zijlstra wrote: > > On Wed, Nov 29, 2023 at 05:28:27PM +0100, Christian Brauner wrote: > > > > > > +pid_t rust_helper_task_tgid_nr_ns(struct task_struct *tsk, > > > > + struct pid_namespace *ns) > > > > +{ > > > > + return task_tgid_nr_ns(tsk, ns); > > > > +} > > > > +EXPORT_SYMBOL_GPL(rust_helper_task_tgid_nr_ns); > > > > > > I'm a bit puzzled by all these rust_helper_*() calls. Can you explain > > > why they are needed? Because they are/can be static inlines and that > > > somehow doesn't work? > > > > Correct, because Rust can only talk to C ABI, it cannot use C headers. > > Bindgen would need to translate the full C headers into valid Rust for > > that to work. > > > > I really think the Rust peoples should spend more effort on that, > > because you are quite right, all this wrappery is tedious at best. I suspect even if the manpower existed to go that route we'd end up regretting it, because then the Rust compiler would need to be able to handle _all_ the craziness a modern C compiler knows how to do - preprocessor magic/devilry isn't even the worst of it, it gets even worse when you start to consider things like bitfields and all the crazy __attributes__(()) people have invented. Swift went that route, but they have Apple funding them, and I doubt even they would want anything to do with Linux kernel C. IOW: yes, the extra friction from not being able to do full C -> Rust translation is annoying now, but probably a good thing in the long run. > The problem is that we end up with a long list of explicit exports that > also are all really weirdly named like rust_helper_*(). I wouldn't even > complain if it they were somehow auto-generated but as you say that > might be out of scope. I think we'd need help from the C side to auto generate them - what we really want is for them to be inline, not static inline, but of course that has never really worked for functions used across a single C file. But maybe C compiler people are smarter these days? Just a keyword to to tell the C compiler "take this static inline and generate a compiled version in this .c file" would be all we need. I could see it being handy for other things, too: as Linus has been saying, we tend to inline too much code these days, and part of the reason for that is we make a function inline because of the _one_ fastpath that needs it, but there's 3 more slowpaths that don't. And right now we don't have any sane way of having a function be available with both inlined and outlined versions, besides the same kind of manual wrappers the Rust people are doing here... so we should probably just fix that.