linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: akpm@linux-foundation.org, bigeasy@linutronix.de, efault@gmx.de,
	linux-mm@kvack.org, mm-commits@vger.kernel.org,
	stable@vger.kernel.org, torvalds@linux-foundation.org,
	vitaly.wool@konsulko.com
Subject: [patch 157/200] z3fold: stricter locking and more careful reclaim
Date: Mon, 14 Dec 2020 19:12:33 -0800	[thread overview]
Message-ID: <20201215031233.w8BaLY70F%akpm@linux-foundation.org> (raw)
In-Reply-To: <20201214190237.a17b70ae14f129e2dca3d204@linux-foundation.org>

From: Vitaly Wool <vitaly.wool@konsulko.com>
Subject: z3fold: stricter locking and more careful reclaim

Use temporary slots in reclaim function to avoid possible race when
freeing those.

While at it, make sure we check CLAIMED flag under page lock in the
reclaim function to make sure we are not racing with z3fold_alloc().

Link: https://lkml.kernel.org/r/20201209145151.18994-4-vitaly.wool@konsulko.com
Signed-off-by: Vitaly Wool <vitaly.wool@konsulko.com>
Cc: <stable@vger.kernel.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 mm/z3fold.c |  143 +++++++++++++++++++++++++++++---------------------
 1 file changed, 85 insertions(+), 58 deletions(-)

--- a/mm/z3fold.c~z3fold-stricter-locking-and-more-careful-reclaim
+++ a/mm/z3fold.c
@@ -182,6 +182,13 @@ enum z3fold_page_flags {
 };
 
 /*
+ * handle flags, go under HANDLE_FLAG_MASK
+ */
+enum z3fold_handle_flags {
+	HANDLES_NOFREE = 0,
+};
+
+/*
  * Forward declarations
  */
 static struct z3fold_header *__z3fold_alloc(struct z3fold_pool *, size_t, bool);
@@ -311,6 +318,12 @@ static inline void free_handle(unsigned
 	slots = handle_to_slots(handle);
 	write_lock(&slots->lock);
 	*(unsigned long *)handle = 0;
+
+	if (test_bit(HANDLES_NOFREE, &slots->pool)) {
+		write_unlock(&slots->lock);
+		return; /* simple case, nothing else to do */
+	}
+
 	if (zhdr->slots != slots)
 		zhdr->foreign_handles--;
 
@@ -621,6 +634,28 @@ static inline void add_to_unbuddied(stru
 	}
 }
 
