Re: [PATCH v4 2/2] kfence: skip all GFP_ZONEMASK allocations

From: Marco Elver
Date: Mon Jul 05 2021 - 10:06:07 EST


Andrew,

This series is ready to be picked up.

If possible, kindly consider including it in an upcoming batch of
mainline fixes.

Thank you!


On Wed, 30 Jun 2021 at 17:02, Alexander Potapenko <glider@xxxxxxxxxx> wrote:
> Allocation requests outside ZONE_NORMAL (MOVABLE, HIGHMEM or DMA) cannot
> be fulfilled by KFENCE, because KFENCE memory pool is located in a
> zone different from the requested one.
>
> Because callers of kmem_cache_alloc() may actually rely on the
> allocation to reside in the requested zone (e.g. memory allocations done
> with __GFP_DMA must be DMAable), skip all allocations done with
> GFP_ZONEMASK and/or respective SLAB flags (SLAB_CACHE_DMA and
> SLAB_CACHE_DMA32).
>
> Fixes: 0ce20dd84089 ("mm: add Kernel Electric-Fence infrastructure")
> Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
> Cc: Dmitry Vyukov <dvyukov@xxxxxxxxxx>
> Cc: Marco Elver <elver@xxxxxxxxxx>
> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
> Cc: Souptick Joarder <jrdr.linux@xxxxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx # 5.12+
> Signed-off-by: Alexander Potapenko <glider@xxxxxxxxxx>
> Reviewed-by: Marco Elver <elver@xxxxxxxxxx>
>
> ---
>
> v2:
> - added parentheses around the GFP clause, as requested by Marco
> v3:
> - ignore GFP_ZONEMASK, which also covers __GFP_HIGHMEM and __GFP_MOVABLE
> - move the flag check at the beginning of the function, as requested by
> Souptick Joarder
> v4:
> - minor fixes to description and comment formatting
> ---
> mm/kfence/core.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/mm/kfence/core.c b/mm/kfence/core.c
> index 33bb20d91bf6a..1cbdb62e6d0fb 100644
> --- a/mm/kfence/core.c
> +++ b/mm/kfence/core.c
> @@ -740,6 +740,15 @@ void *__kfence_alloc(struct kmem_cache *s, size_t size, gfp_t flags)
> if (size > PAGE_SIZE)
> return NULL;
>
> + /*
> + * Skip allocations from non-default zones, including DMA. We cannot
> + * guarantee that pages in the KFENCE pool will have the requested
> + * properties (e.g. reside in DMAable memory).
> + */
> + if ((flags & GFP_ZONEMASK) ||
> + (s->flags & (SLAB_CACHE_DMA | SLAB_CACHE_DMA32)))
> + return NULL;
> +
> /*
> * allocation_gate only needs to become non-zero, so it doesn't make
> * sense to continue writing to it and pay the associated contention
> --
> 2.32.0.93.g670b81a890-goog
>