mm-commits.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: akpm@linux-foundation.org, ccross@google.com,
	dave.hansen@intel.com, ebiederm@xmission.com,
	gorcunov@openvz.org, hannes@cmpxchg.org, hughd@google.com,
	jan.glauber@gmail.com, john.stultz@linaro.org,
	keescook@chromium.org, linux-mm@kvack.org, mgorman@suse.de,
	minchan@kernel.org, mingo@kernel.org, mm-commits@vger.kernel.org,
	oleg@redhat.com, penberg@kernel.org, peterz@infradead.org,
	rientjes@google.com, rob@landley.net, serge.hallyn@ubuntu.com,
	shli@fusionio.com, surenb@google.com,
	torvalds@linux-foundation.org, viro@zeniv.linux.org.uk
Subject: [patch 056/146] mm: rearrange madvise code to allow for reuse
Date: Fri, 14 Jan 2022 14:05:55 -0800	[thread overview]
Message-ID: <20220114220555.kAbhSEmus%akpm@linux-foundation.org> (raw)
In-Reply-To: <20220114140222.6b14f0061194d3200000c52d@linux-foundation.org>

From: Colin Cross <ccross@google.com>
Subject: mm: rearrange madvise code to allow for reuse

Patch series "mm: rearrange madvise code to allow for reuse", v11.

Speed up fork() by up to 40% by refcounting the anon vma name field.

I checked the image sizes with allnoconfig builds:

unpatched Linus' ToT
   text    data     bss     dec     hex filename
1324759      32   73928 1398719 1557bf vmlinux

After the first patch is applied (madvise refactoring)
   text    data     bss     dec     hex filename
1322346      32   73928 1396306 154e52 vmlinux
>>> 2413 bytes decrease vs ToT <<<

After all patches applied with CONFIG_ANON_VMA_NAME=n
   text    data     bss     dec     hex filename
1322337      32   73928 1396297 154e49 vmlinux
>>> 2422 bytes decrease vs ToT <<<

After all patches applied with CONFIG_ANON_VMA_NAME=y
   text    data     bss     dec     hex filename
1325228      32   73928 1399188 155994 vmlinux
>>> 469 bytes increase vs ToT <<<


This patch (of 3):

Refactor the madvise syscall to allow for parts of it to be reused by a
prctl syscall that affects vmas.

Move the code that walks vmas in a virtual address range into a function
that takes a function pointer as a parameter.  The only caller for now is
sys_madvise, which uses it to call madvise_vma_behavior on each vma, but
the next patch will add an additional caller.

Move handling all vma behaviors inside madvise_behavior, and rename it to
madvise_vma_behavior.

Move the code that updates the flags on a vma, including splitting or
merging the vma as necessary, into a new function called
madvise_update_vma.  The next patch will add support for updating a new
anon_name field as well.

Link: https://lkml.kernel.org/r/20211019215511.3771969-1-surenb@google.com
Signed-off-by: Colin Cross <ccross@google.com>
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Jan Glauber <jan.glauber@gmail.com>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Rob Landley <rob@landley.net>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Kees Cook <keescook@chromium.org>
Cc: "Serge E. Hallyn" <serge.hallyn@ubuntu.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Hugh Dickins <hughd@google.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Shaohua Li <shli@fusionio.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Minchan Kim <minchan@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 mm/madvise.c |  338 +++++++++++++++++++++++++------------------------
 1 file changed, 178 insertions(+), 160 deletions(-)

--- a/mm/madvise.c~mm-rearrange-madvise-code-to-allow-for-reuse
+++ a/mm/madvise.c
@@ -63,76 +63,20 @@ static int madvise_need_mmap_write(int b
 }
 
 /*
- * We can potentially split a vm area into separate
- * areas, each area with its own behavior.
+ * Update the vm_flags on region of a vma, splitting it or merging it as
+ * necessary.  Must be called with mmap_sem held for writing;
  */