+static inline enum buddy get_free_buddy(struct z3fold_header *zhdr, int chunks)
+{
+	enum buddy bud = HEADLESS;
+
+	if (zhdr->middle_chunks) {
+		if (!zhdr->first_chunks &&
+		    chunks <= zhdr->start_middle - ZHDR_CHUNKS)
+			bud = FIRST;
+		else if (!zhdr->last_chunks)
+			bud = LAST;
+	} else {
+		if (!zhdr->first_chunks)
+			bud = FIRST;
+		else if (!zhdr->last_chunks)
+			bud = LAST;
+		else
+			bud = MIDDLE;
+	}
+
+	return bud;
+}
+
 static inline void *mchunk_memmove(struct z3fold_header *zhdr,
 				unsigned short dst_chunk)
 {
@@ -682,18 +717,7 @@ static struct z3fold_header *compact_sin
 		if (WARN_ON(new_zhdr == zhdr))
 			goto out_fail;
 
-		if (new_zhdr->first_chunks == 0) {
-			if (new_zhdr->middle_chunks != 0 &&
-					chunks >= new_zhdr->start_middle) {
-				new_bud = LAST;
-			} else {
-				new_bud = FIRST;
-			}
-		} else if (new_zhdr->last_chunks == 0) {
-			new_bud = LAST;
-		} else if (new_zhdr->middle_chunks == 0) {
-			new_bud = MIDDLE;
-		}
+		new_bud = get_free_buddy(new_zhdr, chunks);
 		q = new_zhdr;
 		switch (new_bud) {
 		case FIRST:
@@ -815,9 +839,8 @@ static void do_compact_page(struct z3fol
 		return;
 	}
 
-	if (unlikely(PageIsolated(page) ||
-		     test_bit(PAGE_CLAIMED, &page->private) ||
-		     test_bit(PAGE_STALE, &page->private))) {
+	if (test_bit(PAGE_STALE, &page->private) ||
+	    test_and_set_bit(PAGE_CLAIMED, &page->private)) {
 		z3fold_page_unlock(zhdr);
 		return;
 	}
@@ -826,13 +849,16 @@ static void do_compact_page(struct z3fol
 	    zhdr->mapped_count == 0 && compact_single_buddy(zhdr)) {
 		if (kref_put(&zhdr->refcount, release_z3fold_page_locked))
 			atomic64_dec(&pool->pages_nr);
-		else
+		else {
+			clear_bit(PAGE_CLAIMED, &page->private);
 			z3fold_page_unlock(zhdr);
+		}
 		return;
 	}
 
 	z3fold_compact_page(zhdr);
 	add_to_unbuddied(pool, zhdr);
+	clear_bit(PAGE_CLAIMED, &page->private);
 	z3fold_page_unlock(zhdr);
 }
 
@@ -1080,17 +1106,8 @@ static int z3fold_alloc(struct z3fold_po
 retry:
 		zhdr = __z3fold_alloc(pool, size, can_sleep);
 		if (zhdr) {
-			if (zhdr->first_chunks == 0) {
-				if (zhdr->middle_chunks != 0 &&
-				    chunks >= zhdr->start_middle)
-					bud = LAST;
-				else
-					bud = FIRST;
-			} else if (zhdr->last_chunks == 0)
-				bud = LAST;
-			else if (zhdr->middle_chunks == 0)
-				bud = MIDDLE;
-			else {
+			bud = get_free_buddy(zhdr, chunks);
+			if (bud == HEADLESS) {
 				if (kref_put(&zhdr->refcount,
 					     release_z3fold_page_locked))
 					atomic64_dec(&pool->pages_nr);
@@ -1236,7 +1253,6 @@ static void z3fold_free(struct z3fold_po
 		pr_err("%s: unknown bud %d\n", __func__, bud);
 		WARN_ON(1);
 		put_z3fold_header(zhdr);
-		clear_bit(PAGE_CLAIMED, &page->private);
 		return;
 	}
 
@@ -1251,8 +1267,7 @@ static void z3fold_free(struct z3fold_po
 		z3fold_page_unlock(zhdr);
 		return;
 	}
-	if (unlikely(PageIsolated(page)) ||
-	    test_and_set_bit(NEEDS_COMPACTING, &page->private)) {
+	if (test_and_set_bit(NEEDS_COMPACTING, &page->private)) {
 		put_z3fold_header(zhdr);
 		clear_bit(PAGE_CLAIMED, &page->private);
 		return;
@@ -1316,6 +1331,10 @@ static int z3fold_reclaim_page(struct z3
 	struct page *page = NULL;
 	struct list_head *pos;
 	unsigned long first_handle = 0, middle_handle = 0, last_handle = 0;
+	struct z3fold_buddy_slots slots __attribute__((aligned(SLOTS_ALIGN)));
+
+	rwlock_init(&slots.lock);
+	slots.pool = (unsigned long)pool | (1 << HANDLES_NOFREE);
 
 	spin_lock(&pool->lock);
 	if (!pool->ops || !pool->ops->evict || retries == 0) {
@@ -1330,35 +1349,36 @@ static int z3fold_reclaim_page(struct z3
 		list_for_each_prev(pos, &pool->lru) {
 			page = list_entry(pos, struct page, lru);
 
-			/* this bit could have been set by free, in which case
-			 * we pass over to the next page in the pool.
-			 */
-			if (test_and_set_bit(PAGE_CLAIMED, &page->private)) {
-				page = NULL;
-				continue;
-			}
-
-			if (unlikely(PageIsolated(page))) {
-				clear_bit(PAGE_CLAIMED, &page->private);
-				page = NULL;
-				continue;
-			}
 			zhdr = page_address(page);
 			if (test_bit(PAGE_HEADLESS, &page->private))
 				break;
 
+			if (kref_get_unless_zero(&zhdr->refcount) == 0) {
+				zhdr = NULL;
+				break;
+			}
 			if (!z3fold_page_trylock(zhdr)) {
-				clear_bit(PAGE_CLAIMED, &page->private);
+				if (kref_put(&zhdr->refcount,
+						release_z3fold_page))
+					atomic64_dec(&pool->pages_nr);
 				zhdr = NULL;
 				continue; /* can't evict at this point */
 			}
-			if (zhdr->foreign_handles) {
-				clear_bit(PAGE_CLAIMED, &page->private);
-				z3fold_page_unlock(zhdr);
+
+			/* test_and_set_bit is of course atomic, but we still
+			 * need to do it under page lock, otherwise checking
+			 * that bit in __z3fold_alloc wouldn't make sense
+			 */
+			if (zhdr->foreign_handles ||
+			    test_and_set_bit(PAGE_CLAIMED, &page->private)) {
+				if (kref_put(&zhdr->refcount,
+						release_z3fold_page))
+					atomic64_dec(&pool->pages_nr);
+				else
+					z3fold_page_unlock(zhdr);
 				zhdr = NULL;
 				continue; /* can't evict such page */
 			}
-			kref_get(&zhdr->refcount);
 			list_del_init(&zhdr->buddy);
 			zhdr->cpu = -1;
 			break;
@@ -1380,12 +1400,16 @@ static int z3fold_reclaim_page(struct z3
 			first_handle = 0;
 			last_handle = 0;
 			middle_handle = 0;
+			memset(slots.slot, 0, sizeof(slots.slot));
 			if (zhdr->first_chunks)
-				first_handle = encode_handle(zhdr, FIRST);
+				first_handle = __encode_handle(zhdr, &slots,
+								FIRST);
 			if (zhdr->middle_chunks)
-				middle_handle = encode_handle(zhdr, MIDDLE);
+				middle_handle = __encode_handle(zhdr, &slots,
+								MIDDLE);
 			if (zhdr->last_chunks)
-				last_handle = encode_handle(zhdr, LAST);
+				last_handle = __encode_handle(zhdr, &slots,
+								LAST);
 			/*
 			 * it's safe to unlock here because we hold a
 			 * reference to this page
@@ -1400,19 +1424,16 @@ static int z3fold_reclaim_page(struct z3
 			ret = pool->ops->evict(pool, middle_handle);
 			if (ret)
 				goto next;
-			free_handle(middle_handle, zhdr);
 		}
 		if (first_handle) {
 			ret = pool->ops->evict(pool, first_handle);
 			if (ret)
 				goto next;
-			free_handle(first_handle, zhdr);
 		}
 		if (last_handle) {
 			ret = pool->ops->evict(pool, last_handle);
 			if (ret)
 				goto next;
-			free_handle(last_handle, zhdr);
 		}
 next:
 		if (test_bit(PAGE_HEADLESS, &page->private)) {
@@ -1426,9 +1447,11 @@ next:
 			spin_unlock(&pool->lock);
 			clear_bit(PAGE_CLAIMED, &page->private);
 		} else {
+			struct z3fold_buddy_slots *slots = zhdr->slots;
 			z3fold_page_lock(zhdr);
 			if (kref_put(&zhdr->refcount,
 					release_z3fold_page_locked)) {
+				kmem_cache_free(pool->c_handle, slots);
 				atomic64_dec(&pool->pages_nr);
 				return 0;
 			}
@@ -1544,8 +1567,7 @@ static bool z3fold_page_isolate(struct p
 	VM_BUG_ON_PAGE(!PageMovable(page), page);
 	VM_BUG_ON_PAGE(PageIsolated(page), page);
 
-	if (test_bit(PAGE_HEADLESS, &page->private) ||
-	    test_bit(PAGE_CLAIMED, &page->private))
+	if (test_bit(PAGE_HEADLESS, &page->private))
 		return false;
 
 	zhdr = page_address(page);
@@ -1557,6 +1579,8 @@ static bool z3fold_page_isolate(struct p
 	if (zhdr->mapped_count != 0 || zhdr->foreign_handles != 0)
 		goto out;
 
+	if (test_and_set_bit(PAGE_CLAIMED, &page->private))
+		goto out;
 	pool = zhdr_to_pool(zhdr);
 	spin_lock(&pool->lock);
 	if (!list_empty(&zhdr->buddy))
@@ -1583,16 +1607,17 @@ static int z3fold_page_migrate(struct ad
 
 	VM_BUG_ON_PAGE(!PageMovable(page), page);
 	VM_BUG_ON_PAGE(!PageIsolated(page), page);
+	VM_BUG_ON_PAGE(!test_bit(PAGE_CLAIMED, &page->private), page);
 	VM_BUG_ON_PAGE(!PageLocked(newpage), newpage);
 
 	zhdr = page_address(page);
 	pool = zhdr_to_pool(zhdr);
 
-	if (!z3fold_page_trylock(zhdr)) {
+	if (!z3fold_page_trylock(zhdr))
 		return -EAGAIN;
-	}
 	if (zhdr->mapped_count != 0 || zhdr->foreign_handles != 0) {
 		z3fold_page_unlock(zhdr);
+		clear_bit(PAGE_CLAIMED, &page->private);
 		return -EBUSY;
 	}
 	if (work_pending(&zhdr->work)) {
@@ -1634,6 +1659,7 @@ static int z3fold_page_migrate(struct ad
 	queue_work_on(new_zhdr->cpu, pool->compact_wq, &new_zhdr->work);
 
 	page_mapcount_reset(page);
+	clear_bit(PAGE_CLAIMED, &page->private);
 	put_page(page);
 	return 0;
 }
@@ -1657,6 +1683,7 @@ static void z3fold_page_putback(struct p
 	spin_lock(&pool->lock);
 	list_add(&page->lru, &pool->lru);
 	spin_unlock(&pool->lock);
+	clear_bit(PAGE_CLAIMED, &page->private);
 	z3fold_page_unlock(zhdr);
 }
 
_


  parent reply	other threads:[~2020-12-15  3:12 UTC|newest]

Thread overview: 215+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-15  3:02 incoming Andrew Morton
2020-12-15  3:03 ` [patch 001/200] kthread: add kthread_work tracepoints Andrew Morton
2020-12-15  3:03 ` [patch 002/200] kthread_worker: document CPU hotplug handling Andrew Morton
2020-12-15  3:03 ` [patch 003/200] uapi: move constants from <linux/kernel.h> to <linux/const.h> Andrew Morton
2020-12-15  3:03 ` [patch 004/200] ide/falcon: remove in_interrupt() usage Andrew Morton
2020-12-15  3:03 ` [patch 005/200] ide: remove BUG_ON(in_interrupt() || irqs_disabled()) from ide_unregister() Andrew Morton
2020-12-15  3:03 ` [patch 006/200] fs/ntfs: remove unused varibles Andrew Morton
2020-12-15  3:03 ` [patch 007/200] fs/ntfs: remove unused variable attr_len Andrew Morton
2020-12-15  3:03 ` [patch 008/200] fs/ocfs2/cluster/tcp.c: remove unneeded break Andrew Morton
2020-12-15  3:03 ` [patch 009/200] ocfs2: ratelimit the 'max lookup times reached' notice Andrew Morton
2020-12-15  3:03 ` [patch 010/200] arch/Kconfig: fix spelling mistakes Andrew Morton
2020-12-15  3:03 ` [patch 011/200] mm/slab_common.c: use list_for_each_entry in dump_unreclaimable_slab() Andrew Morton
2020-12-15  3:03 ` [patch 012/200] mm: slab: clarify krealloc()'s behavior with __GFP_ZERO Andrew Morton
2020-12-15 14:30   ` Christian König
2020-12-15 19:08     ` Andy Shevchenko
2020-12-16  7:47       ` Christian König
2020-12-16 11:23         ` Andy Shevchenko
2020-12-15  3:03 ` [patch 013/200] mm: slab: provide krealloc_array() Andrew Morton
2020-12-15  3:03 ` [patch 014/200] ALSA: pcm: use krealloc_array() Andrew Morton
2020-12-15  3:04 ` [patch 015/200] vhost: vringh: " Andrew Morton
2020-12-15  3:04 ` [patch 016/200] pinctrl: " Andrew Morton
2020-12-15  3:04 ` [patch 017/200] edac: ghes: " Andrew Morton
2020-12-15  3:04 ` [patch 018/200] drm: atomic: " Andrew Morton
2020-12-15  3:04 ` [patch 019/200] hwtracing: intel: " Andrew Morton
2020-12-15  3:04 ` [patch 020/200] dma-buf: " Andrew Morton
2020-12-15  7:42   ` Christian König
2020-12-15  3:04 ` [patch 021/200] mm, slab, slub: clear the slab_cache field when freeing page Andrew Morton
2020-12-15  3:04 ` [patch 022/200] mm/slab: rerform init_on_free earlier Andrew Morton
2020-12-15 16:45   ` Alexander Potapenko
2020-12-15 20:46     ` Alexander Popov
2020-12-15 21:08       ` Alexander Popov
2020-12-15  3:04 ` [patch 023/200] mm, slub: use kmem_cache_debug_flags() in deactivate_slab() Andrew Morton
2020-12-15  3:04 ` [patch 024/200] mm/slub: let number of online CPUs determine the slub page order Andrew Morton
2020-12-15  3:04 ` [patch 025/200] device-dax/kmem: use struct_size() Andrew Morton
2020-12-15  3:04 ` [patch 026/200] mm: fix page_owner initializing issue for arm32 Andrew Morton
2020-12-15  3:04 ` [patch 027/200] mm/page_owner: record timestamp and pid Andrew Morton
2020-12-15  3:04 ` [patch 028/200] mm/filemap/c: break generic_file_buffered_read up into multiple functions Andrew Morton
2020-12-15  3:04 ` [patch 029/200] mm/filemap.c: generic_file_buffered_read() now uses find_get_pages_contig Andrew Morton
2020-12-15  3:04 ` [patch 030/200] mm/truncate: add parameter explanation for invalidate_mapping_pagevec Andrew Morton
2020-12-15  3:05 ` [patch 031/200] mm/filemap.c: remove else after a return Andrew Morton
2020-12-15  3:05 ` [patch 032/200] mm/gup_benchmark: rename to mm/gup_test Andrew Morton
2020-12-15  3:05 ` [patch 033/200] selftests/vm: use a common gup_test.h Andrew Morton
2020-12-15  3:05 ` [patch 034/200] selftests/vm: rename run_vmtests --> run_vmtests.sh Andrew Morton
2020-12-15  3:05 ` [patch 035/200] selftests/vm: minor cleanup: Makefile and gup_test.c Andrew Morton
2020-12-15  3:05 ` [patch 036/200] selftests/vm: only some gup_test items are really benchmarks Andrew Morton
2020-12-15  3:05 ` [patch 037/200] selftests/vm: gup_test: introduce the dump_pages() sub-test Andrew Morton
2020-12-15  3:05 ` [patch 038/200] selftests/vm: run_vmtests.sh: update and clean up gup_test invocation Andrew Morton
2020-12-15  3:05 ` [patch 039/200] selftests/vm: hmm-tests: remove the libhugetlbfs dependency Andrew Morton
2020-12-15  3:05 ` [patch 040/200] selftests/vm: 2x speedup for run_vmtests.sh Andrew Morton
2020-12-15  3:05 ` [patch 041/200] mm/gup_test.c: mark gup_test_init as __init function Andrew Morton
2020-12-15  3:05 ` [patch 042/200] mm/gup_test: GUP_TEST depends on DEBUG_FS Andrew Morton
2020-12-15  3:05 ` [patch 043/200] mm/gup: reorganize internal_get_user_pages_fast() Andrew Morton
2020-12-15  3:05 ` [patch 044/200] mm/gup: prevent gup_fast from racing with COW during fork Andrew Morton
2020-12-15  3:05 ` [patch 045/200] mm/gup: remove the vma allocation from gup_longterm_locked() Andrew Morton
2020-12-15  3:05 ` [patch 046/200] mm/gup: combine put_compound_head() and unpin_user_page() Andrew Morton
2020-12-15  3:05 ` [patch 047/200] mm: handle zone device pages in release_pages() Andrew Morton
2020-12-15  3:05 ` [patch 048/200] mm/swapfile.c: use helper function swap_count() in add_swap_count_continuation() Andrew Morton
2020-12-15  3:06 ` [patch 049/200] mm/swap_state: skip meaningless swap cache readahead when ra_info.win == 0 Andrew Morton
2020-12-15  3:06 ` [patch 050/200] mm/swapfile.c: remove unnecessary out label in __swap_duplicate() Andrew Morton
2020-12-15  3:06 ` [patch 051/200] mm/swapfile.c: use memset to fill the swap_map with SWAP_HAS_CACHE Andrew Morton
2020-12-15  3:06 ` [patch 052/200] mm: remove pagevec_lookup_range_nr_tag() Andrew Morton
2020-12-15  3:06 ` [patch 053/200] mm/shmem.c: make shmem_mapping() inline Andrew Morton
2020-12-15  3:06 ` [patch 054/200] tmpfs: fix Documentation nits Andrew Morton
2020-12-15  3:06 ` [patch 055/200] mm: memcontrol: add file_thp, shmem_thp to memory.stat Andrew Morton
2020-12-15  3:06 ` [patch 056/200] mm: memcontrol: remove unused mod_memcg_obj_state() Andrew Morton
2020-12-15  3:06 ` [patch 057/200] mm: memcontrol: eliminate redundant check in __mem_cgroup_insert_exceeded() Andrew Morton
2020-12-15  3:06 ` [patch 058/200] mm: memcg/slab: fix return of child memcg objcg for root memcg Andrew Morton
2020-12-15  3:06 ` [patch 059/200] mm: memcg/slab: fix use after free in obj_cgroup_charge Andrew Morton
2020-12-15  3:06 ` [patch 060/200] mm/rmap: always do TTU_IGNORE_ACCESS Andrew Morton
2020-12-15  3:06 ` [patch 061/200] mm/memcg: update page struct member in comments Andrew Morton
2020-12-15  3:06 ` [patch 062/200] mm: memcg: fix obsolete code comments Andrew Morton
2020-12-15  3:06 ` [patch 063/200] mm: memcg: deprecate the non-hierarchical mode Andrew Morton
2020-12-15  3:06 ` [patch 064/200] docs: cgroup-v1: reflect the deprecation of " Andrew Morton
2020-12-15  3:06 ` [patch 065/200] cgroup: remove obsoleted broken_hierarchy and warned_broken_hierarchy Andrew Morton
2020-12-15  3:06 ` [patch 066/200] mm/page_counter: use page_counter_read in page_counter_set_max Andrew Morton
2020-12-15  3:07 ` [patch 067/200] mm: memcg: remove obsolete memcg_has_children() Andrew Morton
2020-12-15  3:07 ` [patch 068/200] mm: memcg/slab: rename *_lruvec_slab_state to *_lruvec_kmem_state Andrew Morton
2020-12-15  3:07 ` [patch 069/200] mm: memcontrol: sssign boolean values to a bool variable Andrew Morton
2020-12-15  3:07 ` [patch 070/200] mm/memcg: remove incorrect comment Andrew Morton
2020-12-15  3:07 ` [patch 071/200] mm: move lruvec stats update functions to vmstat.h Andrew Morton
2020-12-15  3:07 ` [patch 072/200] mm: memcontrol: account pagetables per node Andrew Morton
2020-12-15  3:07 ` [patch 073/200] xen/unpopulated-alloc: consolidate pgmap manipulation Andrew Morton
2020-12-15  3:07 ` [patch 074/200] kselftests: vm: add mremap tests Andrew Morton
2020-12-15  3:07 ` [patch 075/200] mm: speedup mremap on 1GB or larger regions Andrew Morton
2020-12-15 19:52   ` Linus Torvalds
2020-12-15 23:16     ` Kalesh Singh
2020-12-15  3:07 ` [patch 076/200] arm64: mremap speedup - enable HAVE_MOVE_PUD Andrew Morton
2020-12-15  3:07 ` [patch 077/200] x86: mremap speedup - Enable HAVE_MOVE_PUD Andrew Morton
2020-12-15  3:07 ` [patch 078/200] mm: cleanup: remove unused tsk arg from __access_remote_vm Andrew Morton
2020-12-15  3:07 ` [patch 079/200] mm/mapping_dirty_helpers: enhance the kernel-doc markups Andrew Morton
2020-12-15  3:07 ` [patch 080/200] mm/page_vma_mapped.c: add colon to fix kernel-doc markups error for check_pte Andrew Morton
2020-12-15  3:07 ` [patch 081/200] mm: mmap_lock: add tracepoints around lock acquisition Andrew Morton
2020-12-15  3:07 ` [patch 082/200] sparc: fix handling of page table constructor failure Andrew Morton
2020-12-15  3:08 ` [patch 083/200] mm: move free_unref_page to mm/internal.h Andrew Morton
2020-12-15  3:08 ` [patch 084/200] mm/mremap: account memory on do_munmap() failure Andrew Morton
2020-12-15  3:08 ` [patch 085/200] mm/mremap: for MREMAP_DONTUNMAP check security_vm_enough_memory_mm() Andrew Morton
2020-12-15  3:08 ` [patch 086/200] mremap: don't allow MREMAP_DONTUNMAP on special_mappings and aio Andrew Morton
2020-12-28 17:59   ` Brian Geffon
2020-12-15  3:08 ` [patch 087/200] vm_ops: rename .split() callback to .may_split() Andrew Morton
2020-12-15  3:08 ` [patch 088/200] mremap: check if it's possible to split original vma Andrew Morton
2020-12-15  3:08 ` [patch 089/200] mm: forbid splitting special mappings Andrew Morton
2020-12-15  3:08 ` [patch 090/200] mm: track mmu notifiers in fs_reclaim_acquire/release Andrew Morton
2020-12-15  3:08 ` [patch 091/200] mm: extract might_alloc() debug check Andrew Morton
2020-12-15  3:08 ` [patch 092/200] locking/selftests: add testcases for fs_reclaim Andrew Morton
2020-12-15  3:08 ` [patch 093/200] mm/vmalloc.c:__vmalloc_area_node(): avoid 32-bit overflow Andrew Morton
2020-12-15  3:08 ` [patch 094/200] mm/vmalloc: use free_vm_area() if an allocation fails Andrew Morton
2020-12-15  3:08 ` [patch 095/200] mm/vmalloc: rework the drain logic Andrew Morton
2020-12-15  3:08 ` [patch 096/200] mm/vmalloc: add 'align' parameter explanation for pvm_determine_end_from_reverse Andrew Morton
2020-12-15  3:08 ` [patch 097/200] mm/vmalloc.c: remove unnecessary return statement Andrew Morton
2020-12-15  3:08 ` [patch 098/200] mm/vmalloc: Fix unlock order in s_stop() Andrew Morton
2020-12-15  3:09 ` [patch 099/200] docs/vm: remove unused 3 items explanation for /proc/vmstat Andrew Morton
2020-12-15  3:09 ` [patch 100/200] mm/vmalloc.c: fix kasan shadow poisoning size Andrew Morton
2020-12-15  3:09 ` [patch 101/200] workqueue: kasan: record workqueue stack Andrew Morton
2020-12-15  3:09 ` [patch 102/200] kasan: print " Andrew Morton
2020-12-15  3:09 ` [patch 103/200] lib/test_kasan.c: add workqueue test case Andrew Morton
2020-12-15  3:09 ` [patch 104/200] kasan: update documentation for generic kasan Andrew Morton
2020-12-15  3:09 ` [patch 105/200] lkdtm: disable KASAN for rodata.o Andrew Morton
2020-12-15  3:09 ` [patch 106/200] alpha: switch from DISCONTIGMEM to SPARSEMEM Andrew Morton
2020-12-15  3:09 ` [patch 107/200] ia64: remove custom __early_pfn_to_nid() Andrew Morton
2020-12-15  3:09 ` [patch 108/200] ia64: remove 'ifdef CONFIG_ZONE_DMA32' statements Andrew Morton
2020-12-15  3:09 ` [patch 109/200] ia64: discontig: paging_init(): remove local max_pfn calculation Andrew Morton
2020-12-15  3:09 ` [patch 110/200] ia64: split virtual map initialization out of paging_init() Andrew Morton
2020-12-15  3:09 ` [patch 111/200] ia64: forbid using VIRTUAL_MEM_MAP with FLATMEM Andrew Morton
2020-12-15  3:09 ` [patch 112/200] ia64: make SPARSEMEM default and disable DISCONTIGMEM Andrew Morton
2020-12-15  3:09 ` [patch 113/200] arm: remove CONFIG_ARCH_HAS_HOLES_MEMORYMODEL Andrew Morton
2020-12-15  3:09 ` [patch 114/200] arm, arm64: move free_unused_memmap() to generic mm Andrew Morton
2020-12-15  3:10 ` [patch 115/200] arc: use FLATMEM with freeing of unused memory map instead of DISCONTIGMEM Andrew Morton
2020-12-15  3:10 ` [patch 116/200] m68k/mm: make node data and node setup depend on CONFIG_DISCONTIGMEM Andrew Morton
2020-12-15  3:10 ` [patch 117/200] m68k/mm: enable use of generic memory_model.h for !DISCONTIGMEM Andrew Morton
2020-12-15  3:10 ` [patch 118/200] m68k: deprecate DISCONTIGMEM Andrew Morton
2020-12-15  3:10 ` [patch 119/200] mm: introduce debug_pagealloc_{map,unmap}_pages() helpers Andrew Morton
2020-12-15  3:10 ` [patch 120/200] PM: hibernate: make direct map manipulations more explicit Andrew Morton
2020-12-15  3:10 ` [patch 121/200] arch, mm: restore dependency of __kernel_map_pages() on DEBUG_PAGEALLOC Andrew Morton
2020-12-15  3:10 ` [patch 122/200] arch, mm: make kernel_page_present() always available Andrew Morton
2020-12-15  3:10 ` [patch 123/200] mm, page_alloc: clean up pageset high and batch update Andrew Morton
2020-12-15  3:10 ` [patch 124/200] mm, page_alloc: calculate pageset high and batch once per zone Andrew Morton
2020-12-15  3:10 ` [patch 125/200] mm, page_alloc: remove setup_pageset() Andrew Morton
2020-12-15  3:10 ` [patch 126/200] mm, page_alloc: simplify pageset_update() Andrew Morton
2020-12-15  3:10 ` [patch 127/200] mm, page_alloc: cache pageset high and batch in struct zone Andrew Morton
2020-12-15  3:10 ` [patch 128/200] mm, page_alloc: move draining pcplists to page isolation users Andrew Morton
2020-12-15  3:10 ` [patch 129/200] mm, page_alloc: disable pcplists during memory offline Andrew Morton
2020-12-15  3:11 ` [patch 130/200] include/linux/page-flags.h: remove unused __[Set|Clear]PagePrivate Andrew Morton
2020-12-15  3:11 ` [patch 131/200] mm/page-flags: fix comment Andrew Morton
2020-12-15  3:11 ` [patch 132/200] mm/page_alloc: add __free_pages() documentation Andrew Morton
2020-12-15  3:11 ` [patch 133/200] mm/page_alloc: mark some symbols with static keyword Andrew Morton
2020-12-15  3:11 ` [patch 134/200] mm/page_alloc: clear all pages in post_alloc_hook() with init_on_alloc=1 Andrew Morton
2020-12-15  3:11 ` [patch 135/200] init/main: fix broken buffer_init when DEFERRED_STRUCT_PAGE_INIT set Andrew Morton
2020-12-15  3:11 ` [patch 136/200] mm: page_alloc: refactor setup_per_zone_lowmem_reserve() Andrew Morton
2020-12-15  3:11 ` [patch 137/200] mm/page_alloc: speed up the iteration of max_order Andrew Morton
2020-12-15  3:11 ` [patch 138/200] mm,hwpoison: drain pcplists before bailing out for non-buddy zero-refcount page Andrew Morton
2020-12-15  3:11 ` [patch 139/200] mm,hwpoison: take free pages off the buddy freelists Andrew Morton
2020-12-15  3:11 ` [patch 140/200] mm,hwpoison: drop unneeded pcplist draining Andrew Morton
2020-12-15  3:11 ` [patch 141/200] mm,hwpoison: refactor get_any_page Andrew Morton
2020-12-15  3:11 ` [patch 142/200] mm,hwpoison: disable pcplists before grabbing a refcount Andrew Morton
2020-12-15  3:11 ` [patch 143/200] mm,hwpoison: remove drain_all_pages from shake_page Andrew Morton
2020-12-15  3:11 ` [patch 144/200] mm,memory_failure: always pin the page in madvise_inject_error Andrew Morton
2020-12-15  3:11 ` [patch 145/200] mm,hwpoison: return -EBUSY when migration fails Andrew Morton
2020-12-15  3:11 ` [patch 146/200] mm/hugetlb.c: just use put_page_testzero() instead of page_count() Andrew Morton
2020-12-15  3:11 ` [patch 147/200] include/linux/huge_mm.h: remove extern keyword Andrew Morton
2020-12-15  3:12 ` [patch 148/200] khugepaged: add parameter explanations for kernel-doc markup Andrew Morton
2020-12-15  3:12 ` [patch 149/200] mm: hugetlb: fix type of delta parameter and related local variables in gather_surplus_pages() Andrew Morton
2020-12-15  3:12 ` [patch 150/200] mm,hugetlb: remove unneeded initialization Andrew Morton
2020-12-15  3:12 ` [patch 151/200] hugetlb: fix an error code in hugetlb_reserve_pages() Andrew Morton
2020-12-15  3:12 ` [patch 152/200] mm: don't wake kswapd prematurely when watermark boosting is disabled Andrew Morton
2020-12-15  3:12 ` [patch 153/200] mm/vmscan: drop unneeded assignment in kswapd() Andrew Morton
2020-12-15  3:12 ` [patch 154/200] mm/vmscan.c: remove the filename in the top of file comment Andrew Morton
2020-12-15  3:12 ` [patch 155/200] mm/page_isolation: do not isolate the max order page Andrew Morton
2020-12-15  3:12 ` [patch 156/200] z3fold: simplify freeing slots Andrew Morton
2020-12-15  3:12 ` Andrew Morton [this message]
2020-12-15  3:12 ` [patch 158/200] z3fold: remove preempt disabled sections for RT Andrew Morton
2020-12-15  3:12 ` [patch 159/200] mm/compaction: rename 'start_pfn' to 'iteration_start_pfn' in compact_zone() Andrew Morton
2020-12-15  3:12 ` [patch 160/200] mm/compaction: move compaction_suitable's comment to right place Andrew Morton
2020-12-15  3:12 ` [patch 161/200] mm/compaction: make defer_compaction and compaction_deferred static Andrew Morton
2020-12-15  3:12 ` [patch 162/200] mm/oom_kill: change comment and rename is_dump_unreclaim_slabs() Andrew Morton
2020-12-15  3:12 ` [patch 163/200] mm/migrate.c: fix comment spelling Andrew Morton
2020-12-15  3:12 ` [patch 164/200] mm/migrate.c: optimize migrate_vma_pages() mmu notifier Andrew Morton
2020-12-15  3:12 ` [patch 165/200] mm: support THPs in zero_user_segments Andrew Morton
2020-12-15  3:13 ` [patch 166/200] mm: truncate_complete_page() does not exist any more Andrew Morton
2020-12-15  3:13 ` [patch 167/200] mm: migrate: simplify the logic for handling permanent failure Andrew Morton
2020-12-15  3:13 ` [patch 168/200] mm: migrate: skip shared exec THP for NUMA balancing Andrew Morton
2020-12-15  3:13 ` [patch 169/200] mm: migrate: clean up migrate_prep{_local} Andrew Morton
2020-12-15  3:13 ` [patch 170/200] mm: migrate: return -ENOSYS if THP migration is unsupported Andrew Morton
2020-12-15  3:13 ` [patch 171/200] mm: migrate: remove unused parameter in migrate_vma_insert_page() Andrew Morton
2020-12-15  3:13 ` [patch 172/200] mm/cma.c: remove redundant cma_mutex lock Andrew Morton
2020-12-15  3:13 ` [patch 173/200] mm: cma: improve pr_debug log in cma_release() Andrew Morton
2020-12-15  3:13 ` [patch 174/200] mm, page_alloc: do not rely on the order of page_poison and init_on_alloc/free parameters Andrew Morton
2020-12-15  3:13 ` [patch 175/200] mm, page_poison: use static key more efficiently Andrew Morton
2020-12-15  3:13 ` [patch 176/200] kernel/power: allow hibernation with page_poison sanity checking Andrew Morton
2020-12-15  3:13 ` [patch 177/200] mm, page_poison: remove CONFIG_PAGE_POISONING_NO_SANITY Andrew Morton
2020-12-15  3:13 ` [patch 178/200] mm, page_poison: remove CONFIG_PAGE_POISONING_ZERO Andrew Morton
2020-12-15  3:13 ` [patch 179/200] userfaultfd: add UFFD_USER_MODE_ONLY Andrew Morton
2020-12-15  3:13 ` [patch 180/200] userfaultfd: add user-mode only option to unprivileged_userfaultfd sysctl knob Andrew Morton
2020-12-15  3:13 ` [patch 181/200] userfaultfd: selftests: make __{s,u}64 format specifiers portable Andrew Morton
2020-12-15  3:14 ` [patch 182/200] userfaultfd/selftests: always dump something in modes Andrew Morton
2020-12-15  3:14 ` [patch 183/200] userfaultfd/selftests: fix retval check for userfaultfd_open() Andrew Morton
2020-12-15  3:14 ` [patch 184/200] userfaultfd/selftests: hint the test runner on required privilege Andrew Morton
2020-12-15  3:14 ` [patch 185/200] mm/zswap: make struct kernel_param_ops definitions const Andrew Morton
2020-12-15  3:14 ` [patch 186/200] mm/zswap: fix passing zero to 'PTR_ERR' warning Andrew Morton
2020-12-15  3:14 ` [patch 187/200] mm/zswap: move to use crypto_acomp API for hardware acceleration Andrew Morton
2020-12-15  3:14 ` [patch 188/200] mm/zsmalloc.c: rework the list_add code in insert_zspage() Andrew Morton
2020-12-15  3:14 ` [patch 189/200] mm/process_vm_access: remove redundant initialization of iov_r Andrew Morton
2020-12-15  3:14 ` [patch 190/200] zram: support page writeback Andrew Morton
2020-12-15  3:14 ` [patch 191/200] zram: add stat to gather incompressible pages since zram set up Andrew Morton
2020-12-15  3:14 ` [patch 192/200] zram: break the strict dependency from lzo Andrew Morton
2020-12-15  3:14 ` [patch 193/200] mm: fix kernel-doc markups Andrew Morton
2020-12-15  3:14 ` [patch 194/200] mm: use sysfs_emit for struct kobject * uses Andrew Morton
2020-12-15  3:14 ` [patch 195/200] mm: huge_memory: convert remaining use of sprintf to sysfs_emit and neatening Andrew Morton
2020-12-15  3:14 ` [patch 196/200] mm:backing-dev: use sysfs_emit in macro defining functions Andrew Morton
2020-12-15  3:14 ` [patch 197/200] mm: shmem: convert shmem_enabled_show to use sysfs_emit_at Andrew Morton
2020-12-15  3:14 ` [patch 198/200] mm: slub: convert sysfs sprintf family to sysfs_emit/sysfs_emit_at Andrew Morton
2020-12-15  3:15 ` [patch 199/200] mm: fix fall-through warnings for Clang Andrew Morton
2020-12-15  3:15 ` [patch 200/200] mm: cleanup kstrto*() usage Andrew Morton
2020-12-15  3:25 ` incoming Linus Torvalds
2020-12-15  3:30   ` incoming Linus Torvalds
2020-12-15 14:04     ` incoming Konstantin Ryabitsev

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=20201215031233.w8BaLY70F%akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=bigeasy@linutronix.de \
    --cc=efault@gmx.de \
    --cc=linux-mm@kvack.org \
    --cc=mm-commits@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=vitaly.wool@konsulko.com \
    --subject='Re: [patch 157/200] z3fold: stricter locking and more careful reclaim' \
    /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

This is a public inbox, see mirroring instructions
on how to clone and mirror all data and code used for this inbox