Re: [PATCH RFC 1/4] slab, rcu: move TINY_RCU variant of kvfree_rcu() to SLAB

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jan 23, 2025 at 11:37:18AM +0100, Vlastimil Babka wrote:
> Following the move of TREE_RCU implementation, let's move also the
> TINY_RCU one for consistency and subsequent refactoring.
> 
> For simplicity, remove the separate inline __kvfree_call_rcu() as
> TINY_RCU is not meant for high-performance hardware anyway.
> 
> Declare kvfree_call_rcu() in rcupdate.h to avoid header dependency
> issues.
> 
> Also move the kvfree_rcu_barrier() declaration to slab.h
> 
> Signed-off-by: Vlastimil Babka <vbabka@xxxxxxx>
> ---
>  include/linux/rcupdate.h |  5 +++++
>  include/linux/rcutiny.h  | 36 ------------------------------------
>  include/linux/rcutree.h  |  3 ---
>  include/linux/slab.h     | 14 ++++++++++++++
>  kernel/rcu/tiny.c        | 11 -----------
>  mm/slab_common.c         | 20 ++++++++++++++++++--
>  6 files changed, 37 insertions(+), 52 deletions(-)
> 
> diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
> index 48e5c03df1dd83c246a61d0fcc8aa638adcd7654..3f70d1c8144426f40553c8c589f07097ece8a706 100644
> --- a/include/linux/rcupdate.h
> +++ b/include/linux/rcupdate.h
> @@ -1082,6 +1082,11 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)
>  #define kfree_rcu_mightsleep(ptr) kvfree_rcu_arg_1(ptr)
>  #define kvfree_rcu_mightsleep(ptr) kvfree_rcu_arg_1(ptr)
>  
> +/*
> + * In mm/slab_common.c, no suitable header to include here.
> + */
> +void kvfree_call_rcu(struct rcu_head *head, void *ptr);
> +
>  #define kvfree_rcu_arg_2(ptr, rhf)					\
>  do {									\
>  	typeof (ptr) ___p = (ptr);					\
> diff --git a/include/linux/rcutiny.h b/include/linux/rcutiny.h
> index fe42315f667fc5be7f2ed8eae6ea0c7193030846..f519cd6802286710bdd56588b5ff3d07bcd30b92 100644
> --- a/include/linux/rcutiny.h
> +++ b/include/linux/rcutiny.h
> @@ -90,41 +90,6 @@ static inline void synchronize_rcu_expedited(void)
>  	synchronize_rcu();
>  }
>  
> -/*
> - * Add one more declaration of kvfree() here. It is
> - * not so straight forward to just include <linux/mm.h>
> - * where it is defined due to getting many compile
> - * errors caused by that include.
> - */
> -extern void kvfree(const void *addr);
> -
> -static inline void __kvfree_call_rcu(struct rcu_head *head, void *ptr)
> -{
> -	if (head) {
> -		call_rcu(head, (rcu_callback_t) ((void *) head - ptr));
> -		return;
> -	}
> -
> -	// kvfree_rcu(one_arg) call.
> -	might_sleep();
> -	synchronize_rcu();
> -	kvfree(ptr);
> -}
> -
> -static inline void kvfree_rcu_barrier(void)
> -{
> -	rcu_barrier();
> -}
> -
> -#ifdef CONFIG_KASAN_GENERIC
> -void kvfree_call_rcu(struct rcu_head *head, void *ptr);
> -#else
> -static inline void kvfree_call_rcu(struct rcu_head *head, void *ptr)
> -{
> -	__kvfree_call_rcu(head, ptr);
> -}
> -#endif
> -
>  void rcu_qs(void);
>  
>  static inline void rcu_softirq_qs(void)
> @@ -164,7 +129,6 @@ static inline void rcu_end_inkernel_boot(void) { }
>  static inline bool rcu_inkernel_boot_has_ended(void) { return true; }
>  static inline bool rcu_is_watching(void) { return true; }
>  static inline void rcu_momentary_eqs(void) { }
> -static inline void kfree_rcu_scheduler_running(void) { }
>  
>  /* Avoid RCU read-side critical sections leaking across. */
>  static inline void rcu_all_qs(void) { barrier(); }
> diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h
> index 27d86d9127817e50f8d4dd79e1990d70a02435bb..dbe77b5fe06ec89a393b5444d6c479ced346a37b 100644
> --- a/include/linux/rcutree.h
> +++ b/include/linux/rcutree.h
> @@ -34,12 +34,9 @@ static inline void rcu_virt_note_context_switch(void)
>  }
>  
>  void synchronize_rcu_expedited(void);
> -void kvfree_call_rcu(struct rcu_head *head, void *ptr);
> -void kvfree_rcu_barrier(void);
>  
>  void rcu_barrier(void);
>  void rcu_momentary_eqs(void);
> -void kfree_rcu_scheduler_running(void);
>  
>  struct rcu_gp_oldstate {
>  	unsigned long rgos_norm;
> diff --git a/include/linux/slab.h b/include/linux/slab.h
> index 09eedaecf1205672bb2e7c8cd57ae8fccebc2737..bcc62e5656c35c6a3f4caf26fb33d7447dead39a 100644
> --- a/include/linux/slab.h
> +++ b/include/linux/slab.h
> @@ -16,6 +16,7 @@
>  #include <linux/gfp.h>
>  #include <linux/overflow.h>
>  #include <linux/types.h>
> +#include <linux/rcupdate.h>
>  #include <linux/workqueue.h>
>  #include <linux/percpu-refcount.h>
>  #include <linux/cleanup.h>
> @@ -1082,6 +1083,19 @@ extern void kvfree_sensitive(const void *addr, size_t len);
>  
>  unsigned int kmem_cache_size(struct kmem_cache *s);
>  
> +#ifdef CONFIG_TINY_RCU
> +static inline void kvfree_rcu_barrier(void)
> +{
> +	rcu_barrier();
> +}
> +
> +static inline void kfree_rcu_scheduler_running(void) { }
> +#else
> +void kvfree_rcu_barrier(void);
> +
> +void kfree_rcu_scheduler_running(void);
> +#endif
> +
>  /**
>   * kmalloc_size_roundup - Report allocation bucket size for the given size
>   *
> diff --git a/kernel/rcu/tiny.c b/kernel/rcu/tiny.c
> index b3b3ce34df6310f7bddba40b2be1bdf6c9f00232..0ec27093d0e14a4b1060ea08932c4ac13f9b0f26 100644
> --- a/kernel/rcu/tiny.c
> +++ b/kernel/rcu/tiny.c
> @@ -246,17 +246,6 @@ bool poll_state_synchronize_rcu(unsigned long oldstate)
>  }
>  EXPORT_SYMBOL_GPL(poll_state_synchronize_rcu);
>  
> -#ifdef CONFIG_KASAN_GENERIC
> -void kvfree_call_rcu(struct rcu_head *head, void *ptr)
> -{
> -	if (head)
> -		kasan_record_aux_stack_noalloc(ptr);
> -
> -	__kvfree_call_rcu(head, ptr);
> -}
> -EXPORT_SYMBOL_GPL(kvfree_call_rcu);
> -#endif
> -
>  void __init rcu_init(void)
>  {
>  	open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
> diff --git a/mm/slab_common.c b/mm/slab_common.c
> index 69f2d19010dedaa3e5b303ab9803c8cdd40152fa..330cdd8ebc5380090ee784c58e8ca1d1a52b3758 100644
> --- a/mm/slab_common.c
> +++ b/mm/slab_common.c
> @@ -1861,7 +1861,23 @@ add_ptr_to_bulk_krc_lock(struct kfree_rcu_cpu **krcp,
>  	return true;
>  }
>  
> -#if !defined(CONFIG_TINY_RCU)
> +#ifdef CONFIG_TINY_RCU
> +
> +void kvfree_call_rcu(struct rcu_head *head, void *ptr)
> +{
> +	if (head) {
> +		kasan_record_aux_stack_noalloc(ptr);
> +		call_rcu(head, (rcu_callback_t) ((void *) head - ptr));
> +		return;
> +	}
> +
> +	// kvfree_rcu(one_arg) call.
> +	might_sleep();
> +	synchronize_rcu();
> +	kvfree(ptr);
> +}
> +
> +#else /* !CONFIG_TINY_RCU */
>  
>  static enum hrtimer_restart
>  schedule_page_work_fn(struct hrtimer *t)
> @@ -2071,7 +2087,7 @@ void kvfree_rcu_barrier(void)
>  }
>  EXPORT_SYMBOL_GPL(kvfree_rcu_barrier);
>  
> -#endif /* #if !defined(CONFIG_TINY_RCU) */
> +#endif /* !CONFIG_TINY_RCU */
>  
>  static unsigned long
>  kfree_rcu_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
> 
> -- 
> 2.48.1
> 
Reviewed-by: Uladzislau Rezki (Sony) <urezki@xxxxxxxxx>

--
Uladzislau Rezki




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux