On Tue, 22 Sep 2020 12:09:19 +0800 Yafang Shao <laoar.shao@xxxxxxxxx> wrote: > > > Are there any methods to avoid un-inlining these wrappers ? > > > > > > For example, > > > // include/linux/mmap_lock.h > > > > > > void mmap_lock_start_trace_wrapper(); > > > void mmap_lock_acquire_trace_wrapper(); > > > > > > static inline void mmap_write_lock(struct mm_struct *mm) > > > { > > > mmap_lock_start_trace_wrapper(); > > > down_write(&mm->mmap_lock); > > > mmap_lock_acquire_trace_wrapper(); > > > } > > > > > > // mm/mmap_lock.c > > > void mmap_lock_start_trace_wrapper() > > > { > > > trace_mmap_lock_start(); > > > } > > > > > > void mmap_lock_start_trace_wrapper() > > > { > > > trace_mmap_lock_acquired(); > > > } > > > > We can do something like that, but I don't think it would end up being better. > > > > At the end of the day, because the trace stuff cannot be in the > > header, we have to add an extra function call one way or the other. > > This would just move the call one step further down the call stack. > > So, I don't think it would affect performance in the > > CONFIG_MMAP_LOCK_STATS + tracepoints not enabled at runtime case. > > > > Right, it seems we have to add an extra function call. > > > Also the wrappers aren't quite so simple as this, they need some > > parameters to work. (the struct mm_struct, whether it was a read or a > > write lock, and whether or not the lock operation succeeded), so it > > would mean adding more inlined code, which I think adds up to be a > > nontrivial amount since these wrappers are called so often in the > > kernel. > > > > If you feel strongly, let me know and I can send a version as you > > describe and we can compare the two. > > > > These tracepoints will be less useful if we have to turn on the config > to enable it. > I don't mind implementing it that way if we can't optimize it. > > Maybe Steven can give some suggestions, Steven ? > What you can do, and what we have done is the following: (see include/linux/page_ref.h) #ifdef CONFIG_TRACING extern struct tracepoint __tracepoint_mmap_lock_start_locking; extern struct tracepoint __tracepoint_mmap_lock_acquire_returned; #define mmap_lock_tracepoint_active(t) static_key_false(&(__tracepoint_mmap_lock_##t).key) #else #define mmap_lock_tracepoint_active(t) false #endif static inline void mmap_write_lock(struct mm_struct *mm) { if (mmap_lock_tracepoint_active(start_locking)) mmap_lock_start_trace_wrapper(); down_write(&mm->mmap_lock); if (mmap_lock_tracepoint_active(acquire_returned)) mmap_lock_acquire_trace_wrapper(); } -- Steve