mm-commits.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: aarcange@redhat.com, akpm@linux-foundation.org,
	alexander.h.duyck@linux.intel.com, dan.j.williams@intel.com,
	dave.hansen@intel.com, david@redhat.com, konrad.wilk@oracle.com,
	lcapitulino@redhat.com, linux-mm@kvack.org,
	mgorman@techsingularity.net, mhocko@kernel.org,
	mm-commits@vger.kernel.org, mst@redhat.com, nitesh@redhat.com,
	osalvador@suse.de, pagupta@redhat.com, pbonzini@redhat.com,
	riel@surriel.com, torvalds@linux-foundation.org, vbabka@suse.cz,
	wei.w.wang@intel.com, weiqi4@huawei.com, willy@infradead.org,
	yang.zhang.wz@gmail.com
Subject: [patch 026/166] mm: introduce Reported pages
Date: Mon, 06 Apr 2020 20:04:56 -0700	[thread overview]
Message-ID: <20200407030456.APhgffkrS%akpm@linux-foundation.org> (raw)
In-Reply-To: <20200406200254.a69ebd9e08c4074e41ddebaf@linux-foundation.org>

From: Alexander Duyck <alexander.h.duyck@linux.intel.com>
Subject: mm: introduce Reported pages

In order to pave the way for free page reporting in virtualized
environments we will need a way to get pages out of the free lists and
identify those pages after they have been returned.  To accomplish this,
this patch adds the concept of a Reported Buddy, which is essentially
meant to just be the Uptodate flag used in conjunction with the Buddy page
type.

To prevent the reported pages from leaking outside of the buddy lists I
added a check to clear the PageReported bit in the del_page_from_free_list
function.  As a result any reported page that is split, merged, or
allocated will have the flag cleared prior to the PageBuddy value being
cleared.

The process for reporting pages is fairly simple.  Once we free a page
that meets the minimum order for page reporting we will schedule a worker
thread to start 2s or more in the future.  That worker thread will begin
working from the lowest supported page reporting order up to MAX_ORDER - 1
pulling unreported pages from the free list and storing them in the
scatterlist.

When processing each individual free list it is necessary for the worker
thread to release the zone lock when it needs to stop and report the full
scatterlist of pages.  To reduce the work of the next iteration the worker
thread will rotate the free list so that the first unreported page in the
free list becomes the first entry in the list.

It will then call a reporting function providing information on how many
entries are in the scatterlist.  Once the function completes it will
return the pages to the free area from which they were allocated and start
over pulling more pages from the free areas until there are no longer
enough pages to report on to keep the worker busy, or we have processed as
many pages as were contained in the free area when we started processing
the list.

The worker thread will work in a round-robin fashion making its way though
each zone requesting reporting, and through each reportable free list
within that zone.  Once all free areas within the zone have been processed
it will check to see if there have been any requests for reporting while
it was processing.  If so it will reschedule the worker thread to start up
again in roughly 2s and exit.

Link: http://lkml.kernel.org/r/20200211224635.29318.19750.stgit@localhost.localdomain
Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com>
Acked-by: Mel Gorman <mgorman@techsingularity.net>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Luiz Capitulino <lcapitulino@redhat.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Nitesh Narayan Lal <nitesh@redhat.com>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Pankaj Gupta <pagupta@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Rik van Riel <riel@surriel.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Wei Wang <wei.w.wang@intel.com>
Cc: Yang Zhang <yang.zhang.wz@gmail.com>
Cc: wei qi <weiqi4@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 include/linux/page-flags.h     |   11 +
 include/linux/page_reporting.h |   25 ++
 mm/Kconfig                     |   11 +
 mm/Makefile                    |    1 
 mm/page_alloc.c                |   17 +
 mm/page_reporting.c            |  319 +++++++++++++++++++++++++++++++
 mm/page_reporting.h            |   54 +++++
 7 files changed, 434 insertions(+), 4 deletions(-)

--- a/include/linux/page-flags.h~mm-introduce-reported-pages
+++ a/include/linux/page-flags.h
@@ -168,6 +168,9 @@ enum pageflags {
 
 	/* non-lru isolated movable page */
 	PG_isolated = PG_reclaim,
+
+	/* Only valid for buddy pages. Used to track pages that are reported */
+	PG_reported = PG_uptodate,
 };
 
 #ifndef __GENERATING_BOUNDS_H
@@ -437,6 +440,14 @@ PAGEFLAG(Idle, idle, PF_ANY)
 #endif
 
 /*
+ * PageReported() is used to track reported free pages within the Buddy
+ * allocator. We can use the non-atomic version of the test and set
+ * operations as both should be shielded with the zone lock to prevent
+ * any possible races on the setting or clearing of the bit.
+ */
+__PAGEFLAG(Reported, reported, PF_NO_COMPOUND)
+
+/*
  * On an anonymous page mapped into a user virtual memory area,
  * page->mapping points to its anon_vma, not to a struct address_space;
  * with the PAGE_MAPPING_ANON bit set to distinguish it.  See rmap.h.
--- /dev/null
+++ a/include/linux/page_reporting.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_PAGE_REPORTING_H
+#define _LINUX_PAGE_REPORTING_H
+
+#include <linux/mmzone.h>
+#include <linux/scatterlist.h>
+
+#define PAGE_REPORTING_CAPACITY		32
+
+struct page_reporting_dev_info {
+	/* function that alters pages to make them "reported" */
+	int (*report)(struct page_reporting_dev_info *prdev,
+		      struct scatterlist *sg, unsigned int nents);
+
+	/* work struct for processing reports */
+	struct delayed_work work;
+
+	/* Current state of page reporting */
+	atomic_t state;
+};
+
+/* Tear-down and bring-up for page reporting devices */
+void page_reporting_unregister(struct page_reporting_dev_info *prdev);
+int page_reporting_register(struct page_reporting_dev_info *prdev);
+#endif /*_LINUX_PAGE_REPORTING_H */
--- a/mm/Kconfig~mm-introduce-reported-pages
+++ a/mm/Kconfig
@@ -237,6 +237,17 @@ config COMPACTION
 	  linux-mm@kvack.org.
 
 #
