mm-commits.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Vlastimil Babka <vbabka@suse.cz>
To: Andrew Morton <akpm@linux-foundation.org>,
	cl@linux.com, glittao@gmail.com, iamjoonsoo.kim@lge.com,
	linux-mm@kvack.org, mm-commits@vger.kernel.org,
	penberg@kernel.org, rientjes@google.com,
	torvalds@linux-foundation.org
Subject: Re: [patch 030/178] kunit: add a KUnit test for SLUB debugging functionality
Date: Fri, 30 Apr 2021 10:50:52 +0200	[thread overview]
Message-ID: <dbbb7b43-37fa-b026-45af-b10cc0672ccb@suse.cz> (raw)
In-Reply-To: <20210430055445.hpofzhr9G%akpm@linux-foundation.org>

On 4/30/21 7:54 AM, Andrew Morton wrote:
> From: Oliver Glitta <glittao@gmail.com>
> Subject: kunit: add a KUnit test for SLUB debugging functionality
> 
> SLUB has resiliency_test() function which is hidden behind #ifdef
> SLUB_RESILIENCY_TEST that is not part of Kconfig, so nobody runs it. 
> KUnit should be a proper replacement for it.
> 
> Try changing byte in redzone after allocation and changing pointer to next
> free node, first byte, 50th byte and redzone byte.  Check if validation
> finds errors.
> 
> There are several differences from the original resiliency test: Tests
> create own caches with known state instead of corrupting shared kmalloc
> caches.
> 
> The corruption of freepointer uses correct offset, the original resiliency
> test got broken with freepointer changes.
> 
> Scratch changing random byte test, because it does not have meaning in
> this form where we need deterministic results.
> 
> Add new option CONFIG_SLUB_KUNIT_TEST in Kconfig.
> 
> Add a counter field "errors" to struct kmem_cache to count number of
> errors detected in cache.
> 
> Silence bug report in SLUB test.  Add SLAB_SILENT_ERRORS debug flag.  Add
> SLAB_SILENT_ERRORS flag to SLAB_NEVER_MERGE, SLAB_DEBUG_FLAGS,
> SLAB_FLAGS_PERMITTED macros.
> 
> Link: https://lkml.kernel.org/r/20210331085156.5028-1-glittao@gmail.com
> Signed-off-by: Oliver Glitta <glittao@gmail.com>
> Acked-by: Vlastimil Babka <vbabka@suse.cz>
> Cc: Christoph Lameter <cl@linux.com>
> Cc: David Rientjes <rientjes@google.com>
> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
> Cc: Pekka Enberg <penberg@kernel.org>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Hi, but this is v3 [1]. Then there was v4 [2] (with a prerequisity [3]) with
many changes after feedback with kunit folks, which would be better. We could
apply v4 as improvement later but there would be extra churn (even the test .c
file is named differently). Merging v4 directly would make more sense.

Anyway "[patch 031/178] slub: remove resiliency_test() function" (which the
kunit test replaces) can go either way as that code is dead and broken.

Thanks.

[1] https://lkml.kernel.org/r/20210331085156.5028-1-glittao@gmail.com
[2] https://lore.kernel.org/linux-kselftest/20210413100747.4921-2-glittao@gmail.com/
[3] https://lore.kernel.org/linux-kselftest/20210413100747.4921-1-glittao@gmail.com/


