On 2/27/26 12:47 AM, Matthew Wood wrote: > Add support for `string` as a parameter type in the module! macro. > > On the runtime side, add: > - set_string_param(): an extern "C" callback matching the > kernel_param_ops::set signature that stores the raw C string > pointer directly into the SetOnce<StringParam> container, avoiding > an unnecessary copy-and-parse round-trip. > - PARAM_OPS_STRING: a static kernel_param_ops that uses > set_string_param as its setter. > - ModuleParam impl for StringParam with try_from_param_arg() > returning -EINVAL, since string parameters are populated > exclusively through the kernel's set callback. > > On the macro side: > - Change the Parameter::ptype field from Ident to syn::Type to > support path-qualified types.
Why is it necessary to change the type of Parameter::ptype? My understanding is that this token can currently be "i8", "u8", ..., "isize", "usize". Additionally, the value "string" should now be accepted. When should one use a path-qualified type in this context? > - Recognize the `string` shorthand and resolve it to the fully > qualified ::kernel::module_param::StringParam type during code > generation. > - Wrap string default values with StringParam::from_c_str(c_str!(...)) > to produce a compile-time CStr-backed default. > - Route `string` to PARAM_OPS_STRING in param_ops_path(). > > Signed-off-by: Matthew Wood <[email protected]> > --- > rust/kernel/module_param.rs | 48 +++++++++++++++++++++++++++++++++++++ > rust/macros/module.rs | 42 +++++++++++++++++++++++++------- > 2 files changed, 81 insertions(+), 9 deletions(-) > > diff --git a/rust/kernel/module_param.rs b/rust/kernel/module_param.rs > index 80fe8643c0ab..67ff6f2ea9c2 100644 > --- a/rust/kernel/module_param.rs > +++ b/rust/kernel/module_param.rs > @@ -86,6 +86,36 @@ pub trait ModuleParam: Sized + Copy { > }) > } > > +/// Set a string module parameter from a string. > +/// > +/// Similar to [`set_param`] but for [`StringParam`]. > +/// > +/// # Safety > +/// > +/// Same requirements as [`set_param`]. > +unsafe extern "C" fn set_string_param( > + val: *const c_char, > + param: *const bindings::kernel_param, > +) -> c_int { The safety comment is somewhat inaccurate because set_param() says that the input value needs to be valid only for the duration of the call, whereas set_string_param() and StringParam require it to be valid for the module's lifetime. -- Thanks, Petr