-static long madvise_behavior(struct vm_area_struct *vma,
-		     struct vm_area_struct **prev,
-		     unsigned long start, unsigned long end, int behavior)
+static int madvise_update_vma(struct vm_area_struct *vma,
+			      struct vm_area_struct **prev, unsigned long start,
+			      unsigned long end, unsigned long new_flags)
 {
 	struct mm_struct *mm = vma->vm_mm;
-	int error = 0;
+	int error;
 	pgoff_t pgoff;
-	unsigned long new_flags = vma->vm_flags;
-
-	switch (behavior) {
-	case MADV_NORMAL:
-		new_flags = new_flags & ~VM_RAND_READ & ~VM_SEQ_READ;
-		break;
-	case MADV_SEQUENTIAL:
-		new_flags = (new_flags & ~VM_RAND_READ) | VM_SEQ_READ;
-		break;
-	case MADV_RANDOM:
-		new_flags = (new_flags & ~VM_SEQ_READ) | VM_RAND_READ;
-		break;
-	case MADV_DONTFORK:
-		new_flags |= VM_DONTCOPY;
-		break;
-	case MADV_DOFORK:
-		if (vma->vm_flags & VM_IO) {
-			error = -EINVAL;
-			goto out;
-		}
-		new_flags &= ~VM_DONTCOPY;
-		break;
-	case MADV_WIPEONFORK:
-		/* MADV_WIPEONFORK is only supported on anonymous memory. */
-		if (vma->vm_file || vma->vm_flags & VM_SHARED) {
-			error = -EINVAL;
-			goto out;
-		}
-		new_flags |= VM_WIPEONFORK;
-		break;
-	case MADV_KEEPONFORK:
-		new_flags &= ~VM_WIPEONFORK;
-		break;
-	case MADV_DONTDUMP:
-		new_flags |= VM_DONTDUMP;
-		break;
-	case MADV_DODUMP:
-		if (!is_vm_hugetlb_page(vma) && new_flags & VM_SPECIAL) {
-			error = -EINVAL;
-			goto out;
-		}
-		new_flags &= ~VM_DONTDUMP;
-		break;
-	case MADV_MERGEABLE:
-	case MADV_UNMERGEABLE:
-		error = ksm_madvise(vma, start, end, behavior, &new_flags);
-		if (error)
-			goto out_convert_errno;
-		break;
-	case MADV_HUGEPAGE:
-	case MADV_NOHUGEPAGE:
-		error = hugepage_madvise(vma, &new_flags, behavior);
-		if (error)
-			goto out_convert_errno;
-		break;
-	}
 
 	if (new_flags == vma->vm_flags) {
 		*prev = vma;
-		goto out;
+		return 0;
 	}
 
 	pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT);
@@ -147,23 +91,19 @@ static long madvise_behavior(struct vm_a
 	*prev = vma;
 
 	if (start != vma->vm_start) {
-		if (unlikely(mm->map_count >= sysctl_max_map_count)) {
-			error = -ENOMEM;
-			goto out;
-		}
+		if (unlikely(mm->map_count >= sysctl_max_map_count))
+			return -ENOMEM;
 		error = __split_vma(mm, vma, start, 1);
 		if (error)
-			goto out_convert_errno;
+			return error;
 	}
 
 	if (end != vma->vm_end) {
-		if (unlikely(mm->map_count >= sysctl_max_map_count)) {
-			error = -ENOMEM;
-			goto out;
-		}
+		if (unlikely(mm->map_count >= sysctl_max_map_count))
+			return -ENOMEM;
 		error = __split_vma(mm, vma, end, 0);
 		if (error)
-			goto out_convert_errno;
+			return error;
 	}
 
 success:
@@ -172,15 +112,7 @@ success:
 	 */
 	vma->vm_flags = new_flags;
 
-out_convert_errno:
-	/*
-	 * madvise() returns EAGAIN if kernel resources, such as
-	 * slab, are temporarily unavailable.
-	 */
-	if (error == -ENOMEM)
-		error = -EAGAIN;
-out:
-	return error;
+	return 0;
 }
 
 #ifdef CONFIG_SWAP
@@ -930,6 +862,94 @@ static long madvise_remove(struct vm_are
 	return error;
 }
 
