On Fri, Oct 23, 2020 at 02:21:15PM +0200, Daniel Vetter wrote:
> Extracted from slab.h, which seems to have the most complete version
> including the correct might_sleep() check. Roll it out to slob.c.
> 
> Motivated by a discussion with Paul about possibly changing call_rcu
> behaviour to allocate memory, but only roughly every 500th call.
> 
> There are a lot fewer places in the kernel that care about whether
> allocating memory is allowed or not (due to deadlocks with reclaim
> code) than places that care whether sleeping is allowed. But debugging
> these also tends to be a lot harder, so nice descriptive checks could
> come in handy. I might have some use eventually for annotations in
> drivers/gpu.
> 
> Note that unlike fs_reclaim_acquire/release gfpflags_allow_blocking
> does not consult the PF_MEMALLOC flags. But there is no flag
> equivalent for GFP_NOWAIT, hence this check can't go wrong due to
> memalloc_no*_save/restore contexts.
> 
> Cc: Paul E. McKenney <[email protected]>
> Cc: Christoph Lameter <[email protected]>
> Cc: Pekka Enberg <[email protected]>
> Cc: David Rientjes <[email protected]>
> Cc: Joonsoo Kim <[email protected]>
> Cc: Andrew Morton <[email protected]>
> Cc: Peter Zijlstra <[email protected]>
> Cc: Ingo Molnar <[email protected]>
> Cc: Vlastimil Babka <[email protected]>
> Cc: Mathieu Desnoyers <[email protected]>
> Cc: Sebastian Andrzej Siewior <[email protected]>
> Cc: Michel Lespinasse <[email protected]>
> Cc: Daniel Vetter <[email protected]>
> Cc: Waiman Long <[email protected]>
> Cc: Thomas Gleixner <[email protected]>
> Cc: Randy Dunlap <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Cc: Dave Chinner <[email protected]>
> Cc: Qian Cai <[email protected]>
> Cc: [email protected]
> Signed-off-by: Daniel Vetter <[email protected]>

Nice!!!

Acked-by: Paul E. McKenney <[email protected]>

> ---
>  include/linux/sched/mm.h | 16 ++++++++++++++++
>  mm/slab.h                |  5 +----
>  mm/slob.c                |  6 ++----
>  3 files changed, 19 insertions(+), 8 deletions(-)
> 
> diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h
> index f889e332912f..2b0037abac0b 100644
> --- a/include/linux/sched/mm.h
> +++ b/include/linux/sched/mm.h
> @@ -205,6 +205,22 @@ static inline void fs_reclaim_acquire(gfp_t gfp_mask) { }
>  static inline void fs_reclaim_release(gfp_t gfp_mask) { }
>  #endif
>  
> +/**
> + * might_alloc - Marks possible allocation sites
> + * @gfp_mask: gfp_t flags that would be use to allocate
> + *
> + * Similar to might_sleep() and other annotations this can be used in 
> functions
> + * that might allocate, but often dont. Compiles to nothing without
> + * CONFIG_LOCKDEP. Includes a conditional might_sleep() if @gfp allows 
> blocking.
> + */
> +static inline void might_alloc(gfp_t gfp_mask)
> +{
> +     fs_reclaim_acquire(gfp_mask);
> +     fs_reclaim_release(gfp_mask);
> +
> +     might_sleep_if(gfpflags_allow_blocking(gfp_mask));
> +}
> +
>  /**
>   * memalloc_noio_save - Marks implicit GFP_NOIO allocation scope.
>   *
> diff --git a/mm/slab.h b/mm/slab.h
> index 6cc323f1313a..fedd789b2270 100644
> --- a/mm/slab.h
> +++ b/mm/slab.h
> @@ -492,10 +492,7 @@ static inline struct kmem_cache 
> *slab_pre_alloc_hook(struct kmem_cache *s,
>  {
>       flags &= gfp_allowed_mask;
>  
> -     fs_reclaim_acquire(flags);
> -     fs_reclaim_release(flags);
> -
> -     might_sleep_if(gfpflags_allow_blocking(flags));
> +     might_alloc(flags);
>  
>       if (should_failslab(s, flags))
>               return NULL;
> diff --git a/mm/slob.c b/mm/slob.c
> index 7cc9805c8091..8d4bfa46247f 100644
> --- a/mm/slob.c
> +++ b/mm/slob.c
> @@ -474,8 +474,7 @@ __do_kmalloc_node(size_t size, gfp_t gfp, int node, 
> unsigned long caller)
>  
>       gfp &= gfp_allowed_mask;
>  
> -     fs_reclaim_acquire(gfp);
> -     fs_reclaim_release(gfp);
> +     might_alloc(gfp);
>  
>       if (size < PAGE_SIZE - minalign) {
>               int align = minalign;
> @@ -597,8 +596,7 @@ static void *slob_alloc_node(struct kmem_cache *c, gfp_t 
> flags, int node)
>  
>       flags &= gfp_allowed_mask;
>  
> -     fs_reclaim_acquire(flags);
> -     fs_reclaim_release(flags);
> +     might_alloc(flags);
>  
>       if (c->size < PAGE_SIZE) {
>               b = slob_alloc(c->size, flags, c->align, node, 0);
> -- 
> 2.28.0
> 
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to