# Re: \[PATCH 3/3\] rust: add tracepoint support

- From: Mathieu Desnoyers \<mathieu.desnoyers@efficios.com\>
- Date: 2024-06-06 16:18:03 
- List: linux-trace-kernel
- Page: https://ratatoskr.run/linux-trace-kernel/2024/06/2629082
- Thread: https://ratatoskr.run/linux-trace-kernel/2024/06/2628941/t.md

```text
On 2024-06-06 11:49, Boqun Feng wrote:
> On Thu, Jun 06, 2024 at 11:30:03AM -0400, Mathieu Desnoyers wrote:
>> On 2024-06-06 11:05, Alice Ryhl wrote:
>>> Make it possible to have Rust code call into tracepoints defined by C
>>> code. It is still required that the tracepoint is declared in a C
>>> header, and that this header is included in the input to bindgen.
>>>
>>> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
>>
>> [...]
>>
>>> diff --git a/rust/helpers.c b/rust/helpers.c
>>> index 2c37a0f5d7a8..0560cc2a512a 100644
>>> --- a/rust/helpers.c
>>> +++ b/rust/helpers.c
>>> @@ -165,6 +165,30 @@ rust_helper_krealloc(const void *objp, size_t new_size, gfp_t flags)
>>>    }
>>>    EXPORT_SYMBOL_GPL(rust_helper_krealloc);
>>> +void rust_helper_preempt_enable_notrace(void)
>>> +{
>>> +	preempt_enable_notrace();
>>> +}
>>> +EXPORT_SYMBOL_GPL(rust_helper_preempt_enable_notrace);
>>> +
>>> +void rust_helper_preempt_disable_notrace(void)
>>> +{
>>> +	preempt_disable_notrace();
>>> +}
>>> +EXPORT_SYMBOL_GPL(rust_helper_preempt_disable_notrace);
>>> +
>>> +bool rust_helper_current_cpu_online(void)
>>> +{
>>> +	return cpu_online(raw_smp_processor_id());
>>> +}
>>> +EXPORT_SYMBOL_GPL(rust_helper_current_cpu_online);
>>> +
>>> +void *rust_helper___rcu_dereference_raw(void **p)
>>> +{
>>> +	return rcu_dereference_raw(p);
>>> +}
>>> +EXPORT_SYMBOL_GPL(rust_helper___rcu_dereference_raw);
>>
>> Ouch. Doing a function call for each of those small operations will
>> have a rather large performance impact when tracing is active. If it is
>
> Long-term plan is to 1) compile the C helpers in some IR and 2) inline
> the helpers with Rust in IR-level, as what Gary has:
>
> 	https://lore.kernel.org/rust-for-linux/20240529202817.3641974-1-gary@garyguo.net/
>
> and I use it for the upcoming atomic API support:
>
> 	https://github.com/fbq/linux/tree/dev/rust/atomic-rfc
>
> and it works very well.

Thanks for the pointers, it makes sense.

Thanks,

Mathieu

> 	
> Regards,
> Boqun
>
>> not possible to inline those in Rust, then implementing __DO_TRACE in
>> a C function would at least allow Rust to only do a single call to C
>> rather than go back and forth between Rust and C.
>>
>> What prevents inlining those helpers in Rust ?
>>
>> Thanks,
>>
>> Mathieu
>>
>> -- 
>> Mathieu Desnoyers
>> EfficiOS Inc.
>> https://www.efficios.com
>>

-- 
Mathieu Desnoyers
EfficiOS Inc.
https://www.efficios.com

```
