linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: vbabka@suse.cz,shakeelb@google.com,nadav.amit@gmail.com,mike.kravetz@oracle.com,mhocko@suse.com,dgilbert@redhat.com,david@redhat.com,hannes@cmpxchg.org,akpm@linux-foundation.org,patches@lists.linux.dev,linux-mm@kvack.org,mm-commits@vger.kernel.org,torvalds@linux-foundation.org,akpm@linux-foundation.org
Subject: [patch 112/114] mm: madvise: MADV_DONTNEED_LOCKED
Date: Thu, 24 Mar 2022 18:14:12 -0700	[thread overview]
Message-ID: <20220325011412.A9A10C340EC@smtp.kernel.org> (raw)
In-Reply-To: <20220324180758.96b1ac7e17675d6bc474485e@linux-foundation.org>

From: Johannes Weiner <hannes@cmpxchg.org>
Subject: mm: madvise: MADV_DONTNEED_LOCKED

MADV_DONTNEED historically rejects mlocked ranges, but with MLOCK_ONFAULT
and MCL_ONFAULT allowing to mlock without populating, there are valid use
cases for depopulating locked ranges as well.

Users mlock memory to protect secrets.  There are allocators for secure
buffers that want in-use memory generally mlocked, but cleared and
invalidated memory to give up the physical pages.  This could be done with
explicit munlock -> mlock calls on free -> alloc of course, but that adds
two unnecessary syscalls, heavy mmap_sem write locks, vma splits and
re-merges - only to get rid of the backing pages.

Users also mlockall(MCL_ONFAULT) to suppress sustained paging, but are
okay with on-demand initial population.  It seems valid to selectively
free some memory during the lifetime of such a process, without having to
mess with its overall policy.

Why add a separate flag? Isn't this a pretty niche usecase?

- MADV_DONTNEED has been bailing on locked vmas forever. It's at least
  conceivable that someone, somewhere is relying on mlock to protect
  data from perhaps broader invalidation calls. Changing this behavior
  now could lead to quiet data corruption.

- It also clarifies expectations around MADV_FREE and maybe
  MADV_REMOVE. It avoids the situation where one quietly behaves
  different than the others. MADV_FREE_LOCKED can be added later.

- The combination of mlock() and madvise() in the first place is
  probably niche. But where it happens, I'd say that dropping pages
  from a locked region once they don't contain secrets or won't page
  anymore is much saner than relying on mlock to protect memory from
  speculative or errant invalidation calls. It's just that we can't
  change the default behavior because of the two previous points.

Given that, an explicit new flag seems to make the most sense.

[hannes@cmpxchg.org: fix mips build]
Link: https://lkml.kernel.org/r/20220304171912.305060-1-hannes@cmpxchg.org
Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Acked-by: Michal Hocko <mhocko@suse.com>
Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
Reviewed-by: Shakeel Butt <shakeelb@google.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Cc: Nadav Amit <nadav.amit@gmail.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 arch/alpha/include/uapi/asm/mman.h     |    2 +
 arch/mips/include/uapi/asm/mman.h      |    2 +
 arch/parisc/include/uapi/asm/mman.h    |    2 +
 arch/xtensa/include/uapi/asm/mman.h    |    2 +
 include/uapi/asm-generic/mman-common.h |    2 +
 mm/madvise.c                           |   24 +++++++++++++----------
 6 files changed, 24 insertions(+), 10 deletions(-)

--- a/arch/alpha/include/uapi/asm/mman.h~mm-madvise-madv_dontneed_locked
+++ a/arch/alpha/include/uapi/asm/mman.h
@@ -74,6 +74,8 @@
 #define MADV_POPULATE_READ	22	/* populate (prefault) page tables readable */
 #define MADV_POPULATE_WRITE	23	/* populate (prefault) page tables writable */
 
+#define MADV_DONTNEED_LOCKED	24	/* like DONTNEED, but drop locked pages too */
+
 /* compatibility flags */
 #define MAP_FILE	0
 
