mm-commits.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: aarcange@redhat.com, ak@linux.intel.com,
	akpm@linux-foundation.org, ben.widawsky@intel.com,
	dan.j.williams@intel.com, dave.hansen@linux.intel.com,
	feng.tang@intel.com, linux-mm@kvack.org,
	mgorman@techsingularity.net, mhocko@kernel.org, mhocko@suse.com,
	mike.kravetz@oracle.com, mm-commits@vger.kernel.org,
	rdunlap@infradead.org, torvalds@linux-foundation.org,
	vbabka@suse.cz, ying.huang@intel.com
Subject: [patch 191/212] mm/mempolicy: add MPOL_PREFERRED_MANY for multiple preferred nodes
Date: Thu, 02 Sep 2021 15:00:06 -0700	[thread overview]
Message-ID: <20210902220006.ntmmePKhX%akpm@linux-foundation.org> (raw)
In-Reply-To: <20210902144820.78957dff93d7bea620d55a89@linux-foundation.org>

From: Dave Hansen <dave.hansen@linux.intel.com>
Subject: mm/mempolicy: add MPOL_PREFERRED_MANY for multiple preferred nodes

Patch series "Introduce multi-preference mempolicy", v7.

This patch series introduces the concept of the MPOL_PREFERRED_MANY
mempolicy.  This mempolicy mode can be used with either the
set_mempolicy(2) or mbind(2) interfaces.  Like the MPOL_PREFERRED
interface, it allows an application to set a preference for nodes which
will fulfil memory allocation requests.  Unlike the MPOL_PREFERRED mode,
it takes a set of nodes.  Like the MPOL_BIND interface, it works over a
set of nodes.  Unlike MPOL_BIND, it will not cause a SIGSEGV or invoke the
OOM killer if those preferred nodes are not available.

Along with these patches are patches for libnuma, numactl, numademo, and
memhog.  They still need some polish, but can be found here:
https://gitlab.com/bwidawsk/numactl/-/tree/prefer-many It allows new
usage: `numactl -P 0,3,4`

The goal of the new mode is to enable some use-cases when using tiered memory
usage models which I've lovingly named.

1a. The Hare - The interconnect is fast enough to meet bandwidth and
    latency requirements allowing preference to be given to all nodes with
    "fast" memory.
1b. The Indiscriminate Hare - An application knows it wants fast
    memory (or perhaps slow memory), but doesn't care which node it runs
    on.  The application can prefer a set of nodes and then xpu bind to
    the local node (cpu, accelerator, etc).  This reverses the nodes are
    chosen today where the kernel attempts to use local memory to the CPU
    whenever possible.  This will attempt to use the local accelerator to
    the memory.
2.  The Tortoise - The administrator (or the application itself) is
    aware it only needs slow memory, and so can prefer that.

Much of this is almost achievable with the bind interface, but the bind
interface suffers from an inability to fallback to another set of nodes if
binding fails to all nodes in the nodemask.

Like MPOL_BIND a nodemask is given. Inherently this removes ordering from the
preference.

> /* Set first two nodes as preferred in an 8 node system. */
> const unsigned long nodes = 0x3
> set_mempolicy(MPOL_PREFER_MANY, &nodes, 8);

> /* Mimic interleave policy, but have fallback *.
> const unsigned long nodes = 0xaa
> set_mempolicy(MPOL_PREFER_MANY, &nodes, 8);

Some internal discussion took place around the interface. There are two
alternatives which we have discussed, plus one I stuck in:

1. Ordered list of nodes.  Currently it's believed that the added
   complexity is nod needed for expected usecases.
2. A flag for bind to allow falling back to other nodes.  This
   confuses the notion of binding and is less flexible than the current
   solution.
3. Create flags or new modes that helps with some ordering.  This
   offers both a friendlier API as well as a solution for more customized
   usage.  It's unknown if it's worth the complexity to support this. 
   Here is sample code for how this might work:

> // Prefer specific nodes for some something wacky
> set_mempolicy(MPOL_PREFER_MANY, 0x17c, 1024);
>
> // Default
> set_mempolicy(MPOL_PREFER_MANY | MPOL_F_PREFER_ORDER_SOCKET, NULL, 0);
> // which is the same as
> set_mempolicy(MPOL_DEFAULT, NULL, 0);
>
> // The Hare
> set_mempolicy(MPOL_PREFER_MANY | MPOL_F_PREFER_ORDER_TYPE, NULL, 0);
>
> // The Tortoise
> set_mempolicy(MPOL_PREFER_MANY | MPOL_F_PREFER_ORDER_TYPE_REV, NULL, 0);
>
> // Prefer the fast memory of the first two sockets
> set_mempolicy(MPOL_PREFER_MANY | MPOL_F_PREFER_ORDER_TYPE, -1, 2);
>


This patch (of 5):

The NUMA APIs currently allow passing in a "preferred node" as a single
bit set in a nodemask.  If more than one bit it set, bits after the first
are ignored.

This single node is generally OK for location-based NUMA where memory
being allocated will eventually be operated on by a single CPU.  However,
in systems with multiple memory types, folks want to target a *type* of
memory instead of a location.  For instance, someone might want some
high-bandwidth memory but do not care about the CPU next to which it is
allocated.  Or, they want a cheap, high capacity allocation and want to
target all NUMA nodes which have persistent memory in volatile mode.  In
both of these cases, the application wants to target a *set* of nodes, but
does not want strict MPOL_BIND behavior as that could lead to OOM killer
or SIGSEGV.

So add MPOL_PREFERRED_MANY policy to support the multiple preferred nodes
requirement.  This is not a pie-in-the-sky dream for an API.  This was a
response to a specific ask of more than one group at Intel.  Specifically:

1. There are existing libraries that target memory types such as
   https://github.com/memkind/memkind.  These are known to suffer from
   SIGSEGV's when memory is low on targeted memory "kinds" that span more
   than one node.  The MCDRAM on a Xeon Phi in "Cluster on Die" mode is an
   example of this.

2. Volatile-use persistent memory users want to have a memory policy
   which is targeted at either "cheap and slow" (PMEM) or "expensive and
   fast" (DRAM).  However, they do not want to experience allocation
   failures when the targeted type is unavailable.

3. Allocate-then-run.  Generally, we let the process scheduler decide
   on which physical CPU to run a task.  That location provides a default
   allocation policy, and memory availability is not generally considered
   when placing tasks.  For situations where memory is valuable and
   constrained, some users want to allocate memory first, *then* allocate
   close compute resources to the allocation.  This is the reverse of the
   normal (CPU) model.  Accelerators such as GPUs that operate on
   core-mm-managed memory are interested in this model.

A check is added in sanitize_mpol_flags() to not permit 'prefer_many'
policy to be used for now, and will be removed in later patch after all
implementations for 'prefer_many' are ready, as suggested by Michal Hocko.

[mhocko@kernel.org: suggest to refine policy_node/policy_nodemask handling]
Link: https://lkml.kernel.org/r/1627970362-61305-1-git-send-email-feng.tang@intel.com
Link: https://lore.kernel.org/r/20200630212517.308045-4-ben.widawsky@intel.com
Link: https://lkml.kernel.org/r/1627970362-61305-2-git-send-email-feng.tang@intel.com
Co-developed-by: Ben Widawsky <ben.widawsky@intel.com>
Signed-off-by: Ben Widawsky <ben.widawsky@intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Signed-off-by: Feng Tang <feng.tang@intel.com>
Cc: Michal Hocko <mhocko@kernel.org>
Acked-by: Michal Hocko <mhocko@suse.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Mel Gorman <mgorman@techsingularity.net>
Cc: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Huang Ying <ying.huang@intel.com>b
Cc: Michal Hocko <mhocko@suse.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 include/uapi/linux/mempolicy.h |    1 
 mm/mempolicy.c                 |   73 +++++++++++++++++++++++++------
 2 files changed, 60 insertions(+), 14 deletions(-)

--- a/include/uapi/linux/mempolicy.h~mm-mempolicy-add-mpol_preferred_many-for-multiple-preferred-nodes
+++ a/include/uapi/linux/mempolicy.h
@@ -22,6 +22,7 @@ enum {
 	MPOL_BIND,
 	MPOL_INTERLEAVE,
 	MPOL_LOCAL,
+	MPOL_PREFERRED_MANY,
 	MPOL_MAX,	/* always last member of enum */
 };
 
