Re: [PATCH v1 04/28] rust: samples: add `rust_print` example

Finn Behrens
2022-11-11T09:41:02Z

On 10 Nov 2022, at 17:41, Miguel Ojeda wrote:

> Add example to exercise the printing macros (`pr_*!`) introduced
> in the previous patches.
>
> Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
Reviewed-by: Finn Behrens <me@kloenk.dev>

> ---
> samples/rust/Kconfig | 10 +++++++
> samples/rust/Makefile | 1 +
> samples/rust/rust_print.rs | 54 ++++++++++++++++++++++++++++++++++++++
> 3 files changed, 65 insertions(+)
> create mode 100644 samples/rust/rust_print.rs
>
> diff --git a/samples/rust/Kconfig b/samples/rust/Kconfig
> index 841e0906e943..b0f74a81c8f9 100644
> --- a/samples/rust/Kconfig
> +++ b/samples/rust/Kconfig
> @@ -20,6 +20,16 @@ config SAMPLE_RUST_MINIMAL
>
> If unsure, say N.
>
> +config SAMPLE_RUST_PRINT
> + tristate "Printing macros"
> + help
> + This option builds the Rust printing macros sample.
> +
> + To compile this as a module, choose M here:
> + the module will be called rust_print.
> +
> + If unsure, say N.
> +
> config SAMPLE_RUST_HOSTPROGS
> bool "Host programs"
> help
> diff --git a/samples/rust/Makefile b/samples/rust/Makefile
> index 1daba5f8658a..03086dabbea4 100644
> --- a/samples/rust/Makefile
> +++ b/samples/rust/Makefile
> @@ -1,5 +1,6 @@
> # SPDX-License-Identifier: GPL-2.0
>
> obj-$(CONFIG_SAMPLE_RUST_MINIMAL) += rust_minimal.o
> +obj-$(CONFIG_SAMPLE_RUST_PRINT) += rust_print.o
>
> subdir-$(CONFIG_SAMPLE_RUST_HOSTPROGS) += hostprogs
> diff --git a/samples/rust/rust_print.rs b/samples/rust/rust_print.rs
> new file mode 100644
> index 000000000000..09f737790f3f
> --- /dev/null
> +++ b/samples/rust/rust_print.rs
> @@ -0,0 +1,54 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +//! Rust printing macros sample.
> +
> +use kernel::pr_cont;
> +use kernel::prelude::*;
> +
> +module! {
> + type: RustPrint,
> + name: b"rust_print",
> + author: b"Rust for Linux Contributors",
> + description: b"Rust printing macros sample",
> + license: b"GPL",
> +}
> +
> +struct RustPrint;
> +
> +impl kernel::Module for RustPrint {
> + fn init(_module: &'static ThisModule) -> Result<Self> {
> + pr_info!("Rust printing macros sample (init)\n");
> +
> + pr_emerg!("Emergency message (level 0) without args\n");
> + pr_alert!("Alert message (level 1) without args\n");
> + pr_crit!("Critical message (level 2) without args\n");
> + pr_err!("Error message (level 3) without args\n");
> + pr_warn!("Warning message (level 4) without args\n");
> + pr_notice!("Notice message (level 5) without args\n");
> + pr_info!("Info message (level 6) without args\n");
> +
> + pr_info!("A line that");
> + pr_cont!(" is continued");
> + pr_cont!(" without args\n");
> +
> + pr_emerg!("{} message (level {}) with args\n", "Emergency", 0);
> + pr_alert!("{} message (level {}) with args\n", "Alert", 1);
> + pr_crit!("{} message (level {}) with args\n", "Critical", 2);
> + pr_err!("{} message (level {}) with args\n", "Error", 3);
> + pr_warn!("{} message (level {}) with args\n", "Warning", 4);
> + pr_notice!("{} message (level {}) with args\n", "Notice", 5);
> + pr_info!("{} message (level {}) with args\n", "Info", 6);
> +
> + pr_info!("A {} that", "line");
> + pr_cont!(" is {}", "continued");
> + pr_cont!(" with {}\n", "args");
Could be nice, to also have an int or similar as arg, but as internal the same macro is used as above, not really of interest.

Regards,
Finn
> +
> + Ok(RustPrint)
> + }
> +}
> +
> +impl Drop for RustPrint {
> + fn drop(&mut self) {
> + pr_info!("Rust printing macros sample (exit)\n");
> + }
> +}
> --
> 2.38.1