All of lore.kernel.org
 help / color / mirror / Atom feed
From: glider@google.com
To: Andrew Morton <akpm@linux-foundation.org>,
	Vegard Nossum <vegard.nossum@oracle.com>,
	 Dmitry Vyukov <dvyukov@google.com>,
	Marco Elver <elver@google.com>,
	 Andrey Konovalov <andreyknvl@google.com>,
	linux-mm@kvack.org
Cc: glider@google.com, viro@zeniv.linux.org.uk,
	adilger.kernel@dilger.ca,  aryabinin@virtuozzo.com,
	luto@kernel.org, ard.biesheuvel@linaro.org,  arnd@arndb.de,
	hch@infradead.org, hch@lst.de, darrick.wong@oracle.com,
	 davem@davemloft.net, dmitry.torokhov@gmail.com,
	ebiggers@google.com,  edumazet@google.com, ericvh@gmail.com,
	gregkh@linuxfoundation.org,  harry.wentland@amd.com,
	herbert@gondor.apana.org.au, iii@linux.ibm.com,  mingo@elte.hu,
	jasowang@redhat.com, axboe@kernel.dk, m.szyprowski@samsung.com,
	 mark.rutland@arm.com, martin.petersen@oracle.com,
	schwidefsky@de.ibm.com,  willy@infradead.org, mst@redhat.com,
	mhocko@suse.com, monstr@monstr.eu,  pmladek@suse.com, cai@lca.pw,
	rdunlap@infradead.org, robin.murphy@arm.com,
	 sergey.senozhatsky@gmail.com, rostedt@goodmis.org,
	tiwai@suse.com,  tytso@mit.edu, tglx@linutronix.de,
	gor@linux.ibm.com, wsa@the-dreams.de
Subject: [PATCH v5 18/38] kmsan: mm: call KMSAN hooks from SLUB code
Date: Wed, 25 Mar 2020 17:12:29 +0100	[thread overview]
Message-ID: <20200325161249.55095-19-glider@google.com> (raw)
In-Reply-To: <20200325161249.55095-1-glider@google.com>

In order to report uninitialized memory coming from heap allocations
KMSAN has to poison them unless they're created with __GFP_ZERO.

It's handy that we need KMSAN hooks in the places where
init_on_alloc/init_on_free initialization is performed.

Signed-off-by: Alexander Potapenko <glider@google.com>
To: Alexander Potapenko <glider@google.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Vegard Nossum <vegard.nossum@oracle.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Marco Elver <elver@google.com>
Cc: Andrey Konovalov <andreyknvl@google.com>
Cc: linux-mm@kvack.org
---
v3:
 - reverted unrelated whitespace changes

Change-Id: I51103b7981d3aabed747d0c85cbdc85568665871
---
 mm/slub.c | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/mm/slub.c b/mm/slub.c
index 332d4b459a907..67c7f76bee412 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -21,6 +21,8 @@
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 #include <linux/kasan.h>
+#include <linux/kmsan.h>
+#include <linux/kmsan-checks.h> /* KMSAN_INIT_VALUE */
 #include <linux/cpu.h>
 #include <linux/cpuset.h>
 #include <linux/mempolicy.h>
@@ -283,17 +285,27 @@ static void prefetch_freepointer(const struct kmem_cache *s, void *object)
 	prefetch(object + s->offset);
 }
 
+/*
+ * When running under KMSAN, get_freepointer_safe() may return an uninitialized
+ * pointer value in the case the current thread loses the race for the next
+ * memory chunk in the freelist. In that case this_cpu_cmpxchg_double() in
+ * slab_alloc_node() will fail, so the uninitialized value won't be used, but
+ * KMSAN will still check all arguments of cmpxchg because of imperfect
+ * handling of inline assembly.
+ * To work around this problem, use KMSAN_INIT_VALUE() to force initialize the
+ * return value of get_freepointer_safe().
+ */
 static inline void *get_freepointer_safe(struct kmem_cache *s, void *object)
 {
 	unsigned long freepointer_addr;
 	void *p;
 
 	if (!debug_pagealloc_enabled_static())
-		return get_freepointer(s, object);
+		return KMSAN_INIT_VALUE(get_freepointer(s, object));
 
 	freepointer_addr = (unsigned long)object + s->offset;
 	probe_kernel_read(&p, (void **)freepointer_addr, sizeof(p));
-	return freelist_ptr(s, p, freepointer_addr);
+	return KMSAN_INIT_VALUE(freelist_ptr(s, p, freepointer_addr));
 }
 
 static inline void set_freepointer(struct kmem_cache *s, void *object, void *fp)