--- a/mm/mempolicy.c~mm-mempolicy-add-mpol_preferred_many-for-multiple-preferred-nodes
+++ a/mm/mempolicy.c
@@ -31,6 +31,9 @@
  *                but useful to set in a VMA when you have a non default
  *                process policy.
  *
+ * preferred many Try a set of nodes first before normal fallback. This is
+ *                similar to preferred without the special case.
+ *
  * default        Allocate on the local node first, or when on a VMA
  *                use the process policy. This is what Linux always did
  *		  in a NUMA aware kernel and still does by, ahem, default.
@@ -207,6 +210,14 @@ static int mpol_new_preferred(struct mem
 	return 0;
 }
 
+static int mpol_new_preferred_many(struct mempolicy *pol, const nodemask_t *nodes)
+{
+	if (nodes_empty(*nodes))
+		return -EINVAL;
+	pol->nodes = *nodes;
+	return 0;
+}
+
 static int mpol_new_bind(struct mempolicy *pol, const nodemask_t *nodes)
 {
 	if (nodes_empty(*nodes))
@@ -408,6 +419,10 @@ static const struct mempolicy_operations
 	[MPOL_LOCAL] = {
 		.rebind = mpol_rebind_default,
 	},
+	[MPOL_PREFERRED_MANY] = {
+		.create = mpol_new_preferred_many,
+		.rebind = mpol_rebind_preferred,
+	},
 };
 
 static int migrate_page_add(struct page *page, struct list_head *pagelist,
@@ -900,6 +915,7 @@ static void get_policy_nodemask(struct m
 	case MPOL_BIND:
 	case MPOL_INTERLEAVE:
 	case MPOL_PREFERRED:
+	case MPOL_PREFERRED_MANY:
 		*nodes = p->nodes;
 		break;
 	case MPOL_LOCAL:
@@ -1446,7 +1462,13 @@ static inline int sanitize_mpol_flags(in
 {
 	*flags = *mode & MPOL_MODE_FLAGS;
 	*mode &= ~MPOL_MODE_FLAGS;
-	if ((unsigned int)(*mode) >= MPOL_MAX)
+
+	/*
+	 * The check should be 'mode >= MPOL_MAX', but as 'prefer_many'
+	 * is not fully implemented, don't permit it to be used for now,
+	 * and the logic will be restored in following patch
+	 */
+	if ((unsigned int)(*mode) >=  MPOL_PREFERRED_MANY)
 		return -EINVAL;
 	if ((*flags & MPOL_F_STATIC_NODES) && (*flags & MPOL_F_RELATIVE_NODES))
 		return -EINVAL;
@@ -1875,16 +1897,27 @@ static int apply_policy_zone(struct memp
  */
 nodemask_t *policy_nodemask(gfp_t gfp, struct mempolicy *policy)
 {
+	int mode = policy->mode;
+
 	/* Lower zones don't get a nodemask applied for MPOL_BIND */
-	if (unlikely(policy->mode == MPOL_BIND) &&
-			apply_policy_zone(policy, gfp_zone(gfp)) &&
-			cpuset_nodemask_valid_mems_allowed(&policy->nodes))
+	if (unlikely(mode == MPOL_BIND) &&
+		apply_policy_zone(policy, gfp_zone(gfp)) &&
+		cpuset_nodemask_valid_mems_allowed(&policy->nodes))
+		return &policy->nodes;
+
+	if (mode == MPOL_PREFERRED_MANY)
 		return &policy->nodes;
 
 	return NULL;
 }
 
-/* Return the node id preferred by the given mempolicy, or the given id */
+/*
+ * Return the  preferred node id for 'prefer' mempolicy, and return
+ * the given id for all other policies.
+ *
+ * policy_node() is always coupled with policy_nodemask(), which
+ * secures the nodemask limit for 'bind' and 'prefer-many' policy.
+ */
 static int policy_node(gfp_t gfp, struct mempolicy *policy, int nd)
 {
 	if (policy->mode == MPOL_PREFERRED) {
@@ -1936,7 +1969,9 @@ unsigned int mempolicy_slab_node(void)
 	case MPOL_INTERLEAVE:
 		return interleave_nodes(policy);
 
-	case MPOL_BIND: {
+	case MPOL_BIND:
+	case MPOL_PREFERRED_MANY:
+	{
 		struct zoneref *z;
 
 		/*
@@ -2008,12 +2043,12 @@ static inline unsigned interleave_nid(st
  * @addr: address in @vma for shared policy lookup and interleave policy
  * @gfp_flags: for requested zone
  * @mpol: pointer to mempolicy pointer for reference counted mempolicy
- * @nodemask: pointer to nodemask pointer for MPOL_BIND nodemask
+ * @nodemask: pointer to nodemask pointer for 'bind' and 'prefer-many' policy
  *
  * Returns a nid suitable for a huge page allocation and a pointer
  * to the struct mempolicy for conditional unref after allocation.
- * If the effective policy is 'BIND, returns a pointer to the mempolicy's
- * @nodemask for filtering the zonelist.
+ * If the effective policy is 'bind' or 'prefer-many', returns a pointer
+ * to the mempolicy's @nodemask for filtering the zonelist.
  *
  * Must be protected by read_mems_allowed_begin()
  */
@@ -2021,16 +2056,18 @@ int huge_node(struct vm_area_struct *vma
 				struct mempolicy **mpol, nodemask_t **nodemask)
 {
 	int nid;
+	int mode;
 
 	*mpol = get_vma_policy(vma, addr);
-	*nodemask = NULL;	/* assume !MPOL_BIND */
+	*nodemask = NULL;
+	mode = (*mpol)->mode;
 
-	if (unlikely((*mpol)->mode == MPOL_INTERLEAVE)) {
+	if (unlikely(mode == MPOL_INTERLEAVE)) {
 		nid = interleave_nid(*mpol, vma, addr,
 					huge_page_shift(hstate_vma(vma)));
 	} else {
 		nid = policy_node(gfp_flags, *mpol, numa_node_id());
-		if ((*mpol)->mode == MPOL_BIND)
+		if (mode == MPOL_BIND || mode == MPOL_PREFERRED_MANY)
 			*nodemask = &(*mpol)->nodes;
 	}
 	return nid;
@@ -2063,6 +2100,7 @@ bool init_nodemask_of_mempolicy(nodemask
 	mempolicy = current->mempolicy;
 	switch (mempolicy->mode) {
 	case MPOL_PREFERRED:
+	case MPOL_PREFERRED_MANY:
 	case MPOL_BIND:
 	case MPOL_INTERLEAVE:
 		*mask = mempolicy->nodes;
@@ -2173,7 +2211,7 @@ struct page *alloc_pages_vma(gfp_t gfp,
 		 * node and don't fall back to other nodes, as the cost of
 		 * remote accesses would likely offset THP benefits.
 		 *
-		 * If the policy is interleave, or does not allow the current
+		 * If the policy is interleave or does not allow the current
 		 * node in its nodemask, we allocate the standard way.
 		 */
 		if (pol->mode == MPOL_PREFERRED)
@@ -2311,6 +2349,7 @@ bool __mpol_equal(struct mempolicy *a, s
 	case MPOL_BIND:
 	case MPOL_INTERLEAVE:
 	case MPOL_PREFERRED:
+	case MPOL_PREFERRED_MANY:
 		return !!nodes_equal(a->nodes, b->nodes);
 	case MPOL_LOCAL:
 		return true;
@@ -2451,6 +2490,8 @@ int mpol_misplaced(struct page *page, st
 		break;
 
 	case MPOL_PREFERRED:
+		if (node_isset(curnid, pol->nodes))
+			goto out;
 		polnid = first_node(pol->nodes);
 		break;
 
@@ -2465,9 +2506,10 @@ int mpol_misplaced(struct page *page, st
 				break;
 			goto out;
 		}
+		fallthrough;
 
+	case MPOL_PREFERRED_MANY:
 		/*
-		 * allows binding to multiple nodes.
 		 * use current page if in policy nodemask,
 		 * else select nearest allowed node, if any.
 		 * If no allowed nodes, use current [!misplaced].
@@ -2829,6 +2871,7 @@ static const char * const policy_modes[]
 	[MPOL_BIND]       = "bind",
 	[MPOL_INTERLEAVE] = "interleave",
 	[MPOL_LOCAL]      = "local",
+	[MPOL_PREFERRED_MANY]  = "prefer (many)",
 };
 
 
@@ -2907,6 +2950,7 @@ int mpol_parse_str(char *str, struct mem
 		if (!nodelist)
 			err = 0;
 		goto out;
+	case MPOL_PREFERRED_MANY:
 	case MPOL_BIND:
 		/*
 		 * Insist on a nodelist
@@ -2993,6 +3037,7 @@ void mpol_to_str(char *buffer, int maxle
 	case MPOL_LOCAL:
 		break;
 	case MPOL_PREFERRED:
+	case MPOL_PREFERRED_MANY:
 	case MPOL_BIND:
 	case MPOL_INTERLEAVE:
 		nodes = pol->nodes;
_

  parent reply	other threads:[~2021-09-02 22:00 UTC|newest]

Thread overview: 253+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-02 21:48 incoming Andrew Morton
2021-09-02 21:49 ` incoming Andrew Morton
2021-09-02 21:49 ` [patch 001/212] ia64: fix typo in a comment Andrew Morton
2021-09-02 21:50 ` [patch 002/212] ia64: fix #endif comment for reserve_elfcorehdr() Andrew Morton
2021-09-02 21:50 ` [patch 003/212] ia64: make reserve_elfcorehdr() static Andrew Morton
2021-09-02 21:50 ` [patch 004/212] ia64: make num_rsvd_regions static Andrew Morton
2021-09-02 21:50 ` [patch 005/212] ocfs2: remove an unnecessary condition Andrew Morton
2021-09-02 21:50 ` [patch 006/212] ocfs2: quota_local: fix possible uninitialized-variable access in ocfs2_local_read_info() Andrew Morton
2021-09-02 21:50 ` [patch 007/212] ocfs2: ocfs2_downconvert_lock failure results in deadlock Andrew Morton
2021-09-02 21:50 ` [patch 008/212] arch/csky/kernel/probes/kprobes.c: fix bugon.cocci warnings Andrew Morton
2021-09-02 21:50 ` [patch 009/212] mm, slub: don't call flush_all() from slab_debug_trace_open() Andrew Morton
2021-09-02 21:50 ` [patch 010/212] mm, slub: allocate private object map for debugfs listings Andrew Morton
2021-09-02 21:50 ` [patch 011/212] mm, slub: allocate private object map for validate_slab_cache() Andrew Morton
2021-09-02 21:50 ` [patch 012/212] mm, slub: don't disable irq for debug_check_no_locks_freed() Andrew Morton
2021-09-02 21:50 ` [patch 013/212] mm, slub: remove redundant unfreeze_partials() from put_cpu_partial() Andrew Morton
2021-09-02 21:50 ` [patch 014/212] mm, slub: unify cmpxchg_double_slab() and __cmpxchg_double_slab() Andrew Morton
2021-09-02 21:50 ` [patch 015/212] mm, slub: extract get_partial() from new_slab_objects() Andrew Morton
2021-09-02 21:50 ` [patch 016/212] mm, slub: dissolve new_slab_objects() into ___slab_alloc() Andrew Morton
2021-09-02 21:50 ` [patch 017/212] mm, slub: return slab page from get_partial() and set c->page afterwards Andrew Morton
2021-09-02 21:50 ` [patch 018/212] mm, slub: restructure new page checks in ___slab_alloc() Andrew Morton
2021-09-02 21:50 ` [patch 019/212] mm, slub: simplify kmem_cache_cpu and tid setup Andrew Morton
2021-09-02 21:50 ` [patch 020/212] mm, slub: move disabling/enabling irqs to ___slab_alloc() Andrew Morton
2021-09-02 21:51 ` [patch 021/212] mm, slub: do initial checks in ___slab_alloc() with irqs enabled Andrew Morton
2021-09-02 21:51 ` [patch 022/212] mm, slub: move disabling irqs closer to get_partial() in ___slab_alloc() Andrew Morton
2021-09-02 21:51 ` [patch 023/212] mm, slub: restore irqs around calling new_slab() Andrew Morton
2021-09-02 21:51 ` [patch 024/212] mm, slub: validate slab from partial list or page allocator before making it cpu slab Andrew Morton
2021-09-02 21:51 ` [patch 025/212] mm, slub: check new pages with restored irqs Andrew Morton
2021-09-02 21:51 ` [patch 026/212] mm, slub: stop disabling irqs around get_partial() Andrew Morton
2021-09-02 21:51 ` [patch 027/212] mm, slub: move reset of c->page and freelist out of deactivate_slab() Andrew Morton
2021-09-02 21:51 ` [patch 028/212] mm, slub: make locking in deactivate_slab() irq-safe Andrew Morton
2021-09-02 21:51 ` [patch 029/212] mm, slub: call deactivate_slab() without disabling irqs Andrew Morton
2021-09-02 21:51 ` [patch 030/212] mm, slub: move irq control into unfreeze_partials() Andrew Morton
2021-09-02 21:51 ` [patch 031/212] mm, slub: discard slabs in unfreeze_partials() without irqs disabled Andrew Morton
2021-09-02 21:51 ` [patch 032/212] mm, slub: detach whole partial list at once in unfreeze_partials() Andrew Morton
2021-09-02 21:51 ` [patch 033/212] mm, slub: separate detaching of partial list in unfreeze_partials() from unfreezing Andrew Morton
2021-09-02 21:51 ` [patch 034/212] mm, slub: only disable irq with spin_lock in __unfreeze_partials() Andrew Morton
2021-09-02 21:51 ` [patch 035/212] mm, slub: don't disable irqs in slub_cpu_dead() Andrew Morton
2021-09-02 21:51 ` [patch 036/212] mm, slab: make flush_slab() possible to call with irqs enabled Andrew Morton
2021-09-02 23:15   ` Linus Torvalds
2021-09-02 23:34     ` Linus Torvalds
2021-09-02 23:51       ` Linus Torvalds
2021-09-03  5:26         ` Vlastimil Babka
2021-09-03  6:22           ` Mike Galbraith
2021-09-03  7:03             ` Vlastimil Babka
2021-09-03 11:14               ` Vlastimil Babka
2021-09-03 16:18             ` Linus Torvalds
2021-09-02 21:51 ` [patch 037/212] mm: slub: move flush_cpu_slab() invocations __free_slab() invocations out of IRQ context Andrew Morton
2021-09-02 21:51 ` [patch 038/212] mm: slub: make object_map_lock a raw_spinlock_t Andrew Morton
2021-09-02 21:52 ` [patch 039/212] mm, slub: optionally save/restore irqs in slab_[un]lock()/ Andrew Morton
2021-09-02 21:52 ` [patch 040/212] mm, slub: make slab_lock() disable irqs with PREEMPT_RT Andrew Morton
2021-09-02 21:52 ` [patch 041/212] mm, slub: protect put_cpu_partial() with disabled irqs instead of cmpxchg Andrew Morton
2021-09-02 21:52 ` [patch 042/212] mm, slub: use migrate_disable() on PREEMPT_RT Andrew Morton
2021-09-02 21:52 ` [patch 043/212] mm, slub: convert kmem_cpu_slab protection to local_lock Andrew Morton
2021-09-02 21:52 ` [patch 044/212] mm/debug_vm_pgtable: introduce struct pgtable_debug_args Andrew Morton
2021-09-02 21:52 ` [patch 045/212] mm/debug_vm_pgtable: use struct pgtable_debug_args in basic tests Andrew Morton
2021-09-02 21:52 ` [patch 046/212] mm/debug_vm_pgtable: use struct pgtable_debug_args in leaf and savewrite tests Andrew Morton
2021-09-02 21:52 ` [patch 047/212] mm/debug_vm_pgtable: use struct pgtable_debug_args in protnone and devmap tests Andrew Morton
2021-09-02 21:52 ` [patch 048/212] mm/debug_vm_pgtable: use struct pgtable_debug_args in soft_dirty and swap tests Andrew Morton
2021-09-02 21:52 ` [patch 049/212] mm/debug_vm_pgtable: use struct pgtable_debug_args in migration and thp tests Andrew Morton
2021-09-02 21:52 ` [patch 050/212] mm/debug_vm_pgtable: use struct pgtable_debug_args in PTE modifying tests Andrew Morton
2021-09-02 21:52 ` [patch 051/212] mm/debug_vm_pgtable: use struct pgtable_debug_args in PMD " Andrew Morton
2021-09-02 21:52 ` [patch 052/212] mm/debug_vm_pgtable: use struct pgtable_debug_args in PUD " Andrew Morton
2021-09-02 21:52 ` [patch 053/212] mm/debug_vm_pgtable: use struct pgtable_debug_args in PGD and P4D " Andrew Morton
2021-09-02 21:52 ` [patch 054/212] mm/debug_vm_pgtable: remove unused code Andrew Morton
2021-09-02 21:52 ` [patch 055/212] mm/debug_vm_pgtable: fix corrupted page flag Andrew Morton
2021-09-02 21:52 ` [patch 056/212] mm: report a more useful address for reclaim acquisition Andrew Morton
2021-09-02 21:53 ` [patch 057/212] mm: add kernel_misc_reclaimable in show_free_areas Andrew Morton
2021-09-02 21:53 ` [patch 058/212] writeback: track number of inodes under writeback Andrew Morton
2021-09-02 21:53 ` [patch 059/212] writeback: reliably update bandwidth estimation Andrew Morton
2021-09-02 21:53 ` [patch 060/212] writeback: fix bandwidth estimate for spiky workload Andrew Morton
2021-09-02 21:53 ` [patch 061/212] writeback: rename domain_update_bandwidth() Andrew Morton
2021-09-02 21:53 ` [patch 062/212] writeback: use READ_ONCE for unlocked reads of writeback stats Andrew Morton
2021-09-02 21:53 ` [patch 063/212] mm: remove irqsave/restore locking from contexts with irqs enabled Andrew Morton
2021-09-02 21:53 ` [patch 064/212] fs: drop_caches: fix skipping over shadow cache inodes Andrew Morton
2021-09-02 21:53 ` [patch 065/212] fs: inode: count invalidated shadow pages in pginodesteal Andrew Morton
2021-09-02 21:53 ` [patch 066/212] writeback: memcg: simplify cgroup_writeback_by_id Andrew Morton
2021-09-02 21:53 ` [patch 067/212] include/linux/buffer_head.h: fix boolreturn.cocci warnings Andrew Morton
2021-09-02 21:53 ` [patch 068/212] mm: gup: remove set but unused local variable major Andrew Morton
2021-09-02 21:53 ` [patch 069/212] mm: gup: remove unneed local variable orig_refs Andrew Morton
2021-09-02 21:53 ` [patch 070/212] mm: gup: remove useless BUG_ON in __get_user_pages() Andrew Morton
2021-09-02 21:53 ` [patch 071/212] mm: gup: fix potential pgmap refcnt leak in __gup_device_huge() Andrew Morton
2021-09-03 16:35   ` Linus Torvalds
2021-09-03 17:55     ` John Hubbard
2021-09-03 19:01       ` Linus Torvalds
2021-09-02 21:53 ` [patch 072/212] mm: gup: use helper PAGE_ALIGNED in populate_vma_page_range() Andrew Morton
2021-09-02 21:53 ` [patch 073/212] mm/gup: documentation corrections for gup/pup Andrew Morton
2021-09-02 21:53 ` [patch 074/212] mm/gup: small refactoring: simplify try_grab_page() Andrew Morton
2021-09-02 21:53 ` [patch 075/212] mm/gup: remove try_get_page(), call try_get_compound_head() directly Andrew Morton
2021-09-02 23:23   ` John Hubbard
2021-09-02 21:53 ` [patch 076/212] fs, mm: fix race in unlinking swapfile Andrew Morton
2021-09-02 21:54 ` [patch 077/212] mm: delete unused get_kernel_page() Andrew Morton
2021-09-02 21:54 ` [patch 078/212] shmem: use raw_spinlock_t for ->stat_lock Andrew Morton
2021-09-02 21:54 ` [patch 079/212] shmem: remove unneeded variable ret Andrew Morton
2021-09-02 21:54 ` [patch 080/212] shmem: remove unneeded header file Andrew Morton
2021-09-02 21:54 ` [patch 081/212] shmem: remove unneeded function forward declaration Andrew Morton
2021-09-02 21:54 ` [patch 082/212] shmem: include header file to declare swap_info Andrew Morton
2021-09-02 21:54 ` [patch 083/212] huge tmpfs: fix fallocate(vanilla) advance over huge pages Andrew Morton
2021-09-02 21:54 ` [patch 084/212] huge tmpfs: fix split_huge_page() after FALLOC_FL_KEEP_SIZE Andrew Morton
2021-09-02 21:54 ` [patch 085/212] huge tmpfs: remove shrinklist addition from shmem_setattr() Andrew Morton
2021-09-02 21:54 ` [patch 086/212] huge tmpfs: revert shmem's use of transhuge_vma_enabled() Andrew Morton
2021-09-02 21:54 ` [patch 087/212] huge tmpfs: move shmem_huge_enabled() upwards Andrew Morton
2021-09-02 21:54 ` [patch 088/212] huge tmpfs: SGP_NOALLOC to stop collapse_file() on race Andrew Morton
2021-09-02 21:54 ` [patch 089/212] huge tmpfs: shmem_is_huge(vma, inode, index) Andrew Morton
2021-09-02 21:54 ` [patch 090/212] huge tmpfs: decide stat.st_blksize by shmem_is_huge() Andrew Morton
2021-09-02 21:54 ` [patch 091/212] shmem: shmem_writepage() split unlikely i915 THP Andrew Morton
2021-09-02 21:54 ` [patch 092/212] mm, memcg: add mem_cgroup_disabled checks in vmpressure and swap-related functions Andrew Morton
2021-09-02 21:54 ` [patch 093/212] mm, memcg: inline mem_cgroup_{charge/uncharge} to improve disabled memcg config Andrew Morton
2021-09-02 21:54 ` [patch 094/212] mm, memcg: inline swap-related functions " Andrew Morton
2021-09-02 21:54 ` [patch 095/212] memcg: enable accounting for pids in nested pid namespaces Andrew Morton
2021-09-02 21:55 ` [patch 096/212] memcg: switch lruvec stats to rstat Andrew Morton
2021-09-02 21:55 ` [patch 097/212] memcg: infrastructure to flush memcg stats Andrew Morton
2021-09-05 12:44   ` [memcg] 45208c9105: aim7.jobs-per-min -14.0% regression kernel test robot
2021-09-05 22:15     ` Shakeel Butt
2021-09-07  3:30       ` Feng Tang
2021-09-10  0:43         ` Shakeel Butt
2021-09-10  1:08           ` Feng Tang
2021-09-10  1:19             ` Shakeel Butt
2021-09-10  2:34               ` Feng Tang
2021-09-10  4:17                 ` Shakeel Butt
2021-09-02 21:55 ` [patch 098/212] memcg: charge fs_context and legacy_fs_context Andrew Morton
2021-09-02 21:55 ` [patch 099/212] memcg: enable accounting for mnt_cache entries Andrew Morton
2021-09-02 21:55 ` [patch 100/212] memcg: enable accounting for pollfd and select bits arrays Andrew Morton
2021-09-05 13:27   ` [memcg] fa4e6b1ad5: will-it-scale.per_thread_ops -15.4% regression kernel test robot
2021-09-02 21:55 ` [patch 101/212] memcg: enable accounting for file lock caches Andrew Morton
2021-09-05 13:08   ` [memcg] 059dd9003a: will-it-scale.per_process_ops -39.8% regression kernel test robot
2021-09-02 21:55 ` [patch 102/212] memcg: enable accounting for fasync_cache Andrew Morton
2021-09-02 21:55 ` [patch 103/212] memcg: enable accounting for new namesapces and struct nsproxy Andrew Morton
2021-09-02 21:55 ` [patch 104/212] memcg: enable accounting of ipc resources Andrew Morton
2021-09-02 21:55 ` [patch 105/212] memcg: enable accounting for signals Andrew Morton
2021-09-02 21:55 ` [patch 106/212] memcg: enable accounting for posix_timers_cache slab Andrew Morton
2021-09-02 21:55 ` [patch 107/212] memcg: enable accounting for ldt_struct objects Andrew Morton
2021-09-02 21:55 ` [patch 108/212] memcg: cleanup racy sum avoidance code Andrew Morton
2021-09-02 21:55 ` [patch 109/212] memcg: replace in_interrupt() by !in_task() in active_memcg() Andrew Morton
2021-09-02 21:55 ` [patch 110/212] mm: memcontrol: set the correct memcg swappiness restriction Andrew Morton
2021-09-02 21:55 ` [patch 111/212] mm, memcg: remove unused functions Andrew Morton
2021-09-02 21:55 ` [patch 112/212] mm, memcg: save some atomic ops when flush is already true Andrew Morton
2021-09-02 21:56 ` [patch 113/212] memcg: fix up drain_local_stock comment Andrew Morton
2021-09-02 21:56 ` [patch 114/212] memcg: make memcg->event_list_lock irqsafe Andrew Morton
2021-09-02 21:56 ` [patch 115/212] selftests/vm: use kselftest skip code for skipped tests Andrew Morton
2021-09-02 21:56 ` [patch 116/212] selftests: Fix spelling mistake "cann't" -> "cannot" Andrew Morton
2021-09-02 21:56 ` [patch 117/212] lazy tlb: introduce lazy mm refcount helper functions Andrew Morton
2021-09-02 21:56 ` [patch 118/212] lazy tlb: allow lazy tlb mm refcounting to be configurable Andrew Morton
2021-09-02 21:56 ` [patch 119/212] lazy tlb: shoot lazies, a non-refcounting lazy tlb option Andrew Morton
2021-09-02 22:28   ` Andy Lutomirski
2021-09-02 22:50     ` Linus Torvalds
2021-09-02 22:53       ` Andrew Morton
2021-09-03  0:35         ` Andy Lutomirski
2021-09-03  0:46         ` Nicholas Piggin
2021-09-03  5:11           ` Andy Lutomirski
2021-09-03  5:44             ` Nicholas Piggin
2021-09-03 23:48               ` Nicholas Piggin
2021-09-03  0:48     ` Nicholas Piggin
2021-09-02 21:56 ` [patch 120/212] powerpc/64s: enable MMU_LAZY_TLB_SHOOTDOWN Andrew Morton
2021-09-02 21:56 ` [patch 121/212] mmc: JZ4740: remove the flush_kernel_dcache_page call in jz4740_mmc_read_data Andrew Morton
2021-09-02 21:56 ` [patch 122/212] mmc: mmc_spi: replace flush_kernel_dcache_page with flush_dcache_page Andrew Morton
2021-09-02 21:56 ` [patch 123/212] scatterlist: " Andrew Morton
2021-09-02 21:56 ` [patch 124/212] mm: remove flush_kernel_dcache_page Andrew Morton
2021-09-02 21:56 ` [patch 125/212] mm,do_huge_pmd_numa_page: remove unnecessary TLB flushing code Andrew Morton
2021-09-02 21:56 ` [patch 126/212] mm: change fault_in_pages_* to have an unsigned size parameter Andrew Morton
2021-09-02 21:56 ` [patch 127/212] mm/pagemap: add mmap_assert_locked() annotations to find_vma*() Andrew Morton
2021-09-02 21:56 ` [patch 128/212] remap_file_pages: Use vma_lookup() instead of find_vma() Andrew Morton
2021-09-02 21:56 ` [patch 129/212] mm/mremap: fix memory account on do_munmap() failure Andrew Morton
2021-09-02 21:56 ` [patch 130/212] mm/bootmem_info.c: mark __init on register_page_bootmem_info_section Andrew Morton
2021-09-02 21:56 ` [patch 131/212] mm: sparse: pass section_nr to section_mark_present Andrew Morton
2021-09-02 21:57 ` [patch 132/212] mm: sparse: pass section_nr to find_memory_block Andrew Morton
2021-09-02 21:57 ` [patch 133/212] mm: sparse: remove __section_nr() function Andrew Morton
2021-09-02 21:57 ` [patch 134/212] mm/sparse: set SECTION_NID_SHIFT to 6 Andrew Morton
2021-09-02 21:57 ` [patch 135/212] include/linux/mmzone.h: avoid a warning in sparse memory support Andrew Morton
2021-09-02 21:57 ` [patch 136/212] mm/sparse: clarify pgdat_to_phys Andrew Morton
2021-09-02 21:57 ` [patch 137/212] mm/vmalloc: use batched page requests in bulk-allocator Andrew Morton
2021-09-02 21:57 ` [patch 138/212] mm/vmalloc: remove gfpflags_allow_blocking() check Andrew Morton
2021-09-02 21:57 ` [patch 139/212] lib/test_vmalloc.c: add a new 'nr_pages' parameter Andrew Morton
2021-09-02 21:57 ` [patch 140/212] mm/vmalloc: fix wrong behavior in vread Andrew Morton
2021-09-02 21:57 ` [patch 141/212] mm/kasan: move kasan.fault to mm/kasan/report.c Andrew Morton
2021-09-02 21:57 ` [patch 142/212] kasan: test: rework kmalloc_oob_right Andrew Morton
2021-09-02 21:57 ` [patch 143/212] kasan: test: avoid writing invalid memory Andrew Morton
2021-09-02 21:57 ` [patch 144/212] kasan: test: avoid corrupting memory via memset Andrew Morton
2021-09-02 21:57 ` [patch 145/212] kasan: test: disable kmalloc_memmove_invalid_size for HW_TAGS Andrew Morton
2021-09-02 21:57 ` [patch 146/212] kasan: test: only do kmalloc_uaf_memset for generic mode Andrew Morton
2021-09-02 21:57 ` [patch 147/212] kasan: test: clean up ksize_uaf Andrew Morton
2021-09-02 21:57 ` [patch 148/212] kasan: test: avoid corrupting memory in copy_user_test Andrew Morton
2021-09-02 21:57 ` [patch 149/212] kasan: test: avoid corrupting memory in kasan_rcu_uaf Andrew Morton
2021-09-02 21:57 ` [patch 150/212] mm/page_alloc: always initialize memory map for the holes Andrew Morton
2021-09-02 21:57 ` [patch 151/212] microblaze: simplify pte_alloc_one_kernel() Andrew Morton
2021-09-02 21:58 ` [patch 152/212] mm: introduce memmap_alloc() to unify memory map allocation Andrew Morton
2021-09-02 21:58 ` [patch 153/212] memblock: stop poisoning raw allocations Andrew Morton
2021-09-02 21:58 ` [patch 154/212] mm/page_alloc.c: fix 'zone_id' may be used uninitialized in this function warning Andrew Morton
2021-09-02 21:58 ` [patch 155/212] mm/page_alloc: make alloc_node_mem_map() __init rather than __ref Andrew Morton
2021-09-02 21:58 ` [patch 156/212] mm/page_alloc.c: use in_task() Andrew Morton
2021-09-02 21:58 ` [patch 157/212] mm/page_isolation: tracing: trace all test_pages_isolated failures Andrew Morton
2021-09-02 21:58 ` [patch 158/212] mm/hwpoison: remove unneeded variable unmap_success Andrew Morton
2021-09-02 21:58 ` [patch 159/212] mm/hwpoison: fix potential pte_unmap_unlock pte error Andrew Morton
2021-09-02 21:58 ` [patch 160/212] mm/hwpoison: change argument struct page **hpagep to *hpage Andrew Morton
2021-09-02 21:58 ` [patch 161/212] mm/hwpoison: fix some obsolete comments Andrew Morton
2021-09-02 21:58 ` [patch 162/212] mm: hwpoison: don't drop slab caches for offlining non-LRU page Andrew Morton
2021-09-02 21:58 ` [patch 163/212] doc: hwpoison: correct the support for hugepage Andrew Morton
2021-09-02 21:58 ` [patch 164/212] mm: hwpoison: dump page for unhandlable page Andrew Morton
2021-09-02 21:58 ` [patch 165/212] mm: fix panic caused by __page_handle_poison() Andrew Morton
2021-09-02 21:58 ` [patch 166/212] hugetlb: simplify prep_compound_gigantic_page ref count racing code Andrew Morton
2021-09-02 21:58 ` [patch 167/212] hugetlb: drop ref count earlier after page allocation Andrew Morton
2021-09-02 21:58 ` [patch 168/212] hugetlb: before freeing hugetlb page set dtor to appropriate value Andrew Morton
2021-09-02 21:58 ` [patch 169/212] hugetlb: fix hugetlb cgroup refcounting during vma split Andrew Morton
2021-09-02 21:58 ` [patch 170/212] userfaultfd: change mmap_changing to atomic Andrew Morton
2021-09-02 21:58 ` [patch 171/212] userfaultfd: prevent concurrent API initialization Andrew Morton
2021-09-02 21:59 ` [patch 172/212] selftests/vm/userfaultfd: wake after copy failure Andrew Morton
2021-09-02 21:59 ` [patch 173/212] mm/numa: automatically generate node migration order Andrew Morton
2021-09-02 21:59 ` [patch 174/212] mm/migrate: update node demotion order on hotplug events Andrew Morton
2021-09-05 13:59   ` [mm/migrate] 9eeb73028c: stress-ng.memhotplug.ops_per_sec -53.8% regression kernel test robot
2021-09-06  1:53     ` Huang, Ying
2021-09-06  3:57       ` Dave Hansen
2021-09-06  5:57         ` Huang, Ying
2021-09-06  6:09           ` Chen Yu
2021-09-06  8:31             ` Huang, Ying
2021-09-17  3:14     ` Huang, Ying
2021-10-21 14:29       ` Oliver Sang
2021-09-02 21:59 ` [patch 175/212] mm/migrate: enable returning precise migrate_pages() success count Andrew Morton
2021-09-02 21:59 ` [patch 176/212] mm/migrate: demote pages during reclaim Andrew Morton
2021-09-02 21:59 ` [patch 177/212] mm/vmscan: add page demotion counter Andrew Morton
2021-09-02 21:59 ` [patch 178/212] mm/vmscan: add helper for querying ability to age anonymous pages Andrew Morton
2021-09-02 21:59 ` [patch 179/212] mm/vmscan: Consider anonymous pages without swap Andrew Morton
2021-09-02 21:59 ` [patch 180/212] mm/vmscan: never demote for memcg reclaim Andrew Morton
2021-09-02 21:59 ` [patch 181/212] mm/migrate: add sysfs interface to enable reclaim migration Andrew Morton
2021-09-02 21:59 ` [patch 182/212] mm/vmpressure: replace vmpressure_to_css() with vmpressure_to_memcg() Andrew Morton
2021-09-02 21:59 ` [patch 183/212] mm/vmscan: remove the PageDirty check after MADV_FREE pages are page_ref_freezed Andrew Morton
2021-09-02 21:59 ` [patch 184/212] mm/vmscan: remove misleading setting to sc->priority Andrew Morton
2021-09-02 21:59 ` [patch 185/212] mm/vmscan: remove unneeded return value of kswapd_run() Andrew Morton
2021-09-02 21:59 ` [patch 186/212] mm/vmscan: add 'else' to remove check_pending label Andrew Morton
2021-09-02 21:59 ` [patch 187/212] mm, vmscan: guarantee drop_slab_node() termination Andrew Morton
2021-09-02 21:59 ` [patch 188/212] mm: compaction: optimize proactive compaction deferrals Andrew Morton
2021-09-02 21:59 ` [patch 189/212] mm: compaction: support triggering of proactive compaction by user Andrew Morton
2021-09-02 22:00 ` [patch 190/212] mm/mempolicy: use readable NUMA_NO_NODE macro instead of magic number Andrew Morton
2021-09-02 22:00 ` Andrew Morton [this message]
2021-09-02 22:00 ` [patch 192/212] mm/memplicy: add page allocation function for MPOL_PREFERRED_MANY policy Andrew Morton
2021-09-02 22:00 ` [patch 193/212] mm/hugetlb: add support for mempolicy MPOL_PREFERRED_MANY Andrew Morton
2021-09-02 22:00 ` [patch 194/212] mm/mempolicy: advertise new MPOL_PREFERRED_MANY Andrew Morton
2021-09-02 22:00 ` [patch 195/212] mm/mempolicy: unify the create() func for bind/interleave/prefer-many policies Andrew Morton
2021-09-02 22:00 ` [patch 196/212] mm/mempolicy.c: use in_task() in mempolicy_slab_node() Andrew Morton
2021-09-02 22:00 ` [patch 197/212] memblock: make memblock_find_in_range method private Andrew Morton
2021-09-02 22:00 ` [patch 198/212] mm: introduce process_mrelease system call Andrew Morton
2021-09-02 22:00 ` [patch 199/212] mm: wire up syscall process_mrelease Andrew Morton
2021-09-02 22:00 ` [patch 200/212] mm/migrate: correct kernel-doc notation Andrew Morton
2021-09-02 22:00 ` [patch 201/212] selftests: vm: add KSM merge test Andrew Morton
2021-09-02 22:00 ` [patch 202/212] selftests: vm: add KSM unmerge test Andrew Morton
2021-09-02 22:00 ` [patch 203/212] selftests: vm: add KSM zero page merging test Andrew Morton
2021-09-02 22:00 ` [patch 204/212] selftests: vm: add KSM merging across nodes test Andrew Morton
2021-09-02 22:00 ` [patch 205/212] mm: KSM: fix data type Andrew Morton
2021-09-02 22:00 ` [patch 206/212] selftests: vm: add KSM merging time test Andrew Morton
2021-09-02 22:00 ` [patch 207/212] selftests: vm: add COW time test for KSM pages Andrew Morton
2021-09-02 22:01 ` [patch 208/212] mm/percpu,c: remove obsolete comments of pcpu_chunk_populated() Andrew Morton
2021-09-02 22:01 ` [patch 209/212] mm/vmstat: correct some wrong comments Andrew Morton
2021-09-02 22:01 ` [patch 210/212] mm/vmstat: simplify the array size calculation Andrew Morton
2021-09-02 22:01 ` [patch 211/212] mm/vmstat: remove unneeded return value Andrew Morton
2021-09-02 22:01 ` [patch 212/212] mm/madvise: add MADV_WILLNEED to process_madvise() 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=20210902220006.ntmmePKhX%akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=aarcange@redhat.com \
    --cc=ak@linux.intel.com \
    --cc=ben.widawsky@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=feng.tang@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@techsingularity.net \
    --cc=mhocko@kernel.org \
    --cc=mhocko@suse.com \
    --cc=mike.kravetz@oracle.com \
    --cc=mm-commits@vger.kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=torvalds@linux-foundation.org \
    --cc=vbabka@suse.cz \
    --cc=ying.huang@intel.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).