On Fri, 24 Jul 2020 08:05:48 +0300 Jarkko Sakkinen <jarkko.sakkinen@xxxxxxxxxxxxxxx> wrote: > Add lock_modules() and unlock_modules() wrappers for acquiring module_mutex > in order to remove the compile time dependency to it. This subject is a bit confusing. This is just wrapping modules_mutex in kpprobes. We still have compile time dependency, e.g. module_state, right? Thank you, > > Cc: linux-mm@xxxxxxxxx > Cc: Andi Kleen <ak@xxxxxxxxxxxxxxx> > Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > Suggested-by: Masami Hiramatsu <mhiramat@xxxxxxxxxx> > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@xxxxxxxxxxxxxxx> > --- > include/linux/module.h | 18 ++++++++++++++++++ > kernel/kprobes.c | 4 ++-- > kernel/trace/trace_kprobe.c | 4 ++-- > 3 files changed, 22 insertions(+), 4 deletions(-) > > diff --git a/include/linux/module.h b/include/linux/module.h > index 2e6670860d27..8850b9692b8f 100644 > --- a/include/linux/module.h > +++ b/include/linux/module.h > @@ -705,6 +705,16 @@ static inline bool is_livepatch_module(struct module *mod) > bool is_module_sig_enforced(void); > void set_module_sig_enforced(void); > > +static inline void lock_modules(void) > +{ > + mutex_lock(&module_mutex); > +} > + > +static inline void unlock_modules(void) > +{ > + mutex_unlock(&module_mutex); > +} > + > #else /* !CONFIG_MODULES... */ > > static inline struct module *__module_address(unsigned long addr) > @@ -852,6 +862,14 @@ void *dereference_module_function_descriptor(struct module *mod, void *ptr) > return ptr; > } > > +static inline void lock_modules(void) > +{ > +} > + > +static inline void unlock_modules(void) > +{ > +} > + > #endif /* CONFIG_MODULES */ > > #ifdef CONFIG_SYSFS > diff --git a/kernel/kprobes.c b/kernel/kprobes.c > index 2e97febeef77..4e46d96d4e16 100644 > --- a/kernel/kprobes.c > +++ b/kernel/kprobes.c > @@ -564,7 +564,7 @@ static void kprobe_optimizer(struct work_struct *work) > cpus_read_lock(); > mutex_lock(&text_mutex); > /* Lock modules while optimizing kprobes */ > - mutex_lock(&module_mutex); > + lock_modules(); > > /* > * Step 1: Unoptimize kprobes and collect cleaned (unused and disarmed) > @@ -589,7 +589,7 @@ static void kprobe_optimizer(struct work_struct *work) > /* Step 4: Free cleaned kprobes after quiesence period */ > do_free_cleaned_kprobes(); > > - mutex_unlock(&module_mutex); > + unlock_modules(); > mutex_unlock(&text_mutex); > cpus_read_unlock(); > > diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c > index aefb6065b508..710ec6a6aa8f 100644 > --- a/kernel/trace/trace_kprobe.c > +++ b/kernel/trace/trace_kprobe.c > @@ -122,9 +122,9 @@ static nokprobe_inline bool trace_kprobe_module_exist(struct trace_kprobe *tk) > if (!p) > return true; > *p = '\0'; > - mutex_lock(&module_mutex); > + lock_modules(); > ret = !!find_module(tk->symbol); > - mutex_unlock(&module_mutex); > + unlock_modules(); > *p = ':'; > > return ret; > -- > 2.25.1 > -- Masami Hiramatsu <mhiramat@xxxxxxxxxx>