+# support for free page reporting
+config PAGE_REPORTING
+	bool "Free page reporting"
+	def_bool n
+	help
+	  Free page reporting allows for the incremental acquisition of
+	  free pages from the buddy allocator for the purpose of reporting
+	  those pages to another entity, such as a hypervisor, so that the
+	  memory can be freed within the host for other uses.
+
+#
 # support for page migration
 #
 config MIGRATION
--- a/mm/Makefile~mm-introduce-reported-pages
+++ a/mm/Makefile
@@ -111,3 +111,4 @@ obj-$(CONFIG_HMM_MIRROR) += hmm.o
 obj-$(CONFIG_MEMFD_CREATE) += memfd.o
 obj-$(CONFIG_MAPPING_DIRTY_HELPERS) += mapping_dirty_helpers.o
 obj-$(CONFIG_PTDUMP_CORE) += ptdump.o
+obj-$(CONFIG_PAGE_REPORTING) += page_reporting.o
--- a/mm/page_alloc.c~mm-introduce-reported-pages
+++ a/mm/page_alloc.c
@@ -74,6 +74,7 @@
 #include <asm/div64.h>
 #include "internal.h"
 #include "shuffle.h"
+#include "page_reporting.h"
 
 /* prevent >1 _updater_ of zone percpu pageset ->high and ->batch fields */
 static DEFINE_MUTEX(pcp_batch_high_lock);