> ---
> 
>  include/linux/slab.h     |    2 
>  include/linux/slub_def.h |    2 
>  lib/Kconfig.debug        |    5 +
>  lib/Makefile             |    1 
>  lib/test_slub.c          |  124 +++++++++++++++++++++++++++++++++++++
>  mm/slab.h                |    7 +-
>  mm/slab_common.c         |    2 
>  mm/slub.c                |   64 +++++++++++++------
>  8 files changed, 184 insertions(+), 23 deletions(-)
> 
> --- a/include/linux/slab.h~kunit-add-a-kunit-test-for-slub-debugging-functionality
> +++ a/include/linux/slab.h
> @@ -25,6 +25,8 @@
>   */
>  /* DEBUG: Perform (expensive) checks on alloc/free */
>  #define SLAB_CONSISTENCY_CHECKS	((slab_flags_t __force)0x00000100U)
> +/* DEBUG: Silent bug reports */
> +#define SLAB_SILENT_ERRORS	((slab_flags_t __force)0x00000200U)
>  /* DEBUG: Red zone objs in a cache */
>  #define SLAB_RED_ZONE		((slab_flags_t __force)0x00000400U)
>  /* DEBUG: Poison objects */
> --- a/include/linux/slub_def.h~kunit-add-a-kunit-test-for-slub-debugging-functionality
> +++ a/include/linux/slub_def.h
> @@ -133,6 +133,8 @@ struct kmem_cache {
>  	unsigned int usersize;		/* Usercopy region size */
>  
>  	struct kmem_cache_node *node[MAX_NUMNODES];
> +
> +	int errors;			/* Number of errors in cache */
>  };
>  
>  #ifdef CONFIG_SLUB_CPU_PARTIAL
> --- a/lib/Kconfig.debug~kunit-add-a-kunit-test-for-slub-debugging-functionality
> +++ a/lib/Kconfig.debug
> @@ -2429,6 +2429,11 @@ config BITS_TEST
>  
>  	  If unsure, say N.
>  
> +config SLUB_KUNIT_TEST
> +	tristate "KUnit Test for SLUB cache error detection" if !KUNIT_ALL_TESTS
> +	depends on SLUB_DEBUG && KUNIT
> +	default KUNIT_ALL_TESTS
> +
>  config TEST_UDELAY
>  	tristate "udelay test driver"
>  	help
> --- a/lib/Makefile~kunit-add-a-kunit-test-for-slub-debugging-functionality
> +++ a/lib/Makefile
> @@ -353,5 +353,6 @@ obj-$(CONFIG_LIST_KUNIT_TEST) += list-te
>  obj-$(CONFIG_LINEAR_RANGES_TEST) += test_linear_ranges.o
>  obj-$(CONFIG_BITS_TEST) += test_bits.o
>  obj-$(CONFIG_CMDLINE_KUNIT_TEST) += cmdline_kunit.o
> +obj-$(CONFIG_SLUB_KUNIT_TEST) += test_slub.o
>  
>  obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o
> --- /dev/null
> +++ a/lib/test_slub.c
> @@ -0,0 +1,124 @@
> +// SPDX-License-Identifier: GPL-2.0
> +#include <kunit/test.h>
> +#include <linux/mm.h>
> +#include <linux/slab.h>
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include "../mm/slab.h"
> +
> +
> +static void test_clobber_zone(struct kunit *test)
> +{
> +	struct kmem_cache *s = kmem_cache_create("TestSlub_RZ_alloc", 64, 0,
> +				SLAB_RED_ZONE | SLAB_SILENT_ERRORS, NULL);
> +	u8 *p = kmem_cache_alloc(s, GFP_KERNEL);
> +
> +	p[64] = 0x12;
> +
> +	validate_slab_cache(s);
> +	KUNIT_EXPECT_EQ(test, 1, s->errors);
> +
> +	kmem_cache_free(s, p);
> +	kmem_cache_destroy(s);
> +}
> +
> +static void test_next_pointer(struct kunit *test)
> +{
> +	struct kmem_cache *s = kmem_cache_create("TestSlub_next_ptr_free", 64, 0,
> +				SLAB_POISON | SLAB_SILENT_ERRORS, NULL);
> +	u8 *p = kmem_cache_alloc(s, GFP_KERNEL);
> +	unsigned long tmp;
> +	unsigned long *ptr_addr;
> +
> +	kmem_cache_free(s, p);
> +
> +	ptr_addr = (unsigned long *)(p + s->offset);
> +	tmp = *ptr_addr;
> +	p[s->offset] = 0x12;
> +
> +	/*
> +	 * Expecting two errors.
> +	 * One for the corrupted freechain and the other one for the wrong
> +	 * count of objects in use.
> +	 */
> +	validate_slab_cache(s);
> +	KUNIT_EXPECT_EQ(test, 2, s->errors);
> +
> +	/*
> +	 * Try to repair corrupted freepointer.
> +	 * Still expecting one error for the wrong count of objects in use.
> +	 */
> +	*ptr_addr = tmp;
> +
> +	validate_slab_cache(s);
> +	KUNIT_EXPECT_EQ(test, 1, s->errors);
> +
> +	/*
> +	 * Previous validation repaired the count of objects in use.
> +	 * Now expecting no error.
> +	 */
> +	validate_slab_cache(s);
> +	KUNIT_EXPECT_EQ(test, 0, s->errors);
> +
> +	kmem_cache_destroy(s);
> +}
> +
> +static void test_first_word(struct kunit *test)
> +{
> +	struct kmem_cache *s = kmem_cache_create("TestSlub_1th_word_free", 64, 0,
> +				SLAB_POISON | SLAB_SILENT_ERRORS, NULL);
> +	u8 *p = kmem_cache_alloc(s, GFP_KERNEL);
> +
> +	kmem_cache_free(s, p);
> +	*p = 0x78;
> +
> +	validate_slab_cache(s);
> +	KUNIT_EXPECT_EQ(test, 1, s->errors);
> +
> +	kmem_cache_destroy(s);
> +}
> +
> +static void test_clobber_50th_byte(struct kunit *test)
> +{
> +	struct kmem_cache *s = kmem_cache_create("TestSlub_50th_word_free", 64, 0,
> +				SLAB_POISON | SLAB_SILENT_ERRORS, NULL);
> +	u8 *p = kmem_cache_alloc(s, GFP_KERNEL);
> +
> +	kmem_cache_free(s, p);
> +	p[50] = 0x9a;
> +
> +	validate_slab_cache(s);
> +	KUNIT_EXPECT_EQ(test, 1, s->errors);
> +	kmem_cache_destroy(s);
> +}
> +
> +static void test_clobber_redzone_free(struct kunit *test)
> +{
> +	struct kmem_cache *s = kmem_cache_create("TestSlub_RZ_free", 64, 0,
> +				SLAB_RED_ZONE | SLAB_SILENT_ERRORS, NULL);
> +	u8 *p = kmem_cache_alloc(s, GFP_KERNEL);
> +
> +	kmem_cache_free(s, p);
> +	p[64] = 0xab;
> +
> +	validate_slab_cache(s);
> +	KUNIT_EXPECT_EQ(test, 1, s->errors);
> +	kmem_cache_destroy(s);
> +}
> +
> +static struct kunit_case test_cases[] = {
> +	KUNIT_CASE(test_clobber_zone),
> +	KUNIT_CASE(test_next_pointer),
> +	KUNIT_CASE(test_first_word),
> +	KUNIT_CASE(test_clobber_50th_byte),
> +	KUNIT_CASE(test_clobber_redzone_free),
> +	{}
> +};
> +
> +static struct kunit_suite test_suite = {
> +	.name = "slub_test",
> +	.test_cases = test_cases,
> +};
> +kunit_test_suite(test_suite);
> +
> +MODULE_LICENSE("GPL");
> --- a/mm/slab_common.c~kunit-add-a-kunit-test-for-slub-debugging-functionality
> +++ a/mm/slab_common.c
> @@ -55,7 +55,7 @@ static DECLARE_WORK(slab_caches_to_rcu_d
>   */
>  #define SLAB_NEVER_MERGE (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER | \
>  		SLAB_TRACE | SLAB_TYPESAFE_BY_RCU | SLAB_NOLEAKTRACE | \
> -		SLAB_FAILSLAB | kasan_never_merge())
> +		SLAB_FAILSLAB | SLAB_SILENT_ERRORS | kasan_never_merge())
>  
>  #define SLAB_MERGE_SAME (SLAB_RECLAIM_ACCOUNT | SLAB_CACHE_DMA | \
>  			 SLAB_CACHE_DMA32 | SLAB_ACCOUNT)
> --- a/mm/slab.h~kunit-add-a-kunit-test-for-slub-debugging-functionality
> +++ a/mm/slab.h
> @@ -134,7 +134,8 @@ static inline slab_flags_t kmem_cache_fl
>  #define SLAB_DEBUG_FLAGS (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER)
>  #elif defined(CONFIG_SLUB_DEBUG)
>  #define SLAB_DEBUG_FLAGS (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER | \
> -			  SLAB_TRACE | SLAB_CONSISTENCY_CHECKS)
> +			  SLAB_TRACE | SLAB_CONSISTENCY_CHECKS | \
> +			  SLAB_SILENT_ERRORS)
>  #else
>  #define SLAB_DEBUG_FLAGS (0)
>  #endif
> @@ -164,7 +165,8 @@ static inline slab_flags_t kmem_cache_fl
>  			      SLAB_NOLEAKTRACE | \
>  			      SLAB_RECLAIM_ACCOUNT | \
>  			      SLAB_TEMPORARY | \
> -			      SLAB_ACCOUNT)
> +			      SLAB_ACCOUNT | \
> +			      SLAB_SILENT_ERRORS)
>  
>  bool __kmem_cache_empty(struct kmem_cache *);
>  int __kmem_cache_shutdown(struct kmem_cache *);
> @@ -215,6 +217,7 @@ DECLARE_STATIC_KEY_TRUE(slub_debug_enabl
>  DECLARE_STATIC_KEY_FALSE(slub_debug_enabled);
>  #endif
>  extern void print_tracking(struct kmem_cache *s, void *object);
> +long validate_slab_cache(struct kmem_cache *s);
>  #else
>  static inline void print_tracking(struct kmem_cache *s, void *object)
>  {
> --- a/mm/slub.c~kunit-add-a-kunit-test-for-slub-debugging-functionality
> +++ a/mm/slub.c
> @@ -674,14 +674,16 @@ static void slab_bug(struct kmem_cache *
>  
>  static void slab_fix(struct kmem_cache *s, char *fmt, ...)
>  {
> -	struct va_format vaf;
> -	va_list args;
> -
> -	va_start(args, fmt);
> -	vaf.fmt = fmt;
> -	vaf.va = &args;
> -	pr_err("FIX %s: %pV\n", s->name, &vaf);
> -	va_end(args);
> +	if (!(s->flags & SLAB_SILENT_ERRORS)) {
> +		struct va_format vaf;
> +		va_list args;
> +
> +		va_start(args, fmt);
> +		vaf.fmt = fmt;
> +		vaf.va = &args;
> +		pr_err("FIX %s: %pV\n", s->name, &vaf);
> +		va_end(args);
> +	}
>  }
>  
>  static bool freelist_corrupted(struct kmem_cache *s, struct page *page,
> @@ -740,8 +742,10 @@ static void print_trailer(struct kmem_ca
>  void object_err(struct kmem_cache *s, struct page *page,
>  			u8 *object, char *reason)
>  {
> -	slab_bug(s, "%s", reason);
> -	print_trailer(s, page, object);
> +	if (!(s->flags & SLAB_SILENT_ERRORS)) {
> +		slab_bug(s, "%s", reason);
> +		print_trailer(s, page, object);
> +	}
>  }
>  
>  static __printf(3, 4) void slab_err(struct kmem_cache *s, struct page *page,
> @@ -753,9 +757,11 @@ static __printf(3, 4) void slab_err(stru
>  	va_start(args, fmt);
>  	vsnprintf(buf, sizeof(buf), fmt, args);
>  	va_end(args);
> -	slab_bug(s, "%s", buf);
> -	print_page_info(page);
> -	dump_stack();
> +	if (!(s->flags & SLAB_SILENT_ERRORS)) {
> +		slab_bug(s, "%s", buf);
> +		print_page_info(page);
> +		dump_stack();
> +	}
>  }
>  
>  static void init_object(struct kmem_cache *s, void *object, u8 val)
> @@ -799,11 +805,13 @@ static int check_bytes_and_report(struct
>  	while (end > fault && end[-1] == value)
>  		end--;
>  
> -	slab_bug(s, "%s overwritten", what);
> -	pr_err("0x%p-0x%p @offset=%tu. First byte 0x%x instead of 0x%x\n",
> +	if (!(s->flags & SLAB_SILENT_ERRORS)) {
> +		slab_bug(s, "%s overwritten", what);
> +		pr_err("0x%p-0x%p @offset=%tu. First byte 0x%x instead of 0x%x\n",
>  					fault, end - 1, fault - addr,
>  					fault[0], value);
> -	print_trailer(s, page, object);
> +		print_trailer(s, page, object);
> +	}
>  
>  	restore_bytes(s, what, value, fault, end);
>  	return 0;
> @@ -965,6 +973,7 @@ static int check_slab(struct kmem_cache
>  
>  	if (!PageSlab(page)) {
>  		slab_err(s, page, "Not a valid slab page");
> +		s->errors += 1;
>  		return 0;
>  	}
>  
> @@ -972,11 +981,13 @@ static int check_slab(struct kmem_cache
>  	if (page->objects > maxobj) {
>  		slab_err(s, page, "objects %u > max %u",
>  			page->objects, maxobj);
> +		s->errors += 1;
>  		return 0;
>  	}
>  	if (page->inuse > page->objects) {
>  		slab_err(s, page, "inuse %u > max %u",
>  			page->inuse, page->objects);
> +		s->errors += 1;
>  		return 0;
>  	}
>  	/* Slab_pad_check fixes things up after itself */
> @@ -1009,8 +1020,10 @@ static int on_freelist(struct kmem_cache
>  				page->freelist = NULL;
>  				page->inuse = page->objects;
>  				slab_fix(s, "Freelist cleared");
> +				s->errors += 1;
>  				return 0;
>  			}
> +			s->errors += 1;
>  			break;
>  		}
>  		object = fp;
> @@ -1027,12 +1040,14 @@ static int on_freelist(struct kmem_cache
>  			 page->objects, max_objects);
>  		page->objects = max_objects;
>  		slab_fix(s, "Number of objects adjusted.");
> +		s->errors += 1;
>  	}
>  	if (page->inuse != page->objects - nr) {
>  		slab_err(s, page, "Wrong object count. Counter is %d but counted were %d",
>  			 page->inuse, page->objects - nr);
>  		page->inuse = page->objects - nr;
>  		slab_fix(s, "Object count adjusted.");
> +		s->errors += 1;
>  	}
>  	return search == NULL;
>  }
> @@ -4641,8 +4656,10 @@ static void validate_slab(struct kmem_ca
>  		u8 val = test_bit(__obj_to_index(s, addr, p), map) ?
>  			 SLUB_RED_INACTIVE : SLUB_RED_ACTIVE;
>  
> -		if (!check_object(s, page, p, val))
> +		if (!check_object(s, page, p, val)) {
> +			s->errors += 1;
>  			break;
> +		}
>  	}
>  	put_map(map);
>  unlock:
> @@ -4662,9 +4679,11 @@ static int validate_slab_node(struct kme
>  		validate_slab(s, page);
>  		count++;
>  	}
> -	if (count != n->nr_partial)
> +	if (count != n->nr_partial) {
>  		pr_err("SLUB %s: %ld partial slabs counted but counter=%ld\n",
>  		       s->name, count, n->nr_partial);
> +		s->errors += 1;
> +	}
>  
>  	if (!(s->flags & SLAB_STORE_USER))
>  		goto out;
> @@ -4673,20 +4692,23 @@ static int validate_slab_node(struct kme
>  		validate_slab(s, page);
>  		count++;
>  	}
> -	if (count != atomic_long_read(&n->nr_slabs))
> +	if (count != atomic_long_read(&n->nr_slabs)) {
>  		pr_err("SLUB: %s %ld slabs counted but counter=%ld\n",
>  		       s->name, count, atomic_long_read(&n->nr_slabs));
> +		s->errors += 1;
> +	}
>  
>  out:
>  	spin_unlock_irqrestore(&n->list_lock, flags);
>  	return count;
>  }
>  
> -static long validate_slab_cache(struct kmem_cache *s)
> +long validate_slab_cache(struct kmem_cache *s)
>  {
>  	int node;
>  	unsigned long count = 0;
>  	struct kmem_cache_node *n;
> +	s->errors = 0;
>  
>  	flush_all(s);
>  	for_each_kmem_cache_node(s, node, n)
> @@ -4694,6 +4716,8 @@ static long validate_slab_cache(struct k
>  
>  	return count;
>  }
> +EXPORT_SYMBOL(validate_slab_cache);
> +
>  /*
>   * Generate lists of code addresses where slabcache objects are allocated
>   * and freed.
> _
> 


  reply	other threads:[~2021-04-30  8:50 UTC|newest]

Thread overview: 189+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-30  5:52 incoming Andrew Morton
2021-04-30  5:53 ` [patch 001/178] arch/ia64/kernel/head.S: remove duplicate include Andrew Morton
2021-04-30  5:53 ` [patch 002/178] arch/ia64/kernel/fsys.S: fix typos Andrew Morton
2021-04-30  5:53 ` [patch 003/178] arch/ia64/include/asm/pgtable.h: minor typo fixes Andrew Morton
2021-04-30  5:53 ` [patch 004/178] ia64: ensure proper NUMA distance and possible map initialization Andrew Morton
2021-04-30  5:53 ` [patch 005/178] ia64: drop unused IA64_FW_EMU ifdef Andrew Morton
2021-04-30  5:53 ` [patch 006/178] ia64: simplify code flow around swiotlb init Andrew Morton
2021-04-30  5:53 ` [patch 007/178] ia64: trivial spelling fixes Andrew Morton
2021-04-30  5:53 ` [patch 008/178] ia64: fix EFI_DEBUG build Andrew Morton
2021-04-30  5:53 ` [patch 009/178] ia64: mca: always make IA64_MCA_DEBUG an expression Andrew Morton
2021-04-30  5:53 ` [patch 010/178] ia64: drop marked broken DISCONTIGMEM and VIRTUAL_MEM_MAP Andrew Morton
2021-04-30  5:53 ` [patch 011/178] ia64: module: fix symbolizer crash on fdescr Andrew Morton
2021-04-30  5:53 ` [patch 012/178] include/linux/compiler-gcc.h: sparse can do constant folding of __builtin_bswap*() Andrew Morton
2021-04-30  5:53 ` [patch 013/178] scripts/spelling.txt: add entries for recent discoveries Andrew Morton
2021-04-30  5:53 ` [patch 014/178] scripts: a new script for checking duplicate struct declaration Andrew Morton
2021-04-30  5:53 ` [patch 015/178] arch/sh/include/asm/tlb.h: remove duplicate include Andrew Morton
2021-04-30  5:54 ` [patch 016/178] ocfs2: replace DEFINE_SIMPLE_ATTRIBUTE with DEFINE_DEBUGFS_ATTRIBUTE Andrew Morton
2021-04-30  5:54 ` [patch 017/178] ocfs2: map flags directly in flags_to_o2dlm() Andrew Morton
2021-04-30  5:54 ` [patch 018/178] ocfs2: fix a typo Andrew Morton
2021-04-30  5:54 ` [patch 019/178] ocfs2/dlm: remove unused function Andrew Morton
2021-04-30  5:54 ` [patch 020/178] kfifo: fix ternary sign extension bugs Andrew Morton
2021-04-30  5:54 ` [patch 021/178] vfs: fs_parser: clean up kernel-doc warnings Andrew Morton
2021-04-30  5:54 ` [patch 022/178] watchdog: rename __touch_watchdog() to a better descriptive name Andrew Morton
2021-04-30  5:54 ` [patch 023/178] watchdog: explicitly update timestamp when reporting softlockup Andrew Morton
2021-04-30  5:54 ` [patch 024/178] watchdog/softlockup: report the overall time of softlockups Andrew Morton
2021-04-30  5:54 ` [patch 025/178] watchdog/softlockup: remove logic that tried to prevent repeated reports Andrew Morton
2021-04-30  5:54 ` [patch 026/178] watchdog: fix barriers when printing backtraces from all CPUs Andrew Morton
2021-04-30  5:54 ` [patch 027/178] watchdog: cleanup handling of false positives Andrew Morton
2021-04-30  5:54 ` [patch 028/178] mm/slab_common: provide "slab_merge" option for !IS_ENABLED(CONFIG_SLAB_MERGE_DEFAULT) builds Andrew Morton
2021-04-30  5:54 ` [patch 029/178] mm, slub: enable slub_debug static key when creating cache with explicit debug flags Andrew Morton
2021-04-30  5:54 ` [patch 030/178] kunit: add a KUnit test for SLUB debugging functionality Andrew Morton
2021-04-30  8:50   ` Vlastimil Babka [this message]
2021-04-30 16:31     ` Linus Torvalds
2021-04-30  5:54 ` [patch 031/178] slub: remove resiliency_test() function Andrew Morton
2021-04-30  5:54 ` [patch 032/178] mm/slub.c: trivial typo fixes Andrew Morton
2021-04-30  5:54 ` [patch 033/178] mm/kmemleak.c: fix a typo Andrew Morton
2021-04-30  5:54 ` [patch 034/178] mm/page_owner: record the timestamp of all pages during free Andrew Morton
2021-04-30  5:55 ` [patch 035/178] mm, page_owner: remove unused parameter in __set_page_owner_handle Andrew Morton
2021-04-30  5:55 ` [patch 036/178] mm: page_owner: fetch backtrace only for tracked pages Andrew Morton
2021-04-30  5:55 ` [patch 037/178] mm: page_owner: use kstrtobool() to parse bool option Andrew Morton
2021-04-30  5:55 ` [patch 038/178] mm: page_owner: detect page_owner recursion via task_struct Andrew Morton
2021-04-30  5:55 ` [patch 039/178] mm: page_poison: print page info when corruption is caught Andrew Morton
2021-04-30  5:55 ` [patch 040/178] mm/memtest: add ARCH_USE_MEMTEST Andrew Morton
2021-04-30  5:55 ` [patch 041/178] mm: provide filemap_range_needs_writeback() helper Andrew Morton
2021-04-30 16:50   ` Linus Torvalds
2021-05-09 19:40     ` Matthew Wilcox
2021-04-30  5:55 ` [patch 042/178] mm: use filemap_range_needs_writeback() for O_DIRECT reads Andrew Morton
2021-04-30  5:55 ` [patch 043/178] iomap: " Andrew Morton
2021-04-30  5:55 ` [patch 044/178] mm/filemap: use filemap_read_page in filemap_fault Andrew Morton
2021-04-30  5:55 ` [patch 045/178] mm/filemap: drop check for truncated page after I/O Andrew Morton
2021-04-30  5:55 ` [patch 046/178] mm: page-writeback: simplify memcg handling in test_clear_page_writeback() Andrew Morton
2021-04-30  5:55 ` [patch 047/178] mm: move page_mapping_file to pagemap.h Andrew Morton
2021-04-30  5:55 ` [patch 048/178] mm/filemap: update stale comment Andrew Morton
2021-04-30  5:55 ` [patch 049/178] mm/msync: exit early when the flags is an MS_ASYNC and start < vm_start Andrew Morton
2021-04-30  5:55 ` [patch 050/178] mm/gup: add compound page list iterator Andrew Morton
2021-04-30  5:55 ` [patch 051/178] mm/gup: decrement head page once for group of subpages Andrew Morton
2021-04-30  5:55 ` [patch 052/178] mm/gup: add a range variant of unpin_user_pages_dirty_lock() Andrew Morton
2021-04-30  5:55 ` [patch 053/178] RDMA/umem: batch page unpin in __ib_umem_release() Andrew Morton
2021-04-30  5:55 ` [patch 054/178] mm: gup: remove FOLL_SPLIT Andrew Morton
2021-04-30  5:55 ` [patch 055/178] mm/memremap.c: fix improper SPDX comment style Andrew Morton
2021-04-30  5:56 ` [patch 056/178] mm: memcontrol: fix kernel stack account Andrew Morton
2021-04-30  5:56 ` [patch 057/178] memcg: cleanup root memcg checks Andrew Morton
2021-04-30  5:56 ` [patch 058/178] memcg: enable memcg oom-kill for __GFP_NOFAIL Andrew Morton
2021-04-30  5:56 ` [patch 059/178] mm: memcontrol: fix cpuhotplug statistics flushing Andrew Morton
2021-04-30  5:56 ` [patch 060/178] mm: memcontrol: kill mem_cgroup_nodeinfo() Andrew Morton
2021-04-30  5:56 ` [patch 061/178] mm: memcontrol: privatize memcg_page_state query functions Andrew Morton
2021-04-30  5:56 ` [patch 062/178] cgroup: rstat: support cgroup1 Andrew Morton
2021-04-30  5:56 ` [patch 063/178] cgroup: rstat: punt root-level optimization to individual controllers Andrew Morton
2021-04-30  5:56 ` [patch 064/178] mm: memcontrol: switch to rstat Andrew Morton
2021-04-30  5:56 ` [patch 065/178] mm: memcontrol: consolidate lruvec stat flushing Andrew Morton
2021-04-30  5:56 ` [patch 066/178] kselftests: cgroup: update kmem test for new vmstat implementation Andrew Morton
2021-04-30  5:56 ` [patch 067/178] memcg: charge before adding to swapcache on swapin Andrew Morton
2021-04-30  5:56 ` [patch 068/178] mm: memcontrol: slab: fix obtain a reference to a freeing memcg Andrew Morton
2021-04-30  5:56 ` [patch 069/178] mm: memcontrol: introduce obj_cgroup_{un}charge_pages Andrew Morton
2021-04-30  5:56 ` [patch 070/178] mm: memcontrol: directly access page->memcg_data in mm/page_alloc.c Andrew Morton
2021-04-30  5:56 ` [patch 071/178] mm: memcontrol: change ug->dummy_page only if memcg changed Andrew Morton
2021-04-30  5:56 ` [patch 072/178] mm: memcontrol: use obj_cgroup APIs to charge kmem pages Andrew Morton
2021-04-30  5:56 ` [patch 073/178] mm: memcontrol: inline __memcg_kmem_{un}charge() into obj_cgroup_{un}charge_pages() Andrew Morton
2021-04-30  5:56 ` [patch 074/178] mm: memcontrol: move PageMemcgKmem to the scope of CONFIG_MEMCG_KMEM Andrew Morton
2021-04-30  5:57 ` [patch 075/178] linux/memcontrol.h: remove duplicate struct declaration Andrew Morton
2021-04-30  5:57 ` [patch 076/178] mm: page_counter: mitigate consequences of a page_counter underflow Andrew Morton
2021-04-30  5:57 ` [patch 077/178] mm/memory.c: do_numa_page(): delete bool "migrated" Andrew Morton
2021-04-30  5:57 ` [patch 078/178] mm/interval_tree: add comments to improve code readability Andrew Morton
2021-04-30  5:57 ` [patch 079/178] x86/vmemmap: drop handling of 4K unaligned vmemmap range Andrew Morton
2021-04-30  5:57 ` [patch 080/178] x86/vmemmap: drop handling of 1GB vmemmap ranges Andrew Morton
2021-04-30  5:57 ` [patch 081/178] x86/vmemmap: handle unpopulated sub-pmd ranges Andrew Morton
2021-04-30  5:57 ` [patch 082/178] x86/vmemmap: optimize for consecutive sections in partial populated PMDs Andrew Morton
2021-04-30  5:57 ` [patch 083/178] mm, tracing: improve rss_stat tracepoint message Andrew Morton
2021-04-30  5:57 ` [patch 084/178] mm: add remap_pfn_range_notrack Andrew Morton
2021-04-30  5:57 ` [patch 085/178] mm: add a io_mapping_map_user helper Andrew Morton
2021-04-30  5:57 ` [patch 086/178] i915: use io_mapping_map_user Andrew Morton
2021-04-30  5:57 ` [patch 087/178] i915: fix remap_io_sg to verify the pgprot Andrew Morton
2021-04-30  5:57 ` [patch 088/178] NUMA balancing: reduce TLB flush via delaying mapping on hint page fault Andrew Morton
2021-04-30  5:57 ` [patch 089/178] mm: extend MREMAP_DONTUNMAP to non-anonymous mappings Andrew Morton
2021-04-30  5:57 ` [patch 090/178] Revert "mremap: don't allow MREMAP_DONTUNMAP on special_mappings and aio" Andrew Morton
2021-04-30  5:57 ` [patch 091/178] selftests: add a MREMAP_DONTUNMAP selftest for shmem Andrew Morton
2021-04-30  5:57 ` [patch 092/178] mm/dmapool: switch from strlcpy to strscpy Andrew Morton
2021-04-30  5:57 ` [patch 093/178] mm/sparse: add the missing sparse_buffer_fini() in error branch Andrew Morton
2021-04-30  5:58 ` [patch 094/178] samples/vfio-mdev/mdpy: use remap_vmalloc_range Andrew Morton
2021-04-30  5:58 ` [patch 095/178] mm: unexport remap_vmalloc_range_partial Andrew Morton
2021-04-30  5:58 ` [patch 096/178] mm/vmalloc: use rb_tree instead of list for vread() lookups Andrew Morton
2021-04-30  5:58 ` [patch 097/178] ARM: mm: add missing pud_page define to 2-level page tables Andrew Morton
2021-04-30  5:58 ` [patch 098/178] mm/vmalloc: fix HUGE_VMAP regression by enabling huge pages in vmalloc_to_page Andrew Morton
2021-04-30  5:58 ` [patch 099/178] mm: apply_to_pte_range warn and fail if a large pte is encountered Andrew Morton
2021-04-30  5:58 ` [patch 100/178] mm/vmalloc: rename vmap_*_range vmap_pages_*_range Andrew Morton
2021-04-30  5:58 ` [patch 101/178] mm/ioremap: rename ioremap_*_range to vmap_*_range Andrew Morton
2021-04-30  5:58 ` [patch 102/178] mm: HUGE_VMAP arch support cleanup Andrew Morton
2021-04-30  5:58 ` [patch 103/178] powerpc: inline huge vmap supported functions Andrew Morton
2021-04-30  5:58 ` [patch 104/178] arm64: " Andrew Morton
2021-04-30  5:58 ` [patch 105/178] x86: " Andrew Morton
2021-04-30  5:58 ` [patch 106/178] mm/vmalloc: provide fallback arch huge vmap support functions Andrew Morton
2021-04-30  5:58 ` [patch 107/178] mm: move vmap_range from mm/ioremap.c to mm/vmalloc.c Andrew Morton
2021-04-30  5:58 ` [patch 108/178] mm/vmalloc: add vmap_range_noflush variant Andrew Morton
2021-04-30  5:58 ` [patch 109/178] mm/vmalloc: hugepage vmalloc mappings Andrew Morton
2021-04-30  5:58 ` [patch 110/178] mm/vmalloc: remove map_kernel_range Andrew Morton
2021-04-30  5:58 ` [patch 111/178] kernel/dma: remove unnecessary unmap_kernel_range Andrew Morton
2021-04-30  5:58 ` [patch 112/178] powerpc/xive: " Andrew Morton
2021-04-30  5:59 ` [patch 113/178] mm/vmalloc: remove unmap_kernel_range Andrew Morton
2021-04-30  5:59 ` [patch 114/178] mm/vmalloc: improve allocation failure error messages Andrew Morton
2021-04-30  5:59 ` [patch 115/178] mm: vmalloc: prevent use after free in _vm_unmap_aliases Andrew Morton
2021-04-30  5:59 ` [patch 116/178] lib/test_vmalloc.c: remove two kvfree_rcu() tests Andrew Morton
2021-04-30  5:59 ` [patch 117/178] lib/test_vmalloc.c: add a new 'nr_threads' parameter Andrew Morton
2021-04-30  5:59 ` [patch 118/178] vm/test_vmalloc.sh: adapt for updated driver interface Andrew Morton
2021-04-30  5:59 ` [patch 119/178] mm/vmalloc: refactor the preloading loagic Andrew Morton
2021-04-30  5:59 ` [patch 120/178] mm/vmalloc: remove an empty line Andrew Morton
2021-04-30  5:59 ` [patch 121/178] mm/doc: fix fault_flag_allow_retry_first kerneldoc Andrew Morton
2021-04-30  5:59 ` [patch 122/178] mm/doc: fix page_maybe_dma_pinned kerneldoc Andrew Morton
2021-04-30  5:59 ` [patch 123/178] mm/doc: turn fault flags into an enum Andrew Morton
2021-04-30  5:59 ` [patch 124/178] mm/doc: add mm.h and mm_types.h to the mm-api document Andrew Morton
2021-04-30  5:59 ` [patch 125/178] MAINTAINERS: assign pagewalk.h to MEMORY MANAGEMENT Andrew Morton
2021-04-30  5:59 ` [patch 126/178] pagewalk: prefix struct kernel-doc descriptions Andrew Morton
2021-04-30  5:59 ` [patch 127/178] mm/kasan: switch from strlcpy to strscpy Andrew Morton
2021-04-30  5:59 ` [patch 128/178] kasan: fix kasan_byte_accessible() to be consistent with actual checks Andrew Morton
2021-04-30  5:59 ` [patch 129/178] kasan: initialize shadow to TAG_INVALID for SW_TAGS Andrew Morton
2021-04-30  5:59 ` [patch 130/178] mm, kasan: don't poison boot memory with tag-based modes Andrew Morton
2021-04-30  5:59 ` [patch 131/178] arm64: kasan: allow to init memory when setting tags Andrew Morton
2021-04-30  5:59 ` [patch 132/178] kasan: init memory in kasan_(un)poison for HW_TAGS Andrew Morton
2021-04-30  6:00 ` [patch 133/178] kasan, mm: integrate page_alloc init with HW_TAGS Andrew Morton
2021-04-30  6:00 ` [patch 134/178] kasan, mm: integrate slab init_on_alloc " Andrew Morton
2021-04-30  6:00 ` [patch 135/178] kasan, mm: integrate slab init_on_free " Andrew Morton
2021-04-30  6:00 ` [patch 136/178] kasan: docs: clean up sections Andrew Morton
2021-04-30  6:00 ` [patch 137/178] kasan: docs: update overview section Andrew Morton
2021-04-30  6:00 ` [patch 138/178] kasan: docs: update usage section Andrew Morton
2021-04-30  6:00 ` [patch 139/178] kasan: docs: update error reports section Andrew Morton
2021-04-30  6:00 ` [patch 140/178] kasan: docs: update boot parameters section Andrew Morton
2021-04-30  6:00 ` [patch 141/178] kasan: docs: update GENERIC implementation details section Andrew Morton
2021-04-30  6:00 ` [patch 142/178] kasan: docs: update SW_TAGS " Andrew Morton
2021-04-30  6:00 ` [patch 143/178] kasan: docs: update HW_TAGS " Andrew Morton
2021-04-30  6:00 ` [patch 144/178] kasan: docs: update shadow memory section Andrew Morton
2021-04-30  6:00 ` [patch 145/178] kasan: docs: update ignoring accesses section Andrew Morton
2021-04-30  6:00 ` [patch 146/178] kasan: docs: update tests section Andrew Morton
2021-04-30  6:00 ` [patch 147/178] kasan: record task_work_add() call stack Andrew Morton
2021-04-30  6:00 ` [patch 148/178] kasan: detect false-positives in tests Andrew Morton
2021-04-30 18:32   ` Linus Torvalds
2021-05-02 18:04     ` Andrew Morton
2021-05-02 19:08       ` Linus Torvalds
2021-05-03 18:44         ` Andrew Morton
2021-04-30  6:00 ` [patch 149/178] irq_work: record irq_work_queue() call stack Andrew Morton
2021-04-30  6:00 ` [patch 150/178] mm: move mem_init_print_info() into mm_init() Andrew Morton
2021-04-30  6:00 ` [patch 151/178] mm/page_alloc: drop pr_info_ratelimited() in alloc_contig_range() Andrew Morton
2021-04-30  6:01 ` [patch 152/178] mm: remove lru_add_drain_all in alloc_contig_range Andrew Morton
2021-04-30  6:01 ` [patch 153/178] include/linux/page-flags-layout.h: correctly determine LAST_CPUPID_WIDTH Andrew Morton
2021-04-30  6:01 ` [patch 154/178] include/linux/page-flags-layout.h: cleanups Andrew Morton
2021-04-30  6:01 ` [patch 155/178] mm/page_alloc: rename alloc_mask to alloc_gfp Andrew Morton
2021-04-30  6:01 ` [patch 156/178] mm/page_alloc: rename gfp_mask to gfp Andrew Morton
2021-04-30  6:01 ` [patch 157/178] mm/page_alloc: combine __alloc_pages and __alloc_pages_nodemask Andrew Morton
2021-04-30  6:01 ` [patch 158/178] mm/mempolicy: rename alloc_pages_current to alloc_pages Andrew Morton
2021-04-30  6:01 ` [patch 159/178] mm/mempolicy: rewrite alloc_pages documentation Andrew Morton
2021-04-30  6:01 ` [patch 160/178] mm/mempolicy: rewrite alloc_pages_vma documentation Andrew Morton
2021-04-30  6:01 ` [patch 161/178] mm/mempolicy: fix mpol_misplaced kernel-doc Andrew Morton
2021-04-30  6:01 ` [patch 162/178] mm: page_alloc: dump migrate-failed pages Andrew Morton
2021-05-02  3:10   ` jim.cromie
2021-04-30  6:01 ` [patch 163/178] mm/Kconfig: remove default DISCONTIGMEM_MANUAL Andrew Morton
2021-04-30  6:01 ` [patch 164/178] mm, page_alloc: avoid page_to_pfn() in move_freepages() Andrew Morton
2021-04-30  6:01 ` [patch 165/178] mm/page_alloc: duplicate include linux/vmalloc.h Andrew Morton
2021-04-30  6:01 ` [patch 166/178] mm/page_alloc: rename alloced to allocated Andrew Morton
2021-04-30  6:01 ` [patch 167/178] mm/page_alloc: add a bulk page allocator Andrew Morton
2021-04-30  6:01 ` [patch 168/178] mm/page_alloc: add an array-based interface to the " Andrew Morton
2021-04-30  6:01 ` [patch 169/178] mm/page_alloc: optimize code layout for __alloc_pages_bulk Andrew Morton
2021-04-30  6:01 ` [patch 170/178] mm/page_alloc: inline __rmqueue_pcplist Andrew Morton
2021-04-30  6:01 ` [patch 171/178] SUNRPC: set rq_page_end differently Andrew Morton
2021-04-30  6:02 ` [patch 172/178] SUNRPC: refresh rq_pages using a bulk page allocator Andrew Morton
2021-04-30  6:02 ` [patch 173/178] net: page_pool: refactor dma_map into own function page_pool_dma_map Andrew Morton
2021-04-30  6:02 ` [patch 174/178] net: page_pool: use alloc_pages_bulk in refill code path Andrew Morton
2021-04-30  6:02 ` [patch 175/178] mm: page_alloc: ignore init_on_free=1 for debug_pagealloc=1 Andrew Morton
2021-04-30  6:02 ` [patch 176/178] mm/page_alloc: redundant definition variables of pfn in for loop Andrew Morton
2021-04-30 17:10   ` Linus Torvalds
2021-04-30  6:02 ` [patch 177/178] mm/mmzone.h: fix existing kernel-doc comments and link them to core-api Andrew Morton
2021-04-30  6:02 ` [patch 178/178] mm/memory-failure: unnecessary amount of unmapping Andrew Morton

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=dbbb7b43-37fa-b026-45af-b10cc0672ccb@suse.cz \
    --to=vbabka@suse.cz \
    --cc=akpm@linux-foundation.org \
    --cc=cl@linux.com \
    --cc=glittao@gmail.com \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mm-commits@vger.kernel.org \
    --cc=penberg@kernel.org \
    --cc=rientjes@google.com \
    --cc=torvalds@linux-foundation.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).