[PATCH v13 2/5] rust: support formatting of foreign types

Benno Lossin lossin at kernel.org
Fri Jul 4 10:09:43 UTC 2025


On Fri Jul 4, 2025 at 1:23 AM CEST, Tamir Duberstein wrote:
> On Thu, Jul 3, 2025 at 6:41 PM Tamir Duberstein <tamird at gmail.com> wrote:
>> On Thu, Jul 3, 2025 at 4:36 PM Benno Lossin <lossin at kernel.org> wrote:
>> >
>> > I don't understand, can't you just do:
>> >
>> > * add `rust/kernel/fmt.rs`,
>> > * add `rust/macros/fmt.rs`,
>> > * change all occurrences of `core::fmt` to `kernel::fmt` and
>> >   `format_args!` to `fmt!`.
>>
>> Yes, such a split could be done - I will do so in the next spin
>>
>>
>> > The last one could be split by subsystem, no? Some subsystems might
>> > interact and thus need simultaneous splitting, but there should be some
>> > independent ones.
>>
>> Yes, it probably can. As you say, some subsystems might interact - the
>> claimed benefit of doing this subsystem-by-subsystem split is that it
>> avoids conflicts with ongoing work that will conflict with a large
>> patch, but this is also the downside; if ongoing work changes the set
>> of interactions between subsystems then a maintainer may find
>> themselves unable to emit the log message they want (because one
>> subsystem is using kernel::fmt while another is still on core::fmt).
>
> I gave this a try. I ran into the problem that `format_args!` (and,
> after this patch, `fmt!`) is at the center of `print_macro!`, which
> itself underpins various other formatting macros. This means we'd have
> to bifurcate the formatting infrastructure to support an incremental
> migration. That's quite a bit of code, and likely quite a mess in the
> resulting git history -- and that's setting aside the toil required to
> figure out the correct combinations of subsystems that must migrate
> together.

So here is what we can do without duplicating the logic, though it
requires multiple cycles:

1. We merge the two `fmt.rs` files & each subsystem merges an
   implementation of `kernel::fmt::Display` for their types, but keeps
   the `core::fmt::Display` impl around.
2. After all subsystems have merged the previous step, we change the
   implementations of `print_macro!` to use `fmt!` instead of
   `format_args!`.
3. We remove all occurrences of `core::fmt` (& replace them with
   `kernel::fmt`), removing the `core::fmt::Display` impls.

---
Cheers,
Benno


More information about the dri-devel mailing list