All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] kfence: skip DMA allocations
@ 2021-06-29 13:00 ` Alexander Potapenko
  0 siblings, 0 replies; 4+ messages in thread
From: Alexander Potapenko @ 2021-06-29 13:00 UTC (permalink / raw)
  To: akpm; +Cc: dvyukov, elver, linux-kernel, linux-mm, stable, Alexander Potapenko

Allocation requests with __GFP_DMA/__GFP_DMA32 or
SLAB_CACHE_DMA/SLAB_CACHE_DMA32 cannot be fulfilled by KFENCE, because
they must reside in low memory, whereas KFENCE memory pool is located in
high memory.

Skip such allocations to avoid crashes where DMAable memory is expected.

Fixes: 0ce20dd84089 ("mm: add Kernel Electric-Fence infrastructure")
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Marco Elver <elver@google.com>
Cc: stable@vger.kernel.org # 5.12+
Signed-off-by: Alexander Potapenko <glider@google.com>
---
 mm/kfence/core.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/mm/kfence/core.c b/mm/kfence/core.c
index 4d21ac44d5d35..fd70089bd2808 100644
--- a/mm/kfence/core.c
+++ b/mm/kfence/core.c
@@ -760,6 +760,14 @@ void *__kfence_alloc(struct kmem_cache *s, size_t size, gfp_t flags)
 	if (size > PAGE_SIZE)
 		return NULL;
 
+	/*
+	 * Skip DMA allocations. These must reside in the low memory, which we
+	 * cannot guarantee.
+	 */
+	if (flags & (__GFP_DMA | __GFP_DMA32) ||
+	    (s->flags & (SLAB_CACHE_DMA | SLAB_CACHE_DMA32)))
+		return NULL;
+
 	return kfence_guarded_alloc(s, size, flags);
 }
 
-- 
2.32.0.93.g670b81a890-goog


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH] kfence: skip DMA allocations
@ 2021-06-29 13:00 ` Alexander Potapenko
  0 siblings, 0 replies; 4+ messages in thread
From: Alexander Potapenko @ 2021-06-29 13:00 UTC (permalink / raw)
  To: akpm; +Cc: dvyukov, elver, linux-kernel, linux-mm, stable, Alexander Potapenko

Allocation requests with __GFP_DMA/__GFP_DMA32 or
SLAB_CACHE_DMA/SLAB_CACHE_DMA32 cannot be fulfilled by KFENCE, because
they must reside in low memory, whereas KFENCE memory pool is located in
high memory.

Skip such allocations to avoid crashes where DMAable memory is expected.

Fixes: 0ce20dd84089 ("mm: add Kernel Electric-Fence infrastructure")
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Marco Elver <elver@google.com>
Cc: stable@vger.kernel.org # 5.12+
Signed-off-by: Alexander Potapenko <glider@google.com>
---
 mm/kfence/core.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/mm/kfence/core.c b/mm/kfence/core.c
index 4d21ac44d5d35..fd70089bd2808 100644
--- a/mm/kfence/core.c
+++ b/mm/kfence/core.c
@@ -760,6 +760,14 @@ void *__kfence_alloc(struct kmem_cache *s, size_t size, gfp_t flags)
 	if (size > PAGE_SIZE)
 		return NULL;
 
+	/*
+	 * Skip DMA allocations. These must reside in the low memory, which we
+	 * cannot guarantee.
+	 */
+	if (flags & (__GFP_DMA | __GFP_DMA32) ||
+	    (s->flags & (SLAB_CACHE_DMA | SLAB_CACHE_DMA32)))
+		return NULL;
+
 	return kfence_guarded_alloc(s, size, flags);
 }
 
-- 
2.32.0.93.g670b81a890-goog



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] kfence: skip DMA allocations
  2021-06-29 13:00 ` Alexander Potapenko
@ 2021-06-29 13:05   ` Marco Elver
  -1 siblings, 0 replies; 4+ messages in thread
From: Marco Elver @ 2021-06-29 13:05 UTC (permalink / raw)
  To: Alexander Potapenko; +Cc: akpm, dvyukov, linux-kernel, linux-mm, stable

On Tue, 29 Jun 2021 at 15:00, Alexander Potapenko <glider@google.com> wrote:
[...]
> +       /*
> +        * Skip DMA allocations. These must reside in the low memory, which we
> +        * cannot guarantee.
> +        */
> +       if (flags & (__GFP_DMA | __GFP_DMA32) ||

I think we want braces around "flags & (...)", so that this becomes:

    if ((flags & (...)) ||

> +           (s->flags & (SLAB_CACHE_DMA | SLAB_CACHE_DMA32)))
> +               return NULL;

Thanks,
-- Marco

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] kfence: skip DMA allocations
@ 2021-06-29 13:05   ` Marco Elver
  0 siblings, 0 replies; 4+ messages in thread
From: Marco Elver @ 2021-06-29 13:05 UTC (permalink / raw)
  To: Alexander Potapenko; +Cc: akpm, dvyukov, linux-kernel, linux-mm, stable

On Tue, 29 Jun 2021 at 15:00, Alexander Potapenko <glider@google.com> wrote:
[...]
> +       /*
> +        * Skip DMA allocations. These must reside in the low memory, which we
> +        * cannot guarantee.
> +        */
> +       if (flags & (__GFP_DMA | __GFP_DMA32) ||

I think we want braces around "flags & (...)", so that this becomes:

    if ((flags & (...)) ||

> +           (s->flags & (SLAB_CACHE_DMA | SLAB_CACHE_DMA32)))
> +               return NULL;

Thanks,
-- Marco


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-06-29 13:05 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-29 13:00 [PATCH] kfence: skip DMA allocations Alexander Potapenko
2021-06-29 13:00 ` Alexander Potapenko
2021-06-29 13:05 ` Marco Elver
2021-06-29 13:05   ` Marco Elver

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.