@@ -1411,6 +1423,7 @@ static inline void *kmalloc_large_node_hook(void *ptr, size_t size, gfp_t flags)
 	ptr = kasan_kmalloc_large(ptr, size, flags);
 	/* As ptr might get tagged, call kmemleak hook after KASAN. */
 	kmemleak_alloc(ptr, size, 1, flags);
+	kmsan_kmalloc_large(ptr, size, flags);
 	return ptr;
 }
 
@@ -1418,6 +1431,7 @@ static __always_inline void kfree_hook(void *x)
 {
 	kmemleak_free(x);
 	kasan_kfree_large(x, _RET_IP_);
+	kmsan_kfree_large(x);
 }
 
 static __always_inline bool slab_free_hook(struct kmem_cache *s, void *x)
@@ -1461,6 +1475,7 @@ static inline bool slab_free_freelist_hook(struct kmem_cache *s,
 	do {
 		object = next;
 		next = get_freepointer(s, object);
+		kmsan_slab_free(s, object);
 
 		if (slab_want_init_on_free(s)) {
 			/*
@@ -2784,6 +2799,7 @@ static __always_inline void *slab_alloc_node(struct kmem_cache *s,
 	if (unlikely(slab_want_init_on_alloc(gfpflags, s)) && object)
 		memset(object, 0, s->object_size);
 
+	kmsan_slab_alloc(s, object, gfpflags);
 	slab_post_alloc_hook(s, gfpflags, 1, &object);
 
 	return object;
@@ -3167,7 +3183,7 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size,
 			  void **p)
 {
 	struct kmem_cache_cpu *c;
-	int i;
+	int i, j;
 
 	/* memcg and kmem_cache debug support */
 	s = slab_pre_alloc_hook(s, flags);
@@ -3217,11 +3233,11 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size,
 
 	/* Clear memory outside IRQ disabled fastpath loop */
 	if (unlikely(slab_want_init_on_alloc(flags, s))) {
-		int j;
-
 		for (j = 0; j < i; j++)
 			memset(p[j], 0, s->object_size);
 	}
+	for (j = 0; j < i; j++)
+		kmsan_slab_alloc(s, p[j], flags);
 
 	/* memcg and kmem_cache debug support */
 	slab_post_alloc_hook(s, flags, size, p);
@@ -3829,6 +3845,7 @@ static int __init setup_slub_min_objects(char *str)
 
 __setup("slub_min_objects=", setup_slub_min_objects);
 
+__no_sanitize_memory
 void *__kmalloc(size_t size, gfp_t flags)
 {
 	struct kmem_cache *s;
@@ -5725,6 +5742,7 @@ static char *create_unique_id(struct kmem_cache *s)
 	p += sprintf(p, "%07u", s->size);
 
 	BUG_ON(p > name + ID_STR_LENGTH - 1);
+	kmsan_unpoison_shadow(name, p - name);
 	return name;
 }
 
@@ -5874,6 +5892,7 @@ static int sysfs_slab_alias(struct kmem_cache *s, const char *name)
 	al->name = name;
 	al->next = alias_list;
 	alias_list = al;
+	kmsan_unpoison_shadow(al, sizeof(struct saved_alias));
 	return 0;
 }
 
-- 
2.25.1.696.g5e7596f4ac-goog



  parent reply	other threads:[~2020-03-25 16:14 UTC|newest]

Thread overview: 94+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-25 16:12 [PATCH v5 00/38] Add KernelMemorySanitizer infrastructure glider
2020-03-25 16:12 ` [PATCH v5 01/38] stackdepot: reserve 5 extra bits in depot_stack_handle_t glider
2020-03-30 13:36   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 02/38] kmsan: add ReST documentation glider
2020-03-30 14:32   ` Andrey Konovalov
2020-04-13 14:45     ` Alexander Potapenko
2020-03-25 16:12 ` [PATCH v5 03/38] kmsan: gfp: introduce __GFP_NO_KMSAN_SHADOW glider
2020-03-25 16:19   ` Michal Hocko
2020-03-25 17:26     ` Alexander Potapenko
2020-03-25 17:40       ` Alexander Potapenko
2020-03-25 17:49         ` Matthew Wilcox
2020-03-25 18:03           ` Alexander Potapenko
2020-03-25 18:09             ` Matthew Wilcox
2020-03-25 18:30               ` Alexander Potapenko
2020-03-25 18:43                 ` Michal Hocko
2020-03-25 18:40           ` Michal Hocko
2020-03-25 18:38         ` Michal Hocko
2020-03-27 12:20           ` Alexander Potapenko
2020-04-25  9:45             ` Alexander Potapenko
2020-03-25 17:43       ` Michal Hocko
2020-03-25 16:12 ` [PATCH v5 04/38] kmsan: introduce __no_sanitize_memory and __SANITIZE_MEMORY__ glider
2020-03-30 13:37   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 05/38] kmsan: reduce vmalloc space glider
2020-03-30 13:48   ` Andrey Konovalov
2020-04-14 14:21     ` Alexander Potapenko
2020-04-23 19:14       ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 06/38] kmsan: add KMSAN runtime core glider
2020-03-25 16:12 ` [PATCH v5 07/38] kmsan: KMSAN compiler API implementation glider
2020-03-25 16:12 ` [PATCH v5 08/38] kmsan: add KMSAN hooks for kernel subsystems glider
2020-03-25 16:12 ` [PATCH v5 09/38] kmsan: stackdepot: don't allocate KMSAN metadata for stackdepot glider
2020-04-23 19:22   ` Andrey Konovalov
2020-04-25  9:46     ` Alexander Potapenko
2020-03-25 16:12 ` [PATCH v5 10/38] kmsan: define READ_ONCE_NOCHECK() glider
2020-04-23 19:20   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 11/38] kmsan: make READ_ONCE_TASK_STACK() return initialized values glider
2020-04-23 19:15   ` Andrey Konovalov
2020-04-23 19:18     ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 12/38] kmsan: x86: sync metadata pages on page fault glider
2020-04-23 19:15   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 13/38] kmsan: add tests for KMSAN glider
2020-04-23 19:02   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 14/38] crypto: kmsan: disable accelerated configs under KMSAN glider
2020-04-23 18:50   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 15/38] kmsan: x86: disable UNWINDER_ORC " glider
2020-04-14 17:52   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 16/38] kmsan: x86/asm: softirq: add KMSAN IRQ entry hooks glider
2020-04-14 17:54   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 17/38] kmsan: disable KMSAN instrumentation for certain kernel parts glider
2020-04-14 17:56   ` Andrey Konovalov
2020-03-25 16:12 ` glider [this message]
2020-03-25 16:12 ` [PATCH v5 19/38] kmsan: mm: maintain KMSAN metadata for page operations glider
2020-03-25 16:12 ` [PATCH v5 20/38] kmsan: handle memory sent to/from USB glider
2020-04-14 14:46   ` Andrey Konovalov
2020-04-14 15:50     ` Alan Stern
2020-04-14 17:48       ` Andrey Konovalov
2020-04-14 20:45         ` Alan Stern
2020-04-27 13:59           ` Alexander Potapenko
2020-03-25 16:12 ` [PATCH v5 21/38] kmsan: handle task creation and exiting glider
2020-03-25 16:12 ` [PATCH v5 22/38] kmsan: net: check the value of skb before sending it to the network glider
2020-04-27 14:02   ` Alexander Potapenko
2020-03-25 16:12 ` [PATCH v5 23/38] kmsan: printk: treat the result of vscnprintf() as initialized glider
2020-04-14 14:37   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 24/38] kmsan: disable instrumentation of certain functions glider
2020-04-14 15:04   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 25/38] kmsan: unpoison |tlb| in arch_tlb_gather_mmu() glider
2020-04-08 16:07   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 26/38] kmsan: use __msan_ string functions where possible glider
2020-03-25 16:12 ` [PATCH v5 27/38] kmsan: hooks for copy_to_user() and friends glider
2020-03-25 16:12 ` [PATCH v5 28/38] kmsan: init: call KMSAN initialization routines glider
2020-04-08 16:04   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 29/38] kmsan: enable KMSAN builds glider
2020-04-14 14:56   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 30/38] kmsan: handle /dev/[u]random glider
2020-04-08 16:03   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 31/38] kmsan: virtio: check/unpoison scatterlist in vring_map_one_sg() glider
2020-03-25 16:12 ` [PATCH v5 32/38] kmsan: disable strscpy() optimization under KMSAN glider
2020-04-08 16:00   ` Andrey Konovalov
2020-04-13 14:19     ` Alexander Potapenko
2020-04-13 15:32       ` Steven Rostedt
2020-04-13 16:16         ` Alexander Potapenko
2020-03-25 16:12 ` [PATCH v5 33/38] kmsan: add iomap support glider
2020-04-08 15:57   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 34/38] kmsan: dma: unpoison memory mapped by dma_direct_map_page() glider
2020-03-25 16:19   ` Christoph Hellwig
2020-03-27 17:03     ` Alexander Potapenko
2020-03-27 17:06       ` Christoph Hellwig
2020-03-27 18:46         ` Alexander Potapenko
2020-03-28  8:52           ` Christoph Hellwig
2020-04-14 15:26             ` Alexander Potapenko
2020-03-25 16:12 ` [PATCH v5 35/38] kmsan: disable physical page merging in biovec glider
2020-03-25 16:12 ` [PATCH v5 36/38] x86: kasan: kmsan: support CONFIG_GENERIC_CSUM on x86, enable it for KASAN/KMSAN glider
2020-04-08 15:53   ` Andrey Konovalov
2020-03-25 16:12 ` [PATCH v5 37/38] kmsan: x86/uprobes: unpoison regs in arch_uprobe_exception_notify() glider
2020-03-25 16:12 ` [PATCH v5 38/38] kmsan: block: skip bio block merging logic for KMSAN glider

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200325161249.55095-19-glider@google.com \
    --to=glider@google.com \
    --cc=adilger.kernel@dilger.ca \
    --cc=akpm@linux-foundation.org \
    --cc=andreyknvl@google.com \
    --cc=ard.biesheuvel@linaro.org \
    --cc=arnd@arndb.de \
    --cc=aryabinin@virtuozzo.com \
    --cc=axboe@kernel.dk \
    --cc=cai@lca.pw \
    --cc=darrick.wong@oracle.com \
    --cc=davem@davemloft.net \
    --cc=dmitry.torokhov@gmail.com \
    --cc=dvyukov@google.com \
    --cc=ebiggers@google.com \
    --cc=edumazet@google.com \
    --cc=elver@google.com \
    --cc=ericvh@gmail.com \
    --cc=gor@linux.ibm.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=harry.wentland@amd.com \
    --cc=hch@infradead.org \
    --cc=hch@lst.de \
    --cc=herbert@gondor.apana.org.au \
    --cc=iii@linux.ibm.com \
    --cc=jasowang@redhat.com \
    --cc=linux-mm@kvack.org \
    --cc=luto@kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=mark.rutland@arm.com \
    --cc=martin.petersen@oracle.com \
    --cc=mhocko@suse.com \
    --cc=mingo@elte.hu \
    --cc=monstr@monstr.eu \
    --cc=mst@redhat.com \
    --cc=pmladek@suse.com \
    --cc=rdunlap@infradead.org \
    --cc=robin.murphy@arm.com \
    --cc=rostedt@goodmis.org \
    --cc=schwidefsky@de.ibm.com \
    --cc=sergey.senozhatsky@gmail.com \
    --cc=tglx@linutronix.de \
    --cc=tiwai@suse.com \
    --cc=tytso@mit.edu \
    --cc=vegard.nossum@oracle.com \
    --cc=viro@zeniv.linux.org.uk \
    --cc=willy@infradead.org \
    --cc=wsa@the-dreams.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.