@@ -896,6 +897,10 @@ static inline void move_to_free_list(str
 static inline void del_page_from_free_list(struct page *page, struct zone *zone,
 					   unsigned int order)
 {
+	/* clear reported state and update reported page count */
+	if (page_reported(page))
+		__ClearPageReported(page);
+
 	list_del(&page->lru);
 	__ClearPageBuddy(page);
 	set_page_private(page, 0);
@@ -959,7 +964,7 @@ buddy_merge_likely(unsigned long pfn, un
 static inline void __free_one_page(struct page *page,
 		unsigned long pfn,
 		struct zone *zone, unsigned int order,
-		int migratetype)
+		int migratetype, bool report)
 {
 	struct capture_control *capc = task_capc(zone);
 	unsigned long uninitialized_var(buddy_pfn);
@@ -1044,6 +1049,10 @@ done_merging:
 		add_to_free_list_tail(page, zone, order, migratetype);
 	else
 		add_to_free_list(page, zone, order, migratetype);
+
+	/* Notify page reporting subsystem of freed page */
+	if (report)
+		page_reporting_notify_free(order);
 }
 
 /*
@@ -1360,7 +1369,7 @@ static void free_pcppages_bulk(struct zo
 		if (unlikely(isolated_pageblocks))
 			mt = get_pageblock_migratetype(page);
 
-		__free_one_page(page, page_to_pfn(page), zone, 0, mt);
+		__free_one_page(page, page_to_pfn(page), zone, 0, mt, true);
 		trace_mm_page_pcpu_drain(page, 0, mt);
 	}
 	spin_unlock(&zone->lock);
@@ -1376,7 +1385,7 @@ static void free_one_page(struct zone *z
 		is_migrate_isolate(migratetype))) {
 		migratetype = get_pfnblock_migratetype(page, pfn);
 	}
-	__free_one_page(page, pfn, zone, order, migratetype);
+	__free_one_page(page, pfn, zone, order, migratetype, true);
 	spin_unlock(&zone->lock);
 }
 
@@ -3227,7 +3236,7 @@ void __putback_isolated_page(struct page
 	lockdep_assert_held(&zone->lock);
 
 	/* Return isolated page to tail of freelist. */
-	__free_one_page(page, page_to_pfn(page), zone, order, mt);
+	__free_one_page(page, page_to_pfn(page), zone, order, mt, false);
 }
 
 /*
--- /dev/null
+++ a/mm/page_reporting.c
@@ -0,0 +1,319 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/mm.h>
+#include <linux/mmzone.h>
+#include <linux/page_reporting.h>
+#include <linux/gfp.h>
+#include <linux/export.h>
+#include <linux/delay.h>
+#include <linux/scatterlist.h>
+
+#include "page_reporting.h"
+#include "internal.h"
+
+#define PAGE_REPORTING_DELAY	(2 * HZ)
+static struct page_reporting_dev_info __rcu *pr_dev_info __read_mostly;
+
+enum {
+	PAGE_REPORTING_IDLE = 0,
+	PAGE_REPORTING_REQUESTED,
+	PAGE_REPORTING_ACTIVE
+};
+
+/* request page reporting */
+static void
+__page_reporting_request(struct page_reporting_dev_info *prdev)
+{
+	unsigned int state;
+
+	/* Check to see if we are in desired state */
+	state = atomic_read(&prdev->state);
+	if (state == PAGE_REPORTING_REQUESTED)
+		return;
+
+	/*
+	 *  If reporting is already active there is nothing we need to do.
+	 *  Test against 0 as that represents PAGE_REPORTING_IDLE.
+	 */
+	state = atomic_xchg(&prdev->state, PAGE_REPORTING_REQUESTED);
+	if (state != PAGE_REPORTING_IDLE)
+		return;
+
+	/*
+	 * Delay the start of work to allow a sizable queue to build. For
+	 * now we are limiting this to running no more than once every
+	 * couple of seconds.
+	 */
+	schedule_delayed_work(&prdev->work, PAGE_REPORTING_DELAY);
+}
+
+/* notify prdev of free page reporting request */
+void __page_reporting_notify(void)
+{
+	struct page_reporting_dev_info *prdev;
+
+	/*
+	 * We use RCU to protect the pr_dev_info pointer. In almost all
+	 * cases this should be present, however in the unlikely case of
+	 * a shutdown this will be NULL and we should exit.
+	 */
+	rcu_read_lock();
+	prdev = rcu_dereference(pr_dev_info);
+	if (likely(prdev))
+		__page_reporting_request(prdev);
+
+	rcu_read_unlock();
+}
+
+static void
+page_reporting_drain(struct page_reporting_dev_info *prdev,
+		     struct scatterlist *sgl, unsigned int nents, bool reported)
+{
+	struct scatterlist *sg = sgl;
+
+	/*
+	 * Drain the now reported pages back into their respective
+	 * free lists/areas. We assume at least one page is populated.
+	 */
+	do {
+		struct page *page = sg_page(sg);
+		int mt = get_pageblock_migratetype(page);
+		unsigned int order = get_order(sg->length);
+
+		__putback_isolated_page(page, order, mt);
+
+		/* If the pages were not reported due to error skip flagging */
+		if (!reported)
+			continue;
+
+		/*
+		 * If page was not comingled with another page we can
+		 * consider the result to be "reported" since the page
+		 * hasn't been modified, otherwise we will need to
+		 * report on the new larger page when we make our way
+		 * up to that higher order.
+		 */
+		if (PageBuddy(page) && page_order(page) == order)
+			__SetPageReported(page);
+	} while ((sg = sg_next(sg)));
+
+	/* reinitialize scatterlist now that it is empty */
+	sg_init_table(sgl, nents);
+}
+
+/*
+ * The page reporting cycle consists of 4 stages, fill, report, drain, and
+ * idle. We will cycle through the first 3 stages until we cannot obtain a
+ * full scatterlist of pages, in that case we will switch to idle.
+ */
+static int
+page_reporting_cycle(struct page_reporting_dev_info *prdev, struct zone *zone,
+		     unsigned int order, unsigned int mt,
+		     struct scatterlist *sgl, unsigned int *offset)
+{
+	struct free_area *area = &zone->free_area[order];
+	struct list_head *list = &area->free_list[mt];
+	unsigned int page_len = PAGE_SIZE << order;
+	struct page *page, *next;
+	int err = 0;
+
+	/*
+	 * Perform early check, if free area is empty there is
+	 * nothing to process so we can skip this free_list.
+	 */
+	if (list_empty(list))
+		return err;
+
+	spin_lock_irq(&zone->lock);
+
+	/* loop through free list adding unreported pages to sg list */
+	list_for_each_entry_safe(page, next, list, lru) {
+		/* We are going to skip over the reported pages. */
+		if (PageReported(page))
+			continue;
+
+		/* Attempt to pull page from list */
+		if (!__isolate_free_page(page, order))
+			break;
+
+		/* Add page to scatter list */
+		--(*offset);
+		sg_set_page(&sgl[*offset], page, page_len, 0);
+
+		/* If scatterlist isn't full grab more pages */
+		if (*offset)
+			continue;
+
+		/* release lock before waiting on report processing */
+		spin_unlock_irq(&zone->lock);
+
+		/* begin processing pages in local list */
+		err = prdev->report(prdev, sgl, PAGE_REPORTING_CAPACITY);
+
+		/* reset offset since the full list was reported */
+		*offset = PAGE_REPORTING_CAPACITY;
+
+		/* reacquire zone lock and resume processing */
+		spin_lock_irq(&zone->lock);
+
+		/* flush reported pages from the sg list */
+		page_reporting_drain(prdev, sgl, PAGE_REPORTING_CAPACITY, !err);
+
+		/*
+		 * Reset next to first entry, the old next isn't valid
+		 * since we dropped the lock to report the pages
+		 */
+		next = list_first_entry(list, struct page, lru);
+
+		/* exit on error */
+		if (err)
+			break;
+	}
+
+	spin_unlock_irq(&zone->lock);
+
+	return err;
+}
+
+static int
+page_reporting_process_zone(struct page_reporting_dev_info *prdev,
+			    struct scatterlist *sgl, struct zone *zone)
+{
+	unsigned int order, mt, leftover, offset = PAGE_REPORTING_CAPACITY;
+	unsigned long watermark;
+	int err = 0;
+
+	/* Generate minimum watermark to be able to guarantee progress */
+	watermark = low_wmark_pages(zone) +
+		    (PAGE_REPORTING_CAPACITY << PAGE_REPORTING_MIN_ORDER);
+
+	/*
+	 * Cancel request if insufficient free memory or if we failed
+	 * to allocate page reporting statistics for the zone.
+	 */
+	if (!zone_watermark_ok(zone, 0, watermark, 0, ALLOC_CMA))
+		return err;
+
+	/* Process each free list starting from lowest order/mt */
+	for (order = PAGE_REPORTING_MIN_ORDER; order < MAX_ORDER; order++) {
+		for (mt = 0; mt < MIGRATE_TYPES; mt++) {
+			/* We do not pull pages from the isolate free list */
+			if (is_migrate_isolate(mt))
+				continue;
+
+			err = page_reporting_cycle(prdev, zone, order, mt,
+						   sgl, &offset);
+			if (err)
+				return err;
+		}
+	}
+
+	/* report the leftover pages before going idle */
+	leftover = PAGE_REPORTING_CAPACITY - offset;
+	if (leftover) {
+		sgl = &sgl[offset];
+		err = prdev->report(prdev, sgl, leftover);
+
+		/* flush any remaining pages out from the last report */
+		spin_lock_irq(&zone->lock);
+		page_reporting_drain(prdev, sgl, leftover, !err);
+		spin_unlock_irq(&zone->lock);
+	}
+
+	return err;
+}
+
+static void page_reporting_process(struct work_struct *work)
+{
+	struct delayed_work *d_work = to_delayed_work(work);
+	struct page_reporting_dev_info *prdev =
+		container_of(d_work, struct page_reporting_dev_info, work);
+	int err = 0, state = PAGE_REPORTING_ACTIVE;
+	struct scatterlist *sgl;
+	struct zone *zone;
+
+	/*
+	 * Change the state to "Active" so that we can track if there is
+	 * anyone requests page reporting after we complete our pass. If
+	 * the state is not altered by the end of the pass we will switch
+	 * to idle and quit scheduling reporting runs.
+	 */
+	atomic_set(&prdev->state, state);
+
+	/* allocate scatterlist to store pages being reported on */
+	sgl = kmalloc_array(PAGE_REPORTING_CAPACITY, sizeof(*sgl), GFP_KERNEL);
+	if (!sgl)
+		goto err_out;
+
+	sg_init_table(sgl, PAGE_REPORTING_CAPACITY);
+
+	for_each_zone(zone) {
+		err = page_reporting_process_zone(prdev, sgl, zone);
+		if (err)
+			break;
+	}
+
+	kfree(sgl);
+err_out:
+	/*
+	 * If the state has reverted back to requested then there may be
+	 * additional pages to be processed. We will defer for 2s to allow
+	 * more pages to accumulate.
+	 */
+	state = atomic_cmpxchg(&prdev->state, state, PAGE_REPORTING_IDLE);
+	if (state == PAGE_REPORTING_REQUESTED)
+		schedule_delayed_work(&prdev->work, PAGE_REPORTING_DELAY);
+}
+
+static DEFINE_MUTEX(page_reporting_mutex);
+DEFINE_STATIC_KEY_FALSE(page_reporting_enabled);
+
+int page_reporting_register(struct page_reporting_dev_info *prdev)
+{
+	int err = 0;
+
+	mutex_lock(&page_reporting_mutex);
+
+	/* nothing to do if already in use */
+	if (rcu_access_pointer(pr_dev_info)) {
+		err = -EBUSY;
+		goto err_out;
+	}
+
+	/* initialize state and work structures */
+	atomic_set(&prdev->state, PAGE_REPORTING_IDLE);
+	INIT_DELAYED_WORK(&prdev->work, &page_reporting_process);
+
+	/* Begin initial flush of zones */
+	__page_reporting_request(prdev);
+
+	/* Assign device to allow notifications */
+	rcu_assign_pointer(pr_dev_info, prdev);
+
+	/* enable page reporting notification */
+	if (!static_key_enabled(&page_reporting_enabled)) {
+		static_branch_enable(&page_reporting_enabled);
+		pr_info("Free page reporting enabled\n");
+	}
+err_out:
+	mutex_unlock(&page_reporting_mutex);
+
+	return err;
+}
+EXPORT_SYMBOL_GPL(page_reporting_register);
+
+void page_reporting_unregister(struct page_reporting_dev_info *prdev)
+{
+	mutex_lock(&page_reporting_mutex);
+
+	if (rcu_access_pointer(pr_dev_info) == prdev) {
+		/* Disable page reporting notification */
+		RCU_INIT_POINTER(pr_dev_info, NULL);
+		synchronize_rcu();
+
+		/* Flush any existing work, and lock it out */
+		cancel_delayed_work_sync(&prdev->work);
+	}
+
+	mutex_unlock(&page_reporting_mutex);
+}
+EXPORT_SYMBOL_GPL(page_reporting_unregister);
--- /dev/null
+++ a/mm/page_reporting.h
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _MM_PAGE_REPORTING_H
+#define _MM_PAGE_REPORTING_H
+
+#include <linux/mmzone.h>
+#include <linux/pageblock-flags.h>
+#include <linux/page-isolation.h>
+#include <linux/jump_label.h>
+#include <linux/slab.h>
+#include <asm/pgtable.h>
+#include <linux/scatterlist.h>
+
+#define PAGE_REPORTING_MIN_ORDER	pageblock_order
+
+#ifdef CONFIG_PAGE_REPORTING
+DECLARE_STATIC_KEY_FALSE(page_reporting_enabled);
+void __page_reporting_notify(void);
+
+static inline bool page_reported(struct page *page)
+{
+	return static_branch_unlikely(&page_reporting_enabled) &&
+	       PageReported(page);
+}
+
+/**
+ * page_reporting_notify_free - Free page notification to start page processing
+ *
+ * This function is meant to act as a screener for __page_reporting_notify
+ * which will determine if a give zone has crossed over the high-water mark
+ * that will justify us beginning page treatment. If we have crossed that
+ * threshold then it will start the process of pulling some pages and
+ * placing them in the batch list for treatment.
+ */
+static inline void page_reporting_notify_free(unsigned int order)
+{
+	/* Called from hot path in __free_one_page() */
+	if (!static_branch_unlikely(&page_reporting_enabled))
+		return;
+
+	/* Determine if we have crossed reporting threshold */
+	if (order < PAGE_REPORTING_MIN_ORDER)
+		return;
+
+	/* This will add a few cycles, but should be called infrequently */
+	__page_reporting_notify();
+}
+#else /* CONFIG_PAGE_REPORTING */
+#define page_reported(_page)	false
+
+static inline void page_reporting_notify_free(unsigned int order)
+{
+}
+#endif /* CONFIG_PAGE_REPORTING */
+#endif /*_MM_PAGE_REPORTING_H */
_

  parent reply	other threads:[~2020-04-07  3:05 UTC|newest]

Thread overview: 194+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-07  3:02 incoming Andrew Morton
2020-04-07  3:03 ` [patch 001/166] mm, memcg: bypass high reclaim iteration for cgroup hierarchy root Andrew Morton
2020-04-07  3:03 ` [patch 002/166] mm: don't prepare anon_vma if vma has VM_WIPEONFORK Andrew Morton
2020-04-07  3:03 ` [patch 003/166] Revert "mm/rmap.c: reuse mergeable anon_vma as parent when fork" Andrew Morton
2020-04-07  3:03 ` [patch 004/166] mm: set vm_next and vm_prev to NULL in vm_area_dup() Andrew Morton
2020-04-07  3:03 ` [patch 005/166] mm/vma: add missing VMA flag readable name for VM_SYNC Andrew Morton
2020-04-07  3:03 ` [patch 006/166] mm/vma: make vma_is_accessible() available for general use Andrew Morton
2020-04-07  3:03 ` [patch 007/166] mm/vma: replace all remaining open encodings with is_vm_hugetlb_page() Andrew Morton
2020-04-07  3:03 ` [patch 008/166] mm/vma: replace all remaining open encodings with vma_is_anonymous() Andrew Morton
2020-04-07  3:03 ` [patch 009/166] mm/vma: append unlikely() while testing VMA access permissions Andrew Morton
2020-04-07  3:04 ` [patch 010/166] mm/vmalloc: fix a typo in comment Andrew Morton
2020-04-07  3:04 ` [patch 011/166] mm: make it clear that gfp reclaim modifiers are valid only for sleepable allocations Andrew Morton
2020-04-07  3:04 ` [patch 012/166] mm/migrate.c: no need to check for i > start in do_pages_move() Andrew Morton
2020-04-07  3:04 ` [patch 013/166] mm/migrate.c: wrap do_move_pages_to_node() and store_status() Andrew Morton
2020-04-07  3:04 ` [patch 014/166] mm/migrate.c: check pagelist in move_pages_and_store_status() Andrew Morton
2020-04-07  3:04 ` [patch 015/166] mm/migrate.c: unify "not queued for migration" handling in do_pages_move() Andrew Morton
2020-04-07  3:04 ` [patch 016/166] mm/migrate.c: migrate PG_readahead flag Andrew Morton
2020-04-07  3:04 ` [patch 017/166] mm, shmem: add vmstat for hugepage fallback Andrew Morton
2020-04-07  3:04 ` [patch 018/166] mm, thp: track fallbacks due to failed memcg charges separately Andrew Morton
2020-04-07  3:04 ` [patch 019/166] include/linux/pagemap.h: optimise find_subpage for !THP Andrew Morton
2020-04-07  3:04 ` [patch 020/166] mm: remove CONFIG_TRANSPARENT_HUGE_PAGECACHE Andrew Morton
2020-04-07  3:04 ` [patch 021/166] mm/ksm.c: update get_user_pages() argument in comment Andrew Morton
2020-04-07  3:04 ` [patch 022/166] mm: code cleanup for MADV_FREE Andrew Morton
2020-04-07  3:04 ` [patch 023/166] mm: adjust shuffle code to allow for future coalescing Andrew Morton
2020-04-07  3:04 ` [patch 024/166] mm: use zone and order instead of free area in free_list manipulators Andrew Morton
2020-04-07  3:04 ` [patch 025/166] mm: add function __putback_isolated_page Andrew Morton
2020-04-07  3:04 ` Andrew Morton [this message]
2020-04-07  3:05 ` [patch 027/166] virtio-balloon: pull page poisoning config out of free page hinting Andrew Morton
2020-04-07  3:05 ` [patch 028/166] virtio-balloon: add support for providing free page reports to host Andrew Morton
2020-04-07  3:05 ` [patch 029/166] mm/page_reporting: rotate reported pages to the tail of the list Andrew Morton
2020-04-07  3:05 ` [patch 030/166] mm/page_reporting: add budget limit on how many pages can be reported per pass Andrew Morton
2020-04-07  3:05 ` [patch 031/166] mm/page_reporting: add free page reporting documentation Andrew Morton
2020-04-07  3:05 ` [patch 032/166] virtio-balloon: switch back to OOM handler for VIRTIO_BALLOON_F_DEFLATE_ON_OOM Andrew Morton
2020-04-07  3:05 ` [patch 033/166] userfaultfd: wp: add helper for writeprotect check Andrew Morton
2020-04-07  3:05 ` [patch 034/166] userfaultfd: wp: hook userfault handler to write protection fault Andrew Morton
2020-04-07  3:05 ` [patch 035/166] userfaultfd: wp: add WP pagetable tracking to x86 Andrew Morton
2020-04-07  3:05 ` [patch 036/166] userfaultfd: wp: userfaultfd_pte/huge_pmd_wp() helpers Andrew Morton
2020-04-07  3:05 ` [patch 037/166] userfaultfd: wp: add UFFDIO_COPY_MODE_WP Andrew Morton
2020-04-07  3:05 ` [patch 038/166] mm: merge parameters for change_protection() Andrew Morton
2020-04-07  3:05 ` [patch 039/166] userfaultfd: wp: apply _PAGE_UFFD_WP bit Andrew Morton
2020-04-07  3:05 ` [patch 040/166] userfaultfd: wp: drop _PAGE_UFFD_WP properly when fork Andrew Morton
2020-04-07  3:05 ` [patch 041/166] userfaultfd: wp: add pmd_swp_*uffd_wp() helpers Andrew Morton
2020-04-07  3:06 ` [patch 042/166] userfaultfd: wp: support swap and page migration Andrew Morton
2020-04-07  3:06 ` [patch 043/166] khugepaged: skip collapse if uffd-wp detected Andrew Morton
2020-04-07  3:06 ` [patch 044/166] userfaultfd: wp: support write protection for userfault vma range Andrew Morton
2020-04-07  3:06 ` [patch 045/166] userfaultfd: wp: add the writeprotect API to userfaultfd ioctl Andrew Morton
2020-04-07  3:06 ` [patch 046/166] userfaultfd: wp: enabled write protection in userfaultfd API Andrew Morton
2020-04-07  3:06 ` [patch 047/166] userfaultfd: wp: don't wake up when doing write protect Andrew Morton
2020-04-07  3:06 ` [patch 048/166] userfaultfd: wp: UFFDIO_REGISTER_MODE_WP documentation update Andrew Morton
2020-04-07  3:06 ` [patch 049/166] userfaultfd: wp: declare _UFFDIO_WRITEPROTECT conditionally Andrew Morton
2020-04-07  3:06 ` [patch 050/166] userfaultfd: selftests: refactor statistics Andrew Morton
2020-04-07  3:06 ` [patch 051/166] userfaultfd: selftests: add write-protect test Andrew Morton
2020-04-07  3:06 ` [patch 052/166] drivers/base/memory.c: drop section_count Andrew Morton
2020-04-07  3:06 ` [patch 053/166] drivers/base/memory.c: drop pages_correctly_probed() Andrew Morton
2020-04-07  3:06 ` [patch 054/166] mm/page_ext.c: drop pfn_present() check when onlining Andrew Morton
2020-04-07  3:06 ` [patch 055/166] mm/memory_hotplug.c: only respect mem= parameter during boot stage Andrew Morton
2020-04-07  3:06 ` [patch 056/166] mm/memory_hotplug.c: simplify calculation of number of pages in __remove_pages() Andrew Morton
2020-04-07  3:06 ` [patch 057/166] mm/memory_hotplug.c: cleanup __add_pages() Andrew Morton
2020-04-07  3:07 ` [patch 058/166] mm/sparse.c: introduce new function fill_subsection_map() Andrew Morton
2020-04-07  3:07 ` [patch 059/166] mm/sparse.c: introduce a new function clear_subsection_map() Andrew Morton
2020-04-07  3:07 ` [patch 060/166] mm/sparse.c: only use subsection map in VMEMMAP case Andrew Morton
2020-04-07  3:07 ` [patch 061/166] mm/sparse.c: add note about only VMEMMAP supporting sub-section hotplug Andrew Morton
2020-04-07  3:07 ` [patch 062/166] mm/sparse.c: move subsection_map related functions together Andrew Morton
2020-04-07  3:07 ` [patch 063/166] drivers/base/memory: rename MMOP_ONLINE_KEEP to MMOP_ONLINE Andrew Morton
2020-04-07  3:07 ` [patch 064/166] drivers/base/memory: map MMOP_OFFLINE to 0 Andrew Morton
2020-04-07  3:07 ` [patch 065/166] drivers/base/memory: store mapping between MMOP_* and string in an array Andrew Morton
2020-04-07  3:07 ` [patch 066/166] powernv/memtrace: always online added memory blocks Andrew Morton
2020-04-07  3:07 ` [patch 067/166] hv_balloon: don't check for memhp_auto_online manually Andrew Morton
2020-04-07  3:07 ` [patch 068/166] mm/memory_hotplug: unexport memhp_auto_online Andrew Morton
2020-04-07  3:07 ` [patch 069/166] mm/memory_hotplug: convert memhp_auto_online to store an online_type Andrew Morton
2020-04-07  3:07 ` [patch 070/166] mm/memory_hotplug: allow to specify a default online_type Andrew Morton
2020-04-07  3:07 ` [patch 071/166] mm/memory_hotplug.c: use __pfn_to_section() instead of open-coding Andrew Morton
2020-04-07  3:07 ` [patch 072/166] mm/shmem.c: distribute switch variables for initialization Andrew Morton
2020-04-07  3:07 ` [patch 073/166] mm/shmem.c: clean code by removing unnecessary assignment Andrew Morton
2020-04-07  3:07 ` [patch 074/166] mm: huge tmpfs: try to split_huge_page() when punching hole Andrew Morton
2020-04-07  3:08 ` [patch 075/166] mm: prevent a warning when casting void* -> enum Andrew Morton
2020-04-07  3:08 ` [patch 076/166] mm/zswap: allow setting default status, compressor and allocator in Kconfig Andrew Morton
2020-04-07  3:08 ` [patch 077/166] mm/compaction: add missing annotation for compact_lock_irqsave Andrew Morton
2020-04-07  3:08 ` [patch 078/166] mm/hugetlb: add missing annotation for gather_surplus_pages() Andrew Morton
2020-04-07  3:08 ` [patch 079/166] mm/mempolicy: add missing annotation for queue_pages_pmd() Andrew Morton
2020-04-07  3:08 ` [patch 080/166] mm/slub: add missing annotation for get_map() Andrew Morton
2020-04-07  3:08 ` [patch 081/166] mm/slub: add missing annotation for put_map() Andrew Morton
2020-04-07  3:08 ` [patch 082/166] mm/zsmalloc: add missing annotation for migrate_read_lock() Andrew Morton
2020-04-07  3:08 ` [patch 083/166] mm/zsmalloc: add missing annotation for migrate_read_unlock() Andrew Morton
2020-04-07  3:08 ` [patch 084/166] mm/zsmalloc: add missing annotation for pin_tag() Andrew Morton
2020-04-07  3:08 ` [patch 085/166] mm/zsmalloc: add missing annotation for unpin_tag() Andrew Morton
2020-04-07  3:08 ` [patch 086/166] mm: fix ambiguous comments for better code readability Andrew Morton
2020-04-07  3:08 ` [patch 087/166] mm/mm_init.c: clean code. Use BUILD_BUG_ON when comparing compile time constant Andrew Morton
2020-04-07  3:08 ` [patch 088/166] mm: use fallthrough; Andrew Morton
2020-04-07  3:08 ` [patch 089/166] include/linux/swapops.h: correct guards for non_swap_entry() Andrew Morton
2020-04-07  3:08 ` [patch 090/166] include/linux/memremap.h: remove stale comments Andrew Morton
2020-04-07  3:08 ` [patch 091/166] mm/dmapool.c: micro-optimisation remove unnecessary branch Andrew Morton
2020-04-07  3:08 ` [patch 092/166] mm: remove dummy struct bootmem_data/bootmem_data_t Andrew Morton
2020-04-07  3:08 ` [patch 093/166] fs/proc/inode.c: annotate close_pdeo() for sparse Andrew Morton
2020-04-07  3:09 ` [patch 094/166] proc: faster open/read/close with "permanent" files Andrew Morton
2020-04-07  3:09 ` [patch 095/166] proc: speed up /proc/*/statm Andrew Morton
2020-04-07  3:09 ` [patch 096/166] proc: inline vma_stop into m_stop Andrew Morton
2020-04-07  3:09 ` [patch 097/166] proc: remove m_cache_vma Andrew Morton
2020-04-07  3:09 ` [patch 098/166] proc: use ppos instead of m->version Andrew Morton
2020-04-07  3:09 ` [patch 099/166] seq_file: remove m->version Andrew Morton
2020-04-07  3:09 ` [patch 100/166] proc: inline m_next_vma into m_next Andrew Morton
2020-04-07  3:09 ` [patch 101/166] asm-generic: fix unistd_32.h generation format Andrew Morton
2020-04-07  3:09 ` [patch 102/166] kernel/extable.c: use address-of operator on section symbols Andrew Morton
2020-04-07  3:09 ` [patch 103/166] sparc,x86: vdso: remove meaningless undefining CONFIG_OPTIMIZE_INLINING Andrew Morton
2020-04-07  3:09 ` [patch 104/166] compiler: remove CONFIG_OPTIMIZE_INLINING entirely Andrew Morton
2020-04-07  3:09 ` [patch 105/166] compiler.h: fix error in BUILD_BUG_ON() reporting Andrew Morton
2020-04-07  3:09 ` [patch 106/166] MAINTAINERS: list the section entries in the preferred order Andrew Morton
2020-04-07  3:09 ` [patch 107/166] bitops: always inline sign extension helpers Andrew Morton
2020-04-07  3:09 ` [patch 108/166] lib/test_lockup: test module to generate lockups Andrew Morton
2020-04-07  3:09 ` [patch 109/166] lib/test_lockup.c: fix spelling mistake "iteraions" -> "iterations" Andrew Morton
2020-04-07  3:09 ` [patch 110/166] lib/test_lockup.c: add parameters for locking generic vfs locks Andrew Morton
2020-04-07  3:09 ` [patch 111/166] lib/bch.c: replace zero-length array with flexible-array member Andrew Morton
2020-04-07  3:10 ` [patch 112/166] lib/ts_bm.c: " Andrew Morton
2020-04-07  3:10 ` [patch 113/166] lib/ts_fsm.c: " Andrew Morton
2020-04-07  3:10 ` [patch 114/166] lib/ts_kmp.c: " Andrew Morton
2020-04-07  3:10 ` [patch 115/166] lib/scatterlist: fix sg_copy_buffer() kerneldoc Andrew Morton
2020-04-07  3:10 ` [patch 116/166] lib: test_stackinit.c: XFAIL switch variable init tests Andrew Morton
2020-04-07  3:10 ` [patch 117/166] lib/stackdepot.c: check depot_index before accessing the stack slab Andrew Morton
2020-04-07  3:10 ` [patch 118/166] lib/stackdepot.c: build with -fno-builtin Andrew Morton
2020-04-07  3:10 ` [patch 119/166] kasan: stackdepot: move filter_irq_stacks() to stackdepot.c Andrew Morton
2020-04-07  3:10 ` [patch 120/166] percpu_counter: fix a data race at vm_committed_as Andrew Morton
2020-04-07  3:10 ` [patch 121/166] lib/test_bitmap.c: make use of EXP2_IN_BITS Andrew Morton
2020-04-07  3:10 ` [patch 122/166] lib/rbtree: fix coding style of assignments Andrew Morton
2020-04-07  3:10 ` [patch 123/166] lib/test_kmod.c: remove a NULL test Andrew Morton
2020-04-07  3:10 ` [patch 124/166] linux/bits.h: add compile time sanity check of GENMASK inputs Andrew Morton
2020-04-07  3:10 ` [patch 125/166] lib/list: prevent compiler reloads inside 'safe' list iteration Andrew Morton
2020-04-07  3:10 ` [patch 126/166] lib/dynamic_debug.c: use address-of operator on section symbols Andrew Morton
2020-04-07  3:10 ` [patch 127/166] checkpatch: remove email address comment from email address comparisons Andrew Morton
2020-04-07  3:10 ` [patch 128/166] checkpatch: check SPDX tags in YAML files Andrew Morton
2020-04-07  3:10 ` [patch 129/166] checkpatch: support "base-commit:" format Andrew Morton
2020-04-07  3:10 ` [patch 130/166] checkpatch: prefer fallthrough; over fallthrough comments Andrew Morton
2020-04-07  3:11 ` [patch 131/166] checkpatch: fix minor typo and mixed space+tab in indentation Andrew Morton
2020-04-07  3:11 ` [patch 132/166] checkpatch: fix multiple const * types Andrew Morton
2020-04-07  3:11 ` [patch 133/166] checkpatch: add command-line option for TAB size Andrew Morton
2020-04-07  3:11 ` [patch 134/166] checkpatch: improve Gerrit Change-Id: test Andrew Morton
2020-04-07  3:11 ` [patch 135/166] checkpatch: check proper licensing of Devicetree bindings Andrew Morton
2020-04-07  3:11 ` [patch 136/166] checkpatch: avoid warning about uninitialized_var() Andrew Morton
2020-04-07  3:11 ` [patch 137/166] kselftest: introduce new epoll test case Andrew Morton
2020-04-07  3:11 ` [patch 138/166] fs/epoll: make nesting accounting safe for -rt kernel Andrew Morton
2020-04-07  3:11 ` [patch 139/166] fs/binfmt_elf.c: delete "loc" variable Andrew Morton
2020-04-07  3:11 ` [patch 140/166] fs/binfmt_elf.c: allocate less for static executable Andrew Morton
2020-04-07  3:11 ` [patch 141/166] fs/binfmt_elf.c: don't free interpreter's ELF pheaders on common path Andrew Morton
2020-04-07  3:11 ` [patch 142/166] samples/hw_breakpoint: drop HW_BREAKPOINT_R when reporting writes Andrew Morton
2020-04-07  3:11 ` [patch 143/166] samples/hw_breakpoint: drop use of kallsyms_lookup_name() Andrew Morton
2020-04-07  3:11 ` [patch 144/166] kallsyms: unexport kallsyms_lookup_name() and kallsyms_on_each_symbol() Andrew Morton
2020-04-07  3:11 ` [patch 145/166] reiserfs: clean up several indentation issues Andrew Morton
2020-04-07  3:11 ` [patch 146/166] kernel/kmod.c: fix a typo "assuems" -> "assumes" Andrew Morton
2020-04-07  3:11 ` [patch 147/166] gcov: gcc_4_7: replace zero-length array with flexible-array member Andrew Morton
2020-04-07  3:11 ` [patch 148/166] gcov: gcc_3_4: " Andrew Morton
2020-04-07  3:11 ` [patch 149/166] kernel/gcov/fs.c: " Andrew Morton
2020-04-07  3:12 ` [patch 150/166] init/Kconfig: clean up ANON_INODES and old IO schedulers options Andrew Morton
2020-04-07  3:12 ` [patch 151/166] kcov: cleanup debug messages Andrew Morton
2020-04-07  3:12 ` [patch 152/166] kcov: fix potential use-after-free in kcov_remote_start Andrew Morton
2020-04-07  3:12 ` [patch 153/166] kcov: move t->kcov assignments into kcov_start/stop Andrew Morton
2020-04-07  3:12 ` [patch 154/166] kcov: move t->kcov_sequence assignment Andrew Morton
2020-04-07  3:12 ` [patch 155/166] kcov: use t->kcov_mode as enabled indicator Andrew Morton
2020-04-07  3:12 ` [patch 156/166] kcov: collect coverage from interrupts Andrew Morton
2020-04-07  3:12 ` [patch 157/166] usb: core: kcov: collect coverage from usb complete callback Andrew Morton
2020-04-07  3:12 ` [patch 158/166] ubsan: add trap instrumentation option Andrew Morton
2020-04-07  3:12 ` [patch 159/166] ubsan: split "bounds" checker from other options Andrew Morton
2020-04-07  3:12 ` [patch 160/166] drivers/misc/lkdtm/bugs.c: add arithmetic overflow and array bounds checks Andrew Morton
2020-04-07  3:12 ` [patch 161/166] ubsan: check panic_on_warn Andrew Morton
2020-04-07  3:12 ` [patch 162/166] kasan: unset panic_on_warn before calling panic() Andrew Morton
2020-04-07  3:12 ` [patch 163/166] ubsan: include bug type in report header Andrew Morton
2020-04-07  3:12 ` [patch 164/166] lib/Kconfig.debug: fix a typo "capabilitiy" -> "capability" Andrew Morton
2020-04-07  3:12 ` [patch 165/166] ipc/mqueue.c: fix a brace coding style issue Andrew Morton
2020-04-07  3:12 ` [patch 166/166] ipc/shm.c: make compat_ksys_shmctl() static Andrew Morton
2020-04-07 22:12 ` + mm-gup-mark-lock-taken-only-after-a-successful-retake.patch added to -mm tree Andrew Morton
2020-04-09  0:32 ` + proc-use-a-dedicated-lock-in-struct-pid.patch " Andrew Morton
2020-04-09  0:34 ` + docs-mm-slabh-fix-a-broken-cross-reference.patch " Andrew Morton
2020-04-09  0:39 ` + mm-page_alloc-fix-kernel-doc-warning.patch " Andrew Morton
2020-04-09  0:57 ` [folded-merged] mm-hugetlb-optionally-allocate-gigantic-hugepages-using-cma-v5.patch removed from " Andrew Morton
2020-04-09  0:57 ` [folded-merged] mm-hugetlb-optionally-allocate-gigantic-hugepages-using-cma-fix.patch " Andrew Morton
2020-04-09  0:58 ` [to-be-updated] mm-hugetlb-optionally-allocate-gigantic-hugepages-using-cma.patch " Andrew Morton
2020-04-09  0:58 ` [to-be-updated] mm-hugetlb-optionally-allocate-gigantic-hugepages-using-cma-fix-2.patch " Andrew Morton
2020-04-09  0:58 ` [to-be-updated] mm-hugetlbc-fix-printk-format-warning-for-32-bit-phys_addr_t.patch " Andrew Morton
2020-04-09  0:58 ` [to-be-updated] mm-hugetlbc-fix-printk-format-warning-for-32-bit-phys_addr_t-fix.patch " Andrew Morton
2020-04-09  1:00 ` + mm-cma-numa-node-interface.patch added to " Andrew Morton
2020-04-09  1:00 ` + mm-hugetlb-optionally-allocate-gigantic-hugepages-using-cma.patch " Andrew Morton
2020-04-09  1:03 ` [nacked] list-prevent-compiler-reloads-inside-safe-list-iteration.patch removed from " Andrew Morton
2020-04-09  1:07 ` + fat-dont-allow-to-mount-if-the-fat-length-==-0.patch added to " Andrew Morton
2020-04-09  1:10 ` + mm-gup-fix-null-pointer-dereference-detected-by-coverity.patch " Andrew Morton
2020-04-09  1:11 ` + ocfs2-no-need-try-to-truncate-file-beyond-i_size.patch " Andrew Morton
2020-04-09  1:24 ` [obsolete] mm-clarify-__gfp_memalloc-usage-checkpatch-fixes.patch removed from " Andrew Morton
2020-04-09  1:25 ` + mm-clarify-__gfp_memalloc-usage-update.patch added to " Andrew Morton
2020-04-09  1:26 ` + mm-clarify-__gfp_memalloc-usage-update-checkpatch-fixes.patch " Andrew Morton
2020-04-09  1:30 ` + mm-page_alloc-make-pcpu_drain_mutex-and-pcpu_drain-static.patch " Andrew Morton
2020-04-09  4:39 ` + mm-cma-numa-node-interface-fix.patch " Andrew Morton
2020-04-10  4:53 ` + lib-math-avoid-trailing-n-hidden-in-pr_fmt.patch " Andrew Morton
2020-04-10  4:55 ` + mm-mmap-initialize-align_offset-explicitly-for-vm_unmapped_area.patch " Andrew Morton
2020-04-10 18:38 ` + mm-memory_hotplug-fix-a-typo-in-comment-recoreded-recorded.patch " Andrew Morton
2020-04-10 18:38 ` + mm-ksm-fix-a-typo-in-comment-alreaady-already.patch " Andrew Morton
2020-04-10 18:38 ` + mm-mmap-fix-a-typo-in-comment-compatbility-compatibility.patch " Andrew Morton
2020-04-10 18:38 ` + mm-hugetlb-fix-a-typo-in-comment-manitained-maintained.patch " 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=20200407030456.APhgffkrS%akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=aarcange@redhat.com \
    --cc=alexander.h.duyck@linux.intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=david@redhat.com \
    --cc=konrad.wilk@oracle.com \
    --cc=lcapitulino@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@techsingularity.net \
    --cc=mhocko@kernel.org \
    --cc=mm-commits@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=nitesh@redhat.com \
    --cc=osalvador@suse.de \
    --cc=pagupta@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=riel@surriel.com \
    --cc=torvalds@linux-foundation.org \
    --cc=vbabka@suse.cz \
    --cc=wei.w.wang@intel.com \
    --cc=weiqi4@huawei.com \
    --cc=willy@infradead.org \
    --cc=yang.zhang.wz@gmail.com \
    /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).