--- a/arch/mips/include/uapi/asm/mman.h~mm-madvise-madv_dontneed_locked
+++ a/arch/mips/include/uapi/asm/mman.h
@@ -101,6 +101,8 @@
 #define MADV_POPULATE_READ	22	/* populate (prefault) page tables readable */
 #define MADV_POPULATE_WRITE	23	/* populate (prefault) page tables writable */
 
+#define MADV_DONTNEED_LOCKED	24	/* like DONTNEED, but drop locked pages too */
+
 /* compatibility flags */
 #define MAP_FILE	0
 
--- a/arch/parisc/include/uapi/asm/mman.h~mm-madvise-madv_dontneed_locked
+++ a/arch/parisc/include/uapi/asm/mman.h
@@ -55,6 +55,8 @@
 #define MADV_POPULATE_READ	22	/* populate (prefault) page tables readable */
 #define MADV_POPULATE_WRITE	23	/* populate (prefault) page tables writable */
 
+#define MADV_DONTNEED_LOCKED	24	/* like DONTNEED, but drop locked pages too */
+
 #define MADV_MERGEABLE   65		/* KSM may merge identical pages */
 #define MADV_UNMERGEABLE 66		/* KSM may not merge identical pages */
 
--- a/arch/xtensa/include/uapi/asm/mman.h~mm-madvise-madv_dontneed_locked
+++ a/arch/xtensa/include/uapi/asm/mman.h
@@ -109,6 +109,8 @@
 #define MADV_POPULATE_READ	22	/* populate (prefault) page tables readable */
 #define MADV_POPULATE_WRITE	23	/* populate (prefault) page tables writable */
 
+#define MADV_DONTNEED_LOCKED	24	/* like DONTNEED, but drop locked pages too */
+
 /* compatibility flags */
 #define MAP_FILE	0
 
--- a/include/uapi/asm-generic/mman-common.h~mm-madvise-madv_dontneed_locked
+++ a/include/uapi/asm-generic/mman-common.h
@@ -75,6 +75,8 @@
 #define MADV_POPULATE_READ	22	/* populate (prefault) page tables readable */
 #define MADV_POPULATE_WRITE	23	/* populate (prefault) page tables writable */
 
+#define MADV_DONTNEED_LOCKED	24	/* like DONTNEED, but drop locked pages too */
+
 /* compatibility flags */
 #define MAP_FILE	0
 