+/*
+ * Apply an madvise behavior to a region of a vma.  madvise_update_vma
+ * will handle splitting a vm area into separate areas, each area with its own
+ * behavior.
+ */
+static int madvise_vma_behavior(struct vm_area_struct *vma,
+				struct vm_area_struct **prev,
+				unsigned long start, unsigned long end,
+				unsigned long behavior)
+{
+	int error;
+	unsigned long new_flags = vma->vm_flags;
+
+	switch (behavior) {
+	case MADV_REMOVE:
+		return madvise_remove(vma, prev, start, end);
+	case MADV_WILLNEED:
+		return madvise_willneed(vma, prev, start, end);
+	case MADV_COLD:
+		return madvise_cold(vma, prev, start, end);
+	case MADV_PAGEOUT:
+		return madvise_pageout(vma, prev, start, end);
+	case MADV_FREE:
+	case MADV_DONTNEED:
+		return madvise_dontneed_free(vma, prev, start, end, behavior);
+	case MADV_POPULATE_READ:
+	case MADV_POPULATE_WRITE:
+		return madvise_populate(vma, prev, start, end, behavior);
+	case MADV_NORMAL:
+		new_flags = new_flags & ~VM_RAND_READ & ~VM_SEQ_READ;
+		break;
+	case MADV_SEQUENTIAL:
+		new_flags = (new_flags & ~VM_RAND_READ) | VM_SEQ_READ;
+		break;
+	case MADV_RANDOM:
+		new_flags = (new_flags & ~VM_SEQ_READ) | VM_RAND_READ;
+		break;
+	case MADV_DONTFORK:
+		new_flags |= VM_DONTCOPY;
+		break;
+	case MADV_DOFORK:
+		if (vma->vm_flags & VM_IO)
+			return -EINVAL;
+		new_flags &= ~VM_DONTCOPY;
+		break;
+	case MADV_WIPEONFORK:
+		/* MADV_WIPEONFORK is only supported on anonymous memory. */
+		if (vma->vm_file || vma->vm_flags & VM_SHARED)
+			return -EINVAL;
+		new_flags |= VM_WIPEONFORK;
+		break;
+	case MADV_KEEPONFORK:
+		new_flags &= ~VM_WIPEONFORK;
+		break;
+	case MADV_DONTDUMP:
+		new_flags |= VM_DONTDUMP;
+		break;
+	case MADV_DODUMP:
+		if (!is_vm_hugetlb_page(vma) && new_flags & VM_SPECIAL)
+			return -EINVAL;
+		new_flags &= ~VM_DONTDUMP;
+		break;
+	case MADV_MERGEABLE:
+	case MADV_UNMERGEABLE:
+		error = ksm_madvise(vma, start, end, behavior, &new_flags);
+		if (error)
+			goto out;
+		break;
+	case MADV_HUGEPAGE:
+	case MADV_NOHUGEPAGE:
+		error = hugepage_madvise(vma, &new_flags, behavior);
+		if (error)
+			goto out;
+		break;
+	}
+
+	error = madvise_update_vma(vma, prev, start, end, new_flags);
+
+out:
+	/*
+	 * madvise() returns EAGAIN if kernel resources, such as
+	 * slab, are temporarily unavailable.
+	 */
+	if (error == -ENOMEM)
+		error = -EAGAIN;
+	return error;
+}
+
 #ifdef CONFIG_MEMORY_FAILURE
 /*
  * Error injection support for memory error handling.
@@ -978,30 +998,6 @@ static int madvise_inject_error(int beha
 }
 #endif
 
-static long
-madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev,
-		unsigned long start, unsigned long end, int behavior)
-{
-	switch (behavior) {
-	case MADV_REMOVE:
-		return madvise_remove(vma, prev, start, end);
-	case MADV_WILLNEED:
-		return madvise_willneed(vma, prev, start, end);
-	case MADV_COLD:
-		return madvise_cold(vma, prev, start, end);
-	case MADV_PAGEOUT:
-		return madvise_pageout(vma, prev, start, end);
-	case MADV_FREE:
-	case MADV_DONTNEED:
-		return madvise_dontneed_free(vma, prev, start, end, behavior);
-	case MADV_POPULATE_READ:
-	case MADV_POPULATE_WRITE:
-		return madvise_populate(vma, prev, start, end, behavior);
-	default:
-		return madvise_behavior(vma, prev, start, end, behavior);
-	}
-}
-
 static bool
 madvise_behavior_valid(int behavior)
 {
@@ -1056,6 +1052,73 @@ process_madvise_behavior_valid(int behav
 }
 
 /*
+ * Walk the vmas in range [start,end), and call the visit function on each one.
+ * The visit function will get start and end parameters that cover the overlap
+ * between the current vma and the original range.  Any unmapped regions in the
+ * original range will result in this function returning -ENOMEM while still
+ * calling the visit function on all of the existing vmas in the range.
+ * Must be called with the mmap_lock held for reading or writing.
+ */
+static
+int madvise_walk_vmas(struct mm_struct *mm, unsigned long start,
+		      unsigned long end, unsigned long arg,
+		      int (*visit)(struct vm_area_struct *vma,
+				   struct vm_area_struct **prev, unsigned long start,
+				   unsigned long end, unsigned long arg))
+{
+	struct vm_area_struct *vma;
+	struct vm_area_struct *prev;
+	unsigned long tmp;
+	int unmapped_error = 0;
+
+	/*
+	 * If the interval [start,end) covers some unmapped address
+	 * ranges, just ignore them, but return -ENOMEM at the end.
+	 * - different from the way of handling in mlock etc.
+	 */
+	vma = find_vma_prev(mm, start, &prev);
+	if (vma && start > vma->vm_start)
+		prev = vma;
+
+	for (;;) {
+		int error;
+
+		/* Still start < end. */
+		if (!vma)
+			return -ENOMEM;
+
+		/* Here start < (end|vma->vm_end). */
+		if (start < vma->vm_start) {
+			unmapped_error = -ENOMEM;
+			start = vma->vm_start;
+			if (start >= end)
+				break;
+		}
+
+		/* Here vma->vm_start <= start < (end|vma->vm_end) */
+		tmp = vma->vm_end;
+		if (end < tmp)
+			tmp = end;
+
+		/* Here vma->vm_start <= start < tmp <= (end|vma->vm_end). */
+		error = visit(vma, &prev, start, tmp, arg);
+		if (error)
+			return error;
+		start = tmp;
+		if (prev && start < prev->vm_end)
+			start = prev->vm_end;
+		if (start >= end)
+			break;
+		if (prev)
+			vma = prev->vm_next;
+		else	/* madvise_remove dropped mmap_lock */
+			vma = find_vma(mm, start);
+	}
+
+	return unmapped_error;
+}
+
+/*
  * The madvise(2) system call.
  *
  * Applications can use madvise() to advise the kernel how it should
@@ -1127,10 +1190,8 @@ process_madvise_behavior_valid(int behav
  */
 int do_madvise(struct mm_struct *mm, unsigned long start, size_t len_in, int behavior)
 {
-	unsigned long end, tmp;
-	struct vm_area_struct *vma, *prev;
-	int unmapped_error = 0;
-	int error = -EINVAL;
+	unsigned long end;
+	int error;
 	int write;
 	size_t len;
 	struct blk_plug plug;
@@ -1138,23 +1199,22 @@ int do_madvise(struct mm_struct *mm, uns
 	start = untagged_addr(start);
 
 	if (!madvise_behavior_valid(behavior))
-		return error;
+		return -EINVAL;
 
 	if (!PAGE_ALIGNED(start))
-		return error;
+		return -EINVAL;
 	len = PAGE_ALIGN(len_in);
 
 	/* Check to see whether len was rounded up from small -ve to zero */
 	if (len_in && !len)
-		return error;
+		return -EINVAL;
 
 	end = start + len;
 	if (end < start)
-		return error;
+		return -EINVAL;
 
-	error = 0;
 	if (end == start)
-		return error;
+		return 0;
 
 #ifdef CONFIG_MEMORY_FAILURE
 	if (behavior == MADV_HWPOISON || behavior == MADV_SOFT_OFFLINE)
@@ -1169,51 +1229,9 @@ int do_madvise(struct mm_struct *mm, uns
 		mmap_read_lock(mm);
 	}
 
-	/*
-	 * If the interval [start,end) covers some unmapped address
-	 * ranges, just ignore them, but return -ENOMEM at the end.
-	 * - different from the way of handling in mlock etc.
-	 */
-	vma = find_vma_prev(mm, start, &prev);
-	if (vma && start > vma->vm_start)
-		prev = vma;
-
 	blk_start_plug(&plug);
-	for (;;) {
-		/* Still start < end. */
-		error = -ENOMEM;
-		if (!vma)
-			goto out;
-
-		/* Here start < (end|vma->vm_end). */
-		if (start < vma->vm_start) {
-			unmapped_error = -ENOMEM;
-			start = vma->vm_start;
-			if (start >= end)
-				goto out;
-		}
-
-		/* Here vma->vm_start <= start < (end|vma->vm_end) */
-		tmp = vma->vm_end;
-		if (end < tmp)
-			tmp = end;
-
-		/* Here vma->vm_start <= start < tmp <= (end|vma->vm_end). */
-		error = madvise_vma(vma, &prev, start, tmp, behavior);
-		if (error)
-			goto out;
-		start = tmp;
-		if (prev && start < prev->vm_end)
-			start = prev->vm_end;
-		error = unmapped_error;
-		if (start >= end)
-			goto out;
-		if (prev)
-			vma = prev->vm_next;
-		else	/* madvise_remove dropped mmap_lock */
-			vma = find_vma(mm, start);
-	}
-out:
+	error = madvise_walk_vmas(mm, start, end, behavior,
+			madvise_vma_behavior);
 	blk_finish_plug(&plug);
 	if (write)
 		mmap_write_unlock(mm);
_

  parent reply	other threads:[~2022-01-14 22:05 UTC|newest]

Thread overview: 150+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-14 22:02 incoming Andrew Morton
2022-01-14 22:02 ` [patch 001/146] kthread: add the helper function kthread_run_on_cpu() Andrew Morton
2022-01-14 22:02 ` [patch 002/146] RDMA/siw: make use of " Andrew Morton
2022-01-16 16:56   ` Bernard Metzler
2022-01-14 22:02 ` [patch 003/146] ring-buffer: " Andrew Morton
2022-01-14 22:03 ` [patch 004/146] rcutorture: " Andrew Morton
2022-01-14 22:03 ` [patch 005/146] trace/osnoise: " Andrew Morton
2022-01-14 22:03 ` [patch 006/146] trace/hwlat: " Andrew Morton
2022-01-14 22:03 ` [patch 007/146] ia64: module: use swap() to make code cleaner Andrew Morton
2022-01-14 22:03 ` [patch 008/146] arch/ia64/kernel/setup.c: " Andrew Morton
2022-01-14 22:03 ` [patch 009/146] ia64: fix typo in a comment Andrew Morton
2022-01-14 22:03 ` [patch 010/146] ia64: topology: use default_groups in kobj_type Andrew Morton
2022-01-14 22:03 ` [patch 011/146] scripts/spelling.txt: add "oveflow" Andrew Morton
2022-01-14 22:03 ` [patch 012/146] fs/ntfs/attrib.c: fix one kernel-doc comment Andrew Morton
2022-01-14 22:03 ` [patch 013/146] squashfs: provide backing_dev_info in order to disable read-ahead Andrew Morton
2022-01-14 22:03 ` [patch 014/146] ocfs2: use BUG_ON instead of if condition followed by BUG Andrew Morton
2022-01-14 22:03 ` [patch 015/146] ocfs2: clearly handle ocfs2_grab_pages_for_write() return value Andrew Morton
2022-01-14 22:03 ` [patch 016/146] ocfs2: use default_groups in kobj_type Andrew Morton
2022-01-14 22:03 ` [patch 017/146] ocfs2: remove redundant assignment to pointer root_bh Andrew Morton
2022-01-14 22:03 ` [patch 018/146] ocfs2: cluster: use default_groups in kobj_type Andrew Morton
2022-01-14 22:03 ` [patch 019/146] ocfs2: remove redundant assignment to variable free_space Andrew Morton
2022-01-14 22:03 ` [patch 020/146] fs/ioctl: remove unnecessary __user annotation Andrew Morton
2022-01-14 22:03 ` [patch 021/146] mm/slab_common: use WARN() if cache still has objects on destroy Andrew Morton
2022-01-14 22:04 ` [patch 022/146] mm: slab: make slab iterator functions static Andrew Morton
2022-01-14 22:04 ` [patch 023/146] kmemleak: fix kmemleak false positive report with HW tag-based kasan enable Andrew Morton
2022-01-14 22:04 ` [patch 024/146] mm: kmemleak: alloc gray object for reserved region with direct map Andrew Morton
2022-01-14 22:04 ` [patch 025/146] mm: defer kmemleak object creation of module_alloc() Andrew Morton
2022-01-14 22:04 ` [patch 026/146] mm/page_alloc: split prep_compound_page into head and tail subparts Andrew Morton
2022-01-14 22:04 ` [patch 027/146] mm/page_alloc: refactor memmap_init_zone_device() page init Andrew Morton
2022-01-14 22:04 ` [patch 028/146] mm/memremap: add ZONE_DEVICE support for compound pages Andrew Morton
2022-01-14 22:04 ` [patch 029/146] device-dax: use ALIGN() for determining pgoff Andrew Morton
2022-01-14 22:04 ` [patch 030/146] device-dax: use struct_size() Andrew Morton
2022-01-14 22:04 ` [patch 031/146] device-dax: ensure dev_dax->pgmap is valid for dynamic devices Andrew Morton
2022-01-14 22:04 ` [patch 032/146] device-dax: factor out page mapping initialization Andrew Morton
2022-01-14 22:04 ` [patch 033/146] device-dax: set mapping prior to vmf_insert_pfn{,_pmd,pud}() Andrew Morton
2022-01-14 22:04 ` [patch 034/146] device-dax: remove pfn from __dev_dax_{pte,pmd,pud}_fault() Andrew Morton
2022-01-14 22:04 ` [patch 035/146] device-dax: compound devmap support Andrew Morton
2022-01-14 22:04 ` [patch 036/146] kasan: test: add globals left-out-of-bounds test Andrew Morton
2022-01-14 22:04 ` [patch 037/146] kasan: add ability to detect double-kmem_cache_destroy() Andrew Morton
2022-01-14 22:04 ` [patch 038/146] kasan: test: add test case for double-kmem_cache_destroy() Andrew Morton
2022-01-14 22:05 ` [patch 039/146] kasan: fix quarantine conflicting with init_on_free Andrew Morton
2022-01-14 22:05 ` [patch 040/146] mm,fs: split dump_mapping() out from dump_page() Andrew Morton
2022-01-14 22:05 ` [patch 041/146] mm/debug_vm_pgtable: update comments regarding migration swap entries Andrew Morton
2022-01-14 22:05 ` [patch 042/146] mm/truncate.c: remove unneeded variable Andrew Morton
2022-01-14 22:05 ` [patch 043/146] gup: avoid multiple user access locking/unlocking in fault_in_{read/write}able Andrew Morton
2022-01-14 22:05 ` [patch 044/146] mm/gup.c: stricter check on THP migration entry during follow_pmd_mask Andrew Morton
2022-01-14 22:05 ` [patch 045/146] mm: shmem: don't truncate page if memory failure happens Andrew Morton
2022-01-14 22:05 ` [patch 046/146] shmem: fix a race between shmem_unused_huge_shrink and shmem_evict_inode Andrew Morton
2022-01-14 22:05 ` [patch 047/146] mm/frontswap.c: use non-atomic '__set_bit()' when possible Andrew Morton
2022-01-14 22:05 ` [patch 048/146] mm: memcontrol: make cgroup_memory_nokmem static Andrew Morton
2022-01-14 22:05 ` [patch 049/146] mm/page_counter: remove an incorrect call to propagate_protected_usage() Andrew Morton
2022-01-14 22:05 ` [patch 050/146] mm/memcg: add oom_group_kill memory event Andrew Morton
2022-01-14 22:05 ` [patch 051/146] memcg: better bounds on the memcg stats updates Andrew Morton
2022-01-14 22:05 ` [patch 052/146] mm/memcg: use struct_size() helper in kzalloc() Andrew Morton
2022-01-14 22:05 ` [patch 053/146] memcg: add per-memcg vmalloc stat Andrew Morton
2022-01-14 22:05 ` [patch 054/146] tools/testing/selftests/vm/userfaultfd.c: use swap() to make code cleaner Andrew Morton
2022-01-14 22:05 ` [patch 055/146] mm: remove redundant check about FAULT_FLAG_ALLOW_RETRY bit Andrew Morton
2022-01-14 22:05 ` Andrew Morton [this message]
2022-01-15 14:16   ` [patch 056/146] mm: rearrange madvise code to allow for reuse Linus Torvalds
2022-01-18 16:34     ` Suren Baghdasaryan
2022-01-14 22:05 ` [patch 057/146] mm: add a field to store names for private anonymous memory Andrew Morton
2022-01-14 22:06 ` [patch 058/146] mm: add anonymous vma name refcounting Andrew Morton
2022-01-14 22:06 ` [patch 059/146] mm: move anon_vma declarations to linux/mm_inline.h Andrew Morton
2022-01-14 22:06 ` [patch 060/146] mm: move tlb_flush_pending inline helpers to mm_inline.h Andrew Morton
2022-01-14 22:06 ` [patch 061/146] mm: protect free_pgtables with mmap_lock write lock in exit_mmap Andrew Morton
2022-01-14 22:06 ` [patch 062/146] mm: document locking restrictions for vm_operations_struct::close Andrew Morton
2022-01-14 22:06 ` [patch 063/146] mm/oom_kill: allow process_mrelease to run under mmap_lock protection Andrew Morton
2022-01-14 22:06 ` [patch 064/146] docs/vm: add vmalloced-kernel-stacks document Andrew Morton
2022-01-14 22:06 ` [patch 065/146] mm: change page type prior to adding page table entry Andrew Morton
2022-01-14 22:06 ` [patch 066/146] mm: ptep_clear() page table helper Andrew Morton
2022-01-14 22:06 ` [patch 067/146] mm: page table check Andrew Morton
2022-01-14 22:06 ` [patch 068/146] x86: mm: add x86_64 support for " Andrew Morton
2022-01-14 22:06 ` [patch 069/146] mm: remove last argument of reuse_swap_page() Andrew Morton
2022-01-14 22:06 ` [patch 070/146] mm: remove the total_mapcount argument from page_trans_huge_map_swapcount() Andrew Morton
2022-01-14 22:06 ` [patch 071/146] mm: remove the total_mapcount argument from page_trans_huge_mapcount() Andrew Morton
2022-01-14 22:06 ` [patch 072/146] mm/dmapool.c: revert "make dma pool to use kmalloc_node" Andrew Morton
2022-01-14 22:06 ` [patch 073/146] mm/vmalloc: alloc GFP_NO{FS,IO} for vmalloc Andrew Morton
2022-01-14 22:07 ` [patch 074/146] mm/vmalloc: add support for __GFP_NOFAIL Andrew Morton
2022-01-14 22:07 ` [patch 075/146] mm/vmalloc: be more explicit about supported gfp flags Andrew Morton
2022-01-14 22:07 ` [patch 076/146] mm: allow !GFP_KERNEL allocations for kvmalloc Andrew Morton
2022-01-14 22:07 ` [patch 077/146] mm: make slab and vmalloc allocators __GFP_NOLOCKDEP aware Andrew Morton
2022-01-14 22:07 ` [patch 078/146] mm: introduce memalloc_retry_wait() Andrew Morton
2022-01-14 22:07 ` [patch 079/146] mm/pagealloc: sysctl: change watermark_scale_factor max limit to 30% Andrew Morton
2022-01-14 22:07 ` [patch 080/146] mm: fix boolreturn.cocci warning Andrew Morton
2022-01-14 22:07 ` [patch 081/146] mm: page_alloc: fix building error on -Werror=array-compare Andrew Morton
2022-01-14 22:07 ` [patch 082/146] mm: drop node from alloc_pages_vma Andrew Morton
2022-01-14 22:07 ` [patch 083/146] include/linux/gfp.h: further document GFP_DMA32 Andrew Morton
2022-01-14 22:07 ` [patch 084/146] mm/page_alloc.c: modify the comment section for alloc_contig_pages() Andrew Morton
2022-01-14 22:07 ` [patch 085/146] mm_zone: add function to check if managed dma zone exists Andrew Morton
2022-01-14 22:07 ` [patch 086/146] dma/pool: create dma atomic pool only if dma zone has managed pages Andrew Morton
2022-01-14 22:07 ` [patch 087/146] mm/page_alloc.c: do not warn allocation failure on zone DMA if no " Andrew Morton
2022-01-14 22:07 ` [patch 088/146] hugetlb: add hugetlb.*.numa_stat file Andrew Morton
2022-01-14 22:07 ` [patch 089/146] mm, hugepages: make memory size variable in hugepage-mremap selftest Andrew Morton
2022-01-14 22:07 ` [patch 090/146] mm/vmstat: add events for THP max_ptes_* exceeds Andrew Morton
2022-01-14 22:07 ` [patch 091/146] selftests/vm: make charge_reserved_hugetlb.sh work with existing cgroup setting Andrew Morton
2022-01-14 22:08 ` [patch 092/146] selftests/uffd: allow EINTR/EAGAIN Andrew Morton
2022-01-14 22:08 ` [patch 093/146] userfaultfd/selftests: clean up hugetlb allocation code Andrew Morton
2022-01-14 22:08 ` [patch 094/146] vmscan: make drop_slab_node static Andrew Morton
2022-01-14 22:08 ` [patch 095/146] mm/page_isolation: unset migratetype directly for non Buddy page Andrew Morton
2022-01-14 22:08 ` [patch 096/146] mm/mempolicy: use policy_node helper with MPOL_PREFERRED_MANY Andrew Morton
2022-01-14 22:08 ` [patch 097/146] mm/mempolicy: add set_mempolicy_home_node syscall Andrew Morton
2022-01-14 22:08 ` [patch 098/146] mm/mempolicy: wire up syscall set_mempolicy_home_node Andrew Morton
2022-01-14 22:08 ` [patch 099/146] mm/mempolicy: fix all kernel-doc warnings Andrew Morton
2022-01-14 22:08 ` [patch 100/146] mm, oom: OOM sysrq should always kill a process Andrew Morton
2022-01-14 22:08 ` [patch 101/146] hugetlbfs: fix off-by-one error in hugetlb_vmdelete_list() Andrew Morton
2022-01-14 22:08 ` [patch 102/146] mm: migrate: fix the return value of migrate_pages() Andrew Morton
2022-01-14 22:08 ` [patch 103/146] mm: migrate: correct the hugetlb migration stats Andrew Morton
2022-01-14 22:08 ` [patch 104/146] mm: compaction: fix the migration stats in trace_mm_compaction_migratepages() Andrew Morton
2022-01-14 22:08 ` [patch 105/146] mm: migrate: support multiple target nodes demotion Andrew Morton
2022-01-14 22:08 ` [patch 106/146] mm: migrate: add more comments for selecting target node randomly Andrew Morton
2022-01-14 22:08 ` [patch 107/146] mm/migrate: move node demotion code to near its user Andrew Morton
2022-01-14 22:08 ` [patch 108/146] mm/migrate: remove redundant variables used in a for-loop Andrew Morton
2022-01-14 22:08 ` [patch 109/146] mm/thp: drop unused trace events hugepage_[invalidate|splitting] Andrew Morton
2022-01-14 22:08 ` [patch 110/146] mm: ksm: fix use-after-free kasan report in ksm_might_need_to_copy Andrew Morton
2022-01-14 22:09 ` [patch 111/146] mm/hwpoison: mf_mutex for soft offline and unpoison Andrew Morton
2022-01-14 22:09 ` [patch 112/146] mm/hwpoison: remove MF_MSG_BUDDY_2ND and MF_MSG_POISONED_HUGE Andrew Morton
2022-01-14 22:09 ` [patch 113/146] mm/hwpoison: fix unpoison_memory() Andrew Morton
2022-01-14 22:09 ` [patch 114/146] mm: memcg/percpu: account extra objcg space to memory cgroups Andrew Morton
2022-01-14 22:09 ` [patch 115/146] mm/rmap: fix potential batched TLB flush race Andrew Morton
2022-01-14 22:09 ` [patch 116/146] zpool: remove the list of pools_head Andrew Morton
2022-01-14 22:09 ` [patch 117/146] zram: use ATTRIBUTE_GROUPS Andrew Morton
2022-01-14 22:09 ` [patch 118/146] mm: fix some comment errors Andrew Morton
2022-01-14 22:09 ` [patch 119/146] mm: make some vars and functions static or __init Andrew Morton
2022-01-14 22:09 ` [patch 120/146] mm/hmm.c: allow VM_MIXEDMAP to work with hmm_range_fault Andrew Morton
2022-01-14 22:09 ` [patch 121/146] mm/damon: unified access_check function naming rules Andrew Morton
2022-01-14 22:09 ` [patch 122/146] mm/damon: add 'age' of region tracepoint support Andrew Morton
2022-01-14 22:09 ` [patch 123/146] mm/damon/core: use abs() instead of diff_of() Andrew Morton
2022-01-14 22:09 ` [patch 124/146] mm/damon: remove some unneeded function definitions in damon.h Andrew Morton
2022-01-14 22:09 ` [patch 125/146] mm/damon/vaddr: remove swap_ranges() and replace it with swap() Andrew Morton
2022-01-14 22:09 ` [patch 126/146] mm/damon/schemes: add the validity judgment of thresholds Andrew Morton
2022-01-14 22:09 ` [patch 127/146] mm/damon: move damon_rand() definition into damon.h Andrew Morton
2022-01-14 22:09 ` [patch 128/146] mm/damon: modify damon_rand() macro to static inline function Andrew Morton
2022-01-14 22:09 ` [patch 129/146] mm/damon: convert macro functions to static inline functions Andrew Morton
2022-01-14 22:10 ` [patch 130/146] Docs/admin-guide/mm/damon/usage: update for scheme quotas and watermarks Andrew Morton
2022-01-14 22:10 ` [patch 131/146] Docs/admin-guide/mm/damon/usage: remove redundant information Andrew Morton
2022-01-14 22:10 ` [patch 132/146] Docs/admin-guide/mm/damon/usage: mention tracepoint at the beginning Andrew Morton
2022-01-14 22:10 ` [patch 133/146] Docs/admin-guide/mm/damon/usage: update for kdamond_pid and (mk|rm)_contexts Andrew Morton
2022-01-14 22:10 ` [patch 134/146] mm/damon: remove a mistakenly added comment for a future feature Andrew Morton
2022-01-14 22:10 ` [patch 135/146] mm/damon/schemes: account scheme actions that successfully applied Andrew Morton
2022-01-14 22:10 ` [patch 136/146] mm/damon/schemes: account how many times quota limit has exceeded Andrew Morton
2022-01-14 22:10 ` [patch 137/146] mm/damon/reclaim: provide reclamation statistics Andrew Morton
2022-01-14 22:10 ` [patch 138/146] Docs/admin-guide/mm/damon/reclaim: document statistics parameters Andrew Morton
2022-01-14 22:10 ` [patch 139/146] mm/damon/dbgfs: support all DAMOS stats Andrew Morton
2022-01-14 22:10 ` [patch 140/146] Docs/admin-guide/mm/damon/usage: update for schemes statistics Andrew Morton
2022-01-14 22:10 ` [patch 141/146] mm/damon: add access checking for hugetlb pages Andrew Morton
2022-01-14 22:10 ` [patch 142/146] mm/damon: move the implementation of damon_insert_region to damon.h Andrew Morton
2022-01-14 22:10 ` [patch 143/146] mm/damon/dbgfs: remove an unnecessary variable Andrew Morton
2022-01-14 22:10 ` [patch 144/146] mm/damon/vaddr: use pr_debug() for damon_va_three_regions() failure logging Andrew Morton
2022-01-14 22:10 ` [patch 145/146] mm/damon/vaddr: hide kernel pointer from damon_va_three_regions() failure log Andrew Morton
2022-01-14 22:10 ` [patch 146/146] mm/damon: hide kernel pointer from tracepoint event 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=20220114220555.kAbhSEmus%akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=ccross@google.com \
    --cc=dave.hansen@intel.com \
    --cc=ebiederm@xmission.com \
    --cc=gorcunov@openvz.org \
    --cc=hannes@cmpxchg.org \
    --cc=hughd@google.com \
    --cc=jan.glauber@gmail.com \
    --cc=john.stultz@linaro.org \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@suse.de \
    --cc=minchan@kernel.org \
    --cc=mingo@kernel.org \
    --cc=mm-commits@vger.kernel.org \
    --cc=oleg@redhat.com \
    --cc=penberg@kernel.org \
    --cc=peterz@infradead.org \
    --cc=rientjes@google.com \
    --cc=rob@landley.net \
    --cc=serge.hallyn@ubuntu.com \
    --cc=shli@fusionio.com \
    --cc=surenb@google.com \
    --cc=torvalds@linux-foundation.org \
    --cc=viro@zeniv.linux.org.uk \
    /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).