Re: [PATCH 2/8] rust: module_param: wire StringParam into the module! macro

From: Petr Pavlu

Date: Wed Mar 04 2026 - 03:14:45 EST


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 <thepacketgeek@xxxxxxxxx>
> ---
> 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