On Fri, Jul 24, 2020 at 08:05:48AM +0300, Jarkko Sakkinen wrote:
> Add lock_modules() and unlock_modules() wrappers for acquiring module_mutex
> in order to remove the compile time dependency to it.
> 
> Cc: linux...@kvack.org
> Cc: Andi Kleen <a...@linux.intel.com>
> Cc: Peter Zijlstra <pet...@infradead.org>
> Suggested-by: Masami Hiramatsu <mhira...@kernel.org>
> Signed-off-by: Jarkko Sakkinen <jarkko.sakki...@linux.intel.com>
> ---
>  include/linux/module.h      | 18 ++++++++++++++++++
>  kernel/kprobes.c            |  4 ++--
>  kernel/trace/trace_kprobe.c |  4 ++--
>  3 files changed, 22 insertions(+), 4 deletions(-)

Any reason to convert only kprobes to the new API and leave others with
opencoded implementation?
 
> 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
> 

-- 
Sincerely yours,
Mike.

Reply via email to