--- a/mm/madvise.c~mm-madvise-madv_dontneed_locked
+++ a/mm/madvise.c
@@ -52,6 +52,7 @@ static int madvise_need_mmap_write(int b
 	case MADV_REMOVE:
 	case MADV_WILLNEED:
 	case MADV_DONTNEED:
+	case MADV_DONTNEED_LOCKED:
 	case MADV_COLD:
 	case MADV_PAGEOUT:
 	case MADV_FREE:
@@ -502,14 +503,9 @@ static void madvise_cold_page_range(stru
 	tlb_end_vma(tlb, vma);
 }
 
-static inline bool can_madv_lru_non_huge_vma(struct vm_area_struct *vma)
-{
-	return !(vma->vm_flags & (VM_LOCKED|VM_PFNMAP));
-}
-
 static inline bool can_madv_lru_vma(struct vm_area_struct *vma)
 {
-	return can_madv_lru_non_huge_vma(vma) && !is_vm_hugetlb_page(vma);
+	return !(vma->vm_flags & (VM_LOCKED|VM_PFNMAP|VM_HUGETLB));
 }
 
 static long madvise_cold(struct vm_area_struct *vma,
@@ -787,10 +783,16 @@ static bool madvise_dontneed_free_valid_
 					    unsigned long *end,
 					    int behavior)
 {
-	if (!is_vm_hugetlb_page(vma))
-		return can_madv_lru_non_huge_vma(vma);
+	if (!is_vm_hugetlb_page(vma)) {
+		unsigned int forbidden = VM_PFNMAP;
+
+		if (behavior != MADV_DONTNEED_LOCKED)
+			forbidden |= VM_LOCKED;
+
+		return !(vma->vm_flags & forbidden);
+	}
 
-	if (behavior != MADV_DONTNEED)
+	if (behavior != MADV_DONTNEED && behavior != MADV_DONTNEED_LOCKED)
 		return false;
 	if (start & ~huge_page_mask(hstate_vma(vma)))
 		return false;
@@ -854,7 +856,7 @@ static long madvise_dontneed_free(struct
 		VM_WARN_ON(start >= end);
 	}
 
-	if (behavior == MADV_DONTNEED)
+	if (behavior == MADV_DONTNEED || behavior == MADV_DONTNEED_LOCKED)
 		return madvise_dontneed_single_vma(vma, start, end);
 	else if (behavior == MADV_FREE)
 		return madvise_free_single_vma(vma, start, end);
@@ -993,6 +995,7 @@ static int madvise_vma_behavior(struct v
 		return madvise_pageout(vma, prev, start, end);
 	case MADV_FREE:
 	case MADV_DONTNEED:
+	case MADV_DONTNEED_LOCKED:
 		return madvise_dontneed_free(vma, prev, start, end, behavior);
 	case MADV_POPULATE_READ:
 	case MADV_POPULATE_WRITE:
@@ -1123,6 +1126,7 @@ madvise_behavior_valid(int behavior)
 	case MADV_REMOVE:
 	case MADV_WILLNEED:
 	case MADV_DONTNEED:
+	case MADV_DONTNEED_LOCKED:
 	case MADV_FREE:
 	case MADV_COLD:
 	case MADV_PAGEOUT:
_


  parent reply	other threads:[~2022-03-25  1:14 UTC|newest]

Thread overview: 115+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-25  1:07 incoming Andrew Morton
2022-03-25  1:08 ` [patch 001/114] tools/vm/page_owner_sort.c: sort by stacktrace before culling Andrew Morton
2022-03-25  1:08 ` [patch 002/114] tools/vm/page_owner_sort.c: support sorting by stack trace Andrew Morton
2022-03-25  1:08 ` [patch 003/114] tools/vm/page_owner_sort.c: add switch between culling by stacktrace and txt Andrew Morton
2022-03-25  1:08 ` [patch 004/114] tools/vm/page_owner_sort.c: support sorting pid and time Andrew Morton
2022-03-25  1:08 ` [patch 005/114] tools/vm/page_owner_sort.c: two trivial fixes Andrew Morton
2022-03-25  1:08 ` [patch 006/114] tools/vm/page_owner_sort.c: delete invalid duplicate code Andrew Morton
2022-03-25  1:08 ` [patch 007/114] Documentation/vm/page_owner.rst: update the documentation Andrew Morton
2022-03-25  1:08 ` [patch 008/114] Documentation/vm/page_owner.rst: fix unexpected indentation warns Andrew Morton
2022-03-25  1:09 ` [patch 009/114] lib/vsprintf: avoid redundant work with 0 size Andrew Morton
2022-03-25  1:09 ` [patch 010/114] mm/page_owner: use scnprintf() to avoid excessive buffer overrun check Andrew Morton
2022-03-25  1:09 ` [patch 011/114] mm/page_owner: print memcg information Andrew Morton
2022-03-25  1:09 ` [patch 012/114] mm/page_owner: record task command name Andrew Morton
2022-03-25  1:09 ` [patch 013/114] mm/page_owner.c: record tgid Andrew Morton
2022-03-25  1:09 ` [patch 014/114] tools/vm/page_owner_sort.c: fix the instructions for use Andrew Morton
2022-03-25  1:09 ` [patch 015/114] tools/vm/page_owner_sort.c: fix comments Andrew Morton
2022-03-25  1:09 ` [patch 016/114] tools/vm/page_owner_sort.c: add a security check Andrew Morton
2022-03-25  1:09 ` [patch 017/114] tools/vm/page_owner_sort.c: support sorting by tgid and update documentation Andrew Morton
2022-03-25  1:09 ` [patch 018/114] tools/vm/page_owner_sort: fix three trivival places Andrew Morton
2022-03-25  1:09 ` [patch 019/114] tools/vm/page_owner_sort: support for sorting by task command name Andrew Morton
2022-03-25  1:09 ` [patch 020/114] tools/vm/page_owner_sort.c: support for selecting by PID, TGID or " Andrew Morton
2022-03-25  1:09 ` [patch 021/114] tools/vm/page_owner_sort.c: support for user-defined culling rules Andrew Morton
2022-03-25  1:09 ` [patch 022/114] mm: unexport page_init_poison Andrew Morton
2022-03-25  1:09 ` [patch 023/114] selftest/vm: add util.h and and move helper functions there Andrew Morton
2022-03-25  1:09 ` [patch 024/114] selftest/vm: add helpers to detect PAGE_SIZE and PAGE_SHIFT Andrew Morton
2022-03-25  1:09 ` [patch 025/114] mm: delete __ClearPageWaiters() Andrew Morton
2022-03-25  1:09 ` [patch 026/114] mm: filemap_unaccount_folio() large skip mapcount fixup Andrew Morton
2022-03-25  1:09 ` [patch 027/114] mm/thp: fix NR_FILE_MAPPED accounting in page_*_file_rmap() Andrew Morton
2022-03-25  1:09 ` [patch 028/114] mm/migration: add trace events for THP migrations Andrew Morton
2022-03-25  1:10 ` [patch 029/114] mm/migration: add trace events for base page and HugeTLB migrations Andrew Morton
2022-03-25  1:10 ` [patch 030/114] kasan, page_alloc: deduplicate should_skip_kasan_poison Andrew Morton
2022-03-25  1:10 ` [patch 031/114] kasan, page_alloc: move tag_clear_highpage out of kernel_init_free_pages Andrew Morton
2022-03-25  1:10 ` [patch 032/114] kasan, page_alloc: merge kasan_free_pages into free_pages_prepare Andrew Morton
2022-03-25  1:10 ` [patch 033/114] kasan, page_alloc: simplify kasan_poison_pages call site Andrew Morton
2022-03-25  1:10 ` [patch 034/114] kasan, page_alloc: init memory of skipped pages on free Andrew Morton
2022-03-25  1:10 ` [patch 035/114] kasan: drop skip_kasan_poison variable in free_pages_prepare Andrew Morton
2022-03-25  1:10 ` [patch 036/114] mm: clarify __GFP_ZEROTAGS comment Andrew Morton
2022-03-25  1:10 ` [patch 037/114] kasan: only apply __GFP_ZEROTAGS when memory is zeroed Andrew Morton
2022-03-25  1:10 ` [patch 038/114] kasan, page_alloc: refactor init checks in post_alloc_hook Andrew Morton
2022-03-25  1:10 ` [patch 039/114] kasan, page_alloc: merge kasan_alloc_pages into post_alloc_hook Andrew Morton
2022-03-25  1:10 ` [patch 040/114] kasan, page_alloc: combine tag_clear_highpage calls in post_alloc_hook Andrew Morton
2022-03-25  1:10 ` [patch 041/114] kasan, page_alloc: move SetPageSkipKASanPoison " Andrew Morton
2022-03-25  1:10 ` [patch 042/114] kasan, page_alloc: move kernel_init_free_pages " Andrew Morton
2022-03-25  1:10 ` [patch 043/114] kasan, page_alloc: rework kasan_unpoison_pages call site Andrew Morton
2022-03-25  1:10 ` [patch 044/114] kasan: clean up metadata byte definitions Andrew Morton
2022-03-25  1:10 ` [patch 045/114] kasan: define KASAN_VMALLOC_INVALID for SW_TAGS Andrew Morton
2022-03-25  1:10 ` [patch 046/114] kasan, x86, arm64, s390: rename functions for modules shadow Andrew Morton
2022-03-25  1:10 ` [patch 047/114] kasan, vmalloc: drop outdated VM_KASAN comment Andrew Morton
2022-03-25  1:10 ` [patch 048/114] kasan: reorder vmalloc hooks Andrew Morton
2022-03-25  1:11 ` [patch 049/114] kasan: add wrappers for " Andrew Morton
2022-03-25  1:11 ` [patch 050/114] kasan, vmalloc: reset tags in vmalloc functions Andrew Morton
2022-03-25  1:11 ` [patch 051/114] kasan, fork: reset pointer tags of vmapped stacks Andrew Morton
2022-03-25  1:11 ` [patch 052/114] kasan, arm64: " Andrew Morton
2022-03-25  1:11 ` [patch 053/114] kasan, vmalloc: add vmalloc tagging for SW_TAGS Andrew Morton
2022-03-25  1:11 ` [patch 054/114] kasan, vmalloc, arm64: mark vmalloc mappings as pgprot_tagged Andrew Morton
2022-03-25  1:11 ` [patch 055/114] kasan, vmalloc: unpoison VM_ALLOC pages after mapping Andrew Morton
2022-03-25  1:11 ` [patch 056/114] kasan, mm: only define ___GFP_SKIP_KASAN_POISON with HW_TAGS Andrew Morton
2022-03-25  1:11 ` [patch 057/114] kasan, page_alloc: allow skipping unpoisoning for HW_TAGS Andrew Morton
2022-03-25  1:11 ` [patch 058/114] kasan, page_alloc: allow skipping memory init " Andrew Morton
2022-03-25  1:11 ` [patch 059/114] kasan, vmalloc: add vmalloc tagging " Andrew Morton
2022-03-25  1:11 ` [patch 060/114] kasan, vmalloc: only tag normal vmalloc allocations Andrew Morton
2022-03-25  1:11 ` [patch 061/114] kasan, arm64: don't tag executable " Andrew Morton
2022-03-25  1:11 ` [patch 062/114] kasan: mark kasan_arg_stacktrace as __initdata Andrew Morton
2022-03-25  1:11 ` [patch 063/114] kasan: clean up feature flags for HW_TAGS mode Andrew Morton
2022-03-25  1:11 ` [patch 064/114] kasan: add kasan.vmalloc command line flag Andrew Morton
2022-03-25  1:11 ` [patch 065/114] kasan: allow enabling KASAN_VMALLOC and SW/HW_TAGS Andrew Morton
2022-03-25  1:11 ` [patch 066/114] arm64: select KASAN_VMALLOC for SW/HW_TAGS modes Andrew Morton
2022-03-25  1:11 ` [patch 067/114] kasan: documentation updates Andrew Morton
2022-03-25  1:11 ` [patch 068/114] kasan: improve vmalloc tests Andrew Morton
2022-03-25  1:12 ` [patch 069/114] kasan: test: support async (again) and asymm modes for HW_TAGS Andrew Morton
2022-03-25  1:12 ` [patch 070/114] mm/kasan: remove unnecessary CONFIG_KASAN option Andrew Morton
2022-03-25  1:12 ` [patch 071/114] kasan: update function name in comments Andrew Morton
2022-03-25  1:12 ` [patch 072/114] kasan: print virtual mapping info in reports Andrew Morton
2022-03-25  1:12 ` [patch 073/114] kasan: drop addr check from describe_object_addr Andrew Morton
2022-03-25  1:12 ` [patch 074/114] kasan: more line breaks in reports Andrew Morton
2022-03-25  1:12 ` [patch 075/114] kasan: rearrange stack frame info " Andrew Morton
2022-03-25  1:12 ` [patch 076/114] kasan: improve " Andrew Morton
2022-03-25  1:12 ` [patch 077/114] kasan: print basic stack frame info for SW_TAGS Andrew Morton
2022-03-25  1:12 ` [patch 078/114] kasan: simplify async check in end_report() Andrew Morton
2022-03-25  1:12 ` [patch 079/114] kasan: simplify kasan_update_kunit_status() and call sites Andrew Morton
2022-03-25  1:12 ` [patch 080/114] kasan: check CONFIG_KASAN_KUNIT_TEST instead of CONFIG_KUNIT Andrew Morton
2022-03-25  1:12 ` [patch 081/114] kasan: move update_kunit_status to start_report Andrew Morton
2022-03-25  1:12 ` [patch 082/114] kasan: move disable_trace_on_warning " Andrew Morton
2022-03-25  1:12 ` [patch 083/114] kasan: split out print_report from __kasan_report Andrew Morton
2022-03-25  1:12 ` [patch 084/114] kasan: simplify kasan_find_first_bad_addr call sites Andrew Morton
2022-03-25  1:12 ` [patch 085/114] kasan: restructure kasan_report Andrew Morton
2022-03-25  1:12 ` [patch 086/114] kasan: merge __kasan_report into kasan_report Andrew Morton
2022-03-25  1:12 ` [patch 087/114] kasan: call print_report from kasan_report_invalid_free Andrew Morton
2022-03-25  1:12 ` [patch 088/114] kasan: move and simplify kasan_report_async Andrew Morton
2022-03-25  1:13 ` [patch 089/114] kasan: rename kasan_access_info to kasan_report_info Andrew Morton
2022-03-25  1:13 ` [patch 090/114] kasan: add comment about UACCESS regions to kasan_report Andrew Morton
2022-03-25  1:13 ` [patch 091/114] kasan: respect KASAN_BIT_REPORTED in all reporting routines Andrew Morton
2022-03-25  1:13 ` [patch 092/114] kasan: reorder reporting functions Andrew Morton
2022-03-25  1:13 ` [patch 093/114] kasan: move and hide kasan_save_enable/restore_multi_shot Andrew Morton
2022-03-25  1:13 ` [patch 094/114] kasan: disable LOCKDEP when printing reports Andrew Morton
2022-03-25  1:13 ` [patch 095/114] mm: enable MADV_DONTNEED for hugetlb mappings Andrew Morton
2022-03-25  1:13 ` [patch 096/114] selftests/vm: add hugetlb madvise MADV_DONTNEED MADV_REMOVE test Andrew Morton
2022-03-25  1:13 ` [patch 097/114] userfaultfd/selftests: enable hugetlb remap and remove event testing Andrew Morton
2022-03-25  1:13 ` [patch 098/114] mm/huge_memory: make is_transparent_hugepage() static Andrew Morton
2022-03-25  1:13 ` [patch 099/114] mm: optimize do_wp_page() for exclusive pages in the swapcache Andrew Morton
2022-03-25  1:13 ` [patch 100/114] mm: optimize do_wp_page() for fresh pages in local LRU pagevecs Andrew Morton
2022-03-25  1:13 ` [patch 101/114] mm: slightly clarify KSM logic in do_swap_page() Andrew Morton
2022-03-25  1:13 ` [patch 102/114] mm: streamline COW " Andrew Morton
2022-03-25  1:13 ` [patch 103/114] mm/huge_memory: streamline COW logic in do_huge_pmd_wp_page() Andrew Morton
2022-03-25  1:13 ` [patch 104/114] mm/khugepaged: remove reuse_swap_page() usage Andrew Morton
2022-03-25  1:13 ` [patch 105/114] mm/swapfile: remove stale reuse_swap_page() Andrew Morton
2022-03-25  1:13 ` [patch 106/114] mm/huge_memory: remove stale page_trans_huge_mapcount() Andrew Morton
2022-03-25  1:13 ` [patch 107/114] mm/huge_memory: remove stale locking logic from __split_huge_pmd() Andrew Morton
2022-03-25  1:13 ` [patch 108/114] mm: warn on deleting redirtied only if accounted Andrew Morton
2022-03-25  1:14 ` [patch 109/114] mm: unmap_mapping_range_tree() with i_mmap_rwsem shared Andrew Morton
2022-03-25  1:14 ` [patch 111/114] mm: fix race between MADV_FREE reclaim and blkdev direct IO read Andrew Morton
2022-03-25  1:14 ` Andrew Morton [this message]
2022-03-25  1:14 ` [patch 113/114] selftests: vm: remove dependecy from internal kernel macros Andrew Morton
2022-03-25  1:56   ` Linus Torvalds
2022-03-25  1:14 ` [patch 114/114] selftests: kselftest framework: provide "finished" helper 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=20220325011412.A9A10C340EC@smtp.kernel.org \
    --to=akpm@linux-foundation.org \
    --cc=david@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=hannes@cmpxchg.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@suse.com \
    --cc=mike.kravetz@oracle.com \
    --cc=mm-commits@vger.kernel.org \
    --cc=nadav.amit@gmail.com \
    --cc=patches@lists.linux.dev \
    --cc=shakeelb@google.com \
    --cc=torvalds@linux-foundation.org \
    --cc=vbabka@suse.cz \
    /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).