mm-commits.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: dave@stgolabs.net, manfred@colorfullife.com,
	mm-commits@vger.kernel.org, willy@infradead.org
Subject: [to-be-updated] ipc-convert-ipcs_idr-to-xarray.patch removed from -mm tree
Date: Tue, 09 Jun 2020 21:00:06 -0700	[thread overview]
Message-ID: <20200610040006.FqEXH90eZ%akpm@linux-foundation.org> (raw)
In-Reply-To: <20200608212922.5b7fa74ca3f4e2444441b7f9@linux-foundation.org>


The patch titled
     Subject: ipc: convert ipcs_idr to XArray
has been removed from the -mm tree.  Its filename was
     ipc-convert-ipcs_idr-to-xarray.patch

This patch was dropped because an updated version will be merged

------------------------------------------------------
From: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Subject: ipc: convert ipcs_idr to XArray

The XArray has better loops than the IDR has, removing the need to
open-code them.  We also don't need to call idr_destroy() any more. 
Allocating the ID is a little tricky due to needing to get 'seq' correct. 
Open-code a variant of __xa_alloc() which lets us set the ID and the seq
before depositing the pointer in the array.

[willy@infradead.org: 	implement change suggested by Manfred]
  Link: http://lkml.kernel.org/r/20200421183342.GQ5820@bombadil.infradead.org
[akpm@linux-foundation.org: fix conflict resolution fix]
Link: http://lkml.kernel.org/r/20200326151418.27545-1-willy@infradead.org
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Cc: Manfred Spraul <manfred@colorfullife.com>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 include/linux/ipc_namespace.h |   10 -
 ipc/ipc_sysctl.c              |   14 +-
 ipc/msg.c                     |    1 
 ipc/namespace.c               |   13 --
 ipc/sem.c                     |    1 
 ipc/shm.c                     |   60 ++++-------
 ipc/util.c                    |  173 ++++++++++++++------------------
 ipc/util.h                    |    4 
 8 files changed, 122 insertions(+), 154 deletions(-)

--- a/include/linux/ipc_namespace.h~ipc-convert-ipcs_idr-to-xarray
+++ a/include/linux/ipc_namespace.h
@@ -3,13 +3,13 @@
 #define __IPC_NAMESPACE_H__
 
 #include <linux/err.h>
-#include <linux/idr.h>
-#include <linux/rwsem.h>
 #include <linux/notifier.h>
 #include <linux/nsproxy.h>
 #include <linux/ns_common.h>
 #include <linux/refcount.h>
 #include <linux/rhashtable-types.h>
+#include <linux/rwsem.h>
+#include <linux/xarray.h>
 
 struct user_namespace;
 
@@ -17,11 +17,11 @@ struct ipc_ids {
 	int in_use;
 	unsigned short seq;
 	struct rw_semaphore rwsem;
-	struct idr ipcs_idr;
+	struct xarray ipcs;
 	int max_idx;
-	int last_idx;	/* For wrap around detection */
+	int next_idx;
 #ifdef CONFIG_CHECKPOINT_RESTORE
-	int next_id;
+	int restore_id;
 #endif
 	struct rhashtable key_ht;
 };
--- a/ipc/ipc_sysctl.c~ipc-convert-ipcs_idr-to-xarray
+++ a/ipc/ipc_sysctl.c
@@ -115,7 +115,7 @@ static int proc_ipc_sem_dointvec(struct
 
 int ipc_mni = IPCMNI;
 int ipc_mni_shift = IPCMNI_SHIFT;
-int ipc_min_cycle = RADIX_TREE_MAP_SIZE;
+int ipc_min_cycle = XA_CHUNK_SIZE;
 
 static struct ctl_table ipc_kern_table[] = {
 	{
@@ -196,8 +196,8 @@ static struct ctl_table ipc_kern_table[]
 #ifdef CONFIG_CHECKPOINT_RESTORE
 	{
 		.procname	= "sem_next_id",
-		.data		= &init_ipc_ns.ids[IPC_SEM_IDS].next_id,
-		.maxlen		= sizeof(init_ipc_ns.ids[IPC_SEM_IDS].next_id),
+		.data		= &init_ipc_ns.ids[IPC_SEM_IDS].restore_id,
+		.maxlen		= sizeof(init_ipc_ns.ids[IPC_SEM_IDS].restore_id),
 		.mode		= 0644,
 		.proc_handler	= proc_ipc_dointvec_minmax,
 		.extra1		= SYSCTL_ZERO,
@@ -205,8 +205,8 @@ static struct ctl_table ipc_kern_table[]
 	},
 	{
 		.procname	= "msg_next_id",
-		.data		= &init_ipc_ns.ids[IPC_MSG_IDS].next_id,
-		.maxlen		= sizeof(init_ipc_ns.ids[IPC_MSG_IDS].next_id),
+		.data		= &init_ipc_ns.ids[IPC_MSG_IDS].restore_id,
+		.maxlen		= sizeof(init_ipc_ns.ids[IPC_MSG_IDS].restore_id),
 		.mode		= 0644,
 		.proc_handler	= proc_ipc_dointvec_minmax,
 		.extra1		= SYSCTL_ZERO,
@@ -214,8 +214,8 @@ static struct ctl_table ipc_kern_table[]
 	},
 	{
 		.procname	= "shm_next_id",
-		.data		= &init_ipc_ns.ids[IPC_SHM_IDS].next_id,
-		.maxlen		= sizeof(init_ipc_ns.ids[IPC_SHM_IDS].next_id),
+		.data		= &init_ipc_ns.ids[IPC_SHM_IDS].restore_id,
+		.maxlen		= sizeof(init_ipc_ns.ids[IPC_SHM_IDS].restore_id),
 		.mode		= 0644,
 		.proc_handler	= proc_ipc_dointvec_minmax,
 		.extra1		= SYSCTL_ZERO,
--- a/ipc/msg.c~ipc-convert-ipcs_idr-to-xarray
+++ a/ipc/msg.c
@@ -1310,7 +1310,6 @@ void msg_init_ns(struct ipc_namespace *n
 void msg_exit_ns(struct ipc_namespace *ns)
 {
 	free_ipcs(ns, &msg_ids(ns), freeque);
-	idr_destroy(&ns->ids[IPC_MSG_IDS].ipcs_idr);
 	rhashtable_destroy(&ns->ids[IPC_MSG_IDS].key_ht);
 }
 #endif
--- a/ipc/namespace.c~ipc-convert-ipcs_idr-to-xarray
+++ a/ipc/namespace.c
@@ -96,22 +96,17 @@ void free_ipcs(struct ipc_namespace *ns,
 	       void (*free)(struct ipc_namespace *, struct kern_ipc_perm *))
 {
 	struct kern_ipc_perm *perm;
-	int next_id;
-	int total, in_use;
+	unsigned long index;
 
 	down_write(&ids->rwsem);
 
-	in_use = ids->in_use;
-
-	for (total = 0, next_id = 0; total < in_use; next_id++) {
-		perm = idr_find(&ids->ipcs_idr, next_id);
-		if (perm == NULL)
-			continue;
+	xa_for_each(&ids->ipcs, index, perm) {
 		rcu_read_lock();
 		ipc_lock_object(perm);
 		free(ns, perm);
-		total++;
 	}
+	BUG_ON(!xa_empty(&ids->ipcs));
+
 	up_write(&ids->rwsem);
 }
 
--- a/ipc/sem.c~ipc-convert-ipcs_idr-to-xarray
+++ a/ipc/sem.c
@@ -258,7 +258,6 @@ void sem_init_ns(struct ipc_namespace *n
 void sem_exit_ns(struct ipc_namespace *ns)
 {
 	free_ipcs(ns, &sem_ids(ns), freeary);
-	idr_destroy(&ns->ids[IPC_SEM_IDS].ipcs_idr);
 	rhashtable_destroy(&ns->ids[IPC_SEM_IDS].key_ht);
 }
 #endif
--- a/ipc/shm.c~ipc-convert-ipcs_idr-to-xarray
+++ a/ipc/shm.c
@@ -129,7 +129,6 @@ static void do_shm_rmid(struct ipc_names
 void shm_exit_ns(struct ipc_namespace *ns)
 {
 	free_ipcs(ns, &shm_ids(ns), do_shm_rmid);
-	idr_destroy(&ns->ids[IPC_SHM_IDS].ipcs_idr);
 	rhashtable_destroy(&ns->ids[IPC_SHM_IDS].key_ht);
 }
 #endif
@@ -348,34 +347,30 @@ done:
 	up_write(&shm_ids(ns).rwsem);
 }
 
-/* Called with ns->shm_ids(ns).rwsem locked */
-static int shm_try_destroy_orphaned(int id, void *p, void *data)
+void shm_destroy_orphaned(struct ipc_namespace *ns)
 {
-	struct ipc_namespace *ns = data;
-	struct kern_ipc_perm *ipcp = p;
-	struct shmid_kernel *shp = container_of(ipcp, struct shmid_kernel, shm_perm);
+	struct kern_ipc_perm *ipcp;
+	unsigned long index;
 
-	/*
-	 * We want to destroy segments without users and with already
-	 * exit'ed originating process.
-	 *
-	 * As shp->* are changed under rwsem, it's safe to skip shp locking.
-	 */
-	if (shp->shm_creator != NULL)
-		return 0;
+	down_write(&shm_ids(ns).rwsem);
+	xa_for_each(&shm_ids(ns).ipcs, index, ipcp) {
+		struct shmid_kernel *shp;
 
-	if (shm_may_destroy(ns, shp)) {
-		shm_lock_by_ptr(shp);
-		shm_destroy(ns, shp);
-	}
-	return 0;
-}
+		shp = container_of(ipcp, struct shmid_kernel, shm_perm);
 
-void shm_destroy_orphaned(struct ipc_namespace *ns)
-{
-	down_write(&shm_ids(ns).rwsem);
-	if (shm_ids(ns).in_use)
-		idr_for_each(&shm_ids(ns).ipcs_idr, &shm_try_destroy_orphaned, ns);
+		/*
+		 * We want to destroy segments without users and with already
+		 * exit'ed originating process.  As shp->* are changed under
+		 * rwsem, it's safe to skip shp locking.
+		 */
+		if (shp->shm_creator != NULL)
+			continue;
+
+		if (shm_may_destroy(ns, shp)) {
+			shm_lock_by_ptr(shp);
+			shm_destroy(ns, shp);
+		}
+	}
 	up_write(&shm_ids(ns).rwsem);
 }
 
@@ -860,26 +855,17 @@ static void shm_add_rss_swap(struct shmi
 static void shm_get_stat(struct ipc_namespace *ns, unsigned long *rss,
 		unsigned long *swp)
 {
-	int next_id;
-	int total, in_use;
+	struct kern_ipc_perm *ipc;
+	unsigned long index;
 
 	*rss = 0;
 	*swp = 0;
 
-	in_use = shm_ids(ns).in_use;
-
-	for (total = 0, next_id = 0; total < in_use; next_id++) {
-		struct kern_ipc_perm *ipc;
+	xa_for_each(&shm_ids(ns).ipcs, index, ipc) {
 		struct shmid_kernel *shp;
 
-		ipc = idr_find(&shm_ids(ns).ipcs_idr, next_id);
-		if (ipc == NULL)
-			continue;
 		shp = container_of(ipc, struct shmid_kernel, shm_perm);
-
 		shm_add_rss_swap(shp, rss, swp);
-
-		total++;
 	}
 }
 
--- a/ipc/util.c~ipc-convert-ipcs_idr-to-xarray
+++ a/ipc/util.c
@@ -104,12 +104,20 @@ static const struct rhashtable_params ip
 	.automatic_shrinking	= true,
 };
 
+#ifdef CONFIG_CHECKPOINT_RESTORE
+#define set_restore_id(ids, x)	ids->restore_id = x
+#define get_restore_id(ids)	ids->restore_id
+#else
+#define set_restore_id(ids, x)	do { } while (0)
+#define get_restore_id(ids)	(-1)
+#endif
+
 /**
  * ipc_init_ids	- initialise ipc identifiers
  * @ids: ipc identifier set
  *
  * Set up the sequence range to use for the ipc identifier range (limited
- * below ipc_mni) then initialise the keys hashtable and ids idr.
+ * below ipc_mni) then initialise the keys hashtable and ids xarray.
  */
 void ipc_init_ids(struct ipc_ids *ids)
 {
@@ -117,12 +125,10 @@ void ipc_init_ids(struct ipc_ids *ids)
 	ids->seq = 0;
 	init_rwsem(&ids->rwsem);
 	rhashtable_init(&ids->key_ht, &ipc_kht_params);
-	idr_init(&ids->ipcs_idr);
+	xa_init_flags(&ids->ipcs, XA_FLAGS_ALLOC);
 	ids->max_idx = -1;
-	ids->last_idx = -1;
-#ifdef CONFIG_CHECKPOINT_RESTORE
-	ids->next_id = -1;
-#endif
+	ids->next_idx = 0;
+	set_restore_id(ids, -1);
 }
 
 #ifdef CONFIG_PROC_FS
@@ -183,12 +189,12 @@ static struct kern_ipc_perm *ipc_findkey
 }
 
 /*
- * Insert new IPC object into idr tree, and set sequence number and id
+ * Insert new IPC object into xarray, and set sequence number and id
  * in the correct order.
  * Especially:
- * - the sequence number must be set before inserting the object into the idr,
- *   because the sequence number is accessed without a lock.
- * - the id can/must be set after inserting the object into the idr.
+ * - the sequence number must be set before inserting the object into the
+ *   xarray, because the sequence number is accessed without a lock.
+ * - the id can/must be set after inserting the object into the xarray.
  *   All accesses must be done after getting kern_ipc_perm.lock.
  *
  * The caller must own kern_ipc_perm.lock.of the new object.
@@ -198,64 +204,48 @@ static struct kern_ipc_perm *ipc_findkey
  * the sequence number is incremented only when the returned ID is less than
  * the last one.
  */
-static inline int ipc_idr_alloc(struct ipc_ids *ids, struct kern_ipc_perm *new)
+static inline int ipc_id_alloc(struct ipc_ids *ids, struct kern_ipc_perm *new)
 {
-	int idx, next_id = -1;
-
-#ifdef CONFIG_CHECKPOINT_RESTORE
-	next_id = ids->next_id;
-	ids->next_id = -1;
-#endif
-
-	/*
-	 * As soon as a new object is inserted into the idr,
-	 * ipc_obtain_object_idr() or ipc_obtain_object_check() can find it,
-	 * and the lockless preparations for ipc operations can start.
-	 * This means especially: permission checks, audit calls, allocation
-	 * of undo structures, ...
-	 *
-	 * Thus the object must be fully initialized, and if something fails,
-	 * then the full tear-down sequence must be followed.
-	 * (i.e.: set new->deleted, reduce refcount, call_rcu())
-	 */
+	u32 idx;
+	int err;
 
-	if (next_id < 0) { /* !CHECKPOINT_RESTORE or next_id is unset */
+	if (get_restore_id(ids) < 0) {
 		int max_idx;
 
 		max_idx = max(ids->in_use*3/2, ipc_min_cycle);
-		max_idx = min(max_idx, ipc_mni);
+		max_idx = min(max_idx, ipc_mni) - 1;
+
+		xa_lock(&ids->ipcs);
 
-		/* allocate the idx, with a NULL struct kern_ipc_perm */
-		idx = idr_alloc_cyclic(&ids->ipcs_idr, NULL, 0, max_idx,
-					GFP_NOWAIT);
-
-		if (idx >= 0) {
-			/*
-			 * idx got allocated successfully.
-			 * Now calculate the sequence number and set the
-			 * pointer for real.
-			 */
-			if (idx <= ids->last_idx) {
-				ids->seq++;
-				if (ids->seq >= ipcid_seq_max())
-					ids->seq = 0;
-			}
-			ids->last_idx = idx;
+		err = __xa_alloc_cyclic(&ids->ipcs, &idx, NULL,
+				XA_LIMIT(0, max_idx), &ids->next_idx,
+				GFP_KERNEL);
+		if (err == 1) {
+			ids->seq++;
+			if (ids->seq >= ipcid_seq_max())
+				ids->seq = 0;
+		}
 
+		if (err >= 0) {
 			new->seq = ids->seq;
-			/* no need for smp_wmb(), this is done
-			 * inside idr_replace, as part of
-			 * rcu_assign_pointer
-			 */
-			idr_replace(&ids->ipcs_idr, new, idx);
+			new->id = (new->seq << ipcmni_seq_shift()) + idx;
+			/* xa_store contains a write barrier */
+			__xa_store(&ids->ipcs, idx, new, GFP_KERNEL);
 		}
+
+		xa_unlock(&ids->ipcs);
 	} else {
-		new->seq = ipcid_to_seqx(next_id);
-		idx = idr_alloc(&ids->ipcs_idr, new, ipcid_to_idx(next_id),
-				0, GFP_NOWAIT);
+		new->id = get_restore_id(ids);
+		new->seq = ipcid_to_seqx(new->id);
+		idx = ipcid_to_idx(new->id);
+		err = xa_insert(&ids->ipcs, idx, new, GFP_KERNEL);
+		set_restore_id(ids, -1);
 	}
-	if (idx >= 0)
-		new->id = (new->seq << ipcmni_seq_shift()) + idx;
+
+	if (err == -EBUSY)
+		return -ENOSPC;
+	if (err < 0)
+		return err;
 	return idx;
 }
 
@@ -278,7 +268,7 @@ int ipc_addid(struct ipc_ids *ids, struc
 {
 	kuid_t euid;
 	kgid_t egid;
-	int idx, err;
+	int idx;
 
 	/* 1) Initialize the refcount so that ipc_rcu_putref works */
 	refcount_set(&new->refcount, 1);
@@ -289,29 +279,42 @@ int ipc_addid(struct ipc_ids *ids, struc
 	if (ids->in_use >= limit)
 		return -ENOSPC;
 
-	idr_preload(GFP_KERNEL);
-
+	/*
+	 * 2) Hold the spinlock so that nobody else can access the object
+	 * once they can find it
+	 */
 	spin_lock_init(&new->lock);
-	rcu_read_lock();
 	spin_lock(&new->lock);
-
 	current_euid_egid(&euid, &egid);
 	new->cuid = new->uid = euid;
 	new->gid = new->cgid = egid;
-
 	new->deleted = false;
 
-	idx = ipc_idr_alloc(ids, new);
-	idr_preload_end();
+	idx = ipc_id_alloc(ids, new);
+
+	rcu_read_lock();
+
+	/*
+	 * As soon as a new object is inserted into the XArray,
+	 * ipc_obtain_object_idr() or ipc_obtain_object_check() can find it,
+	 * and the lockless preparations for ipc operations can start.
+	 * This means especially: permission checks, audit calls, allocation
+	 * of undo structures, ...
+	 *
+	 * Thus the object must be fully initialized, and if something fails,
+	 * then the full tear-down sequence must be followed.
+	 * (i.e.: set new->deleted, reduce refcount, call_rcu())
+	 */
 
 	if (idx >= 0 && new->key != IPC_PRIVATE) {
-		err = rhashtable_insert_fast(&ids->key_ht, &new->khtnode,
+		int err = rhashtable_insert_fast(&ids->key_ht, &new->khtnode,
 					     ipc_kht_params);
 		if (err < 0) {
-			idr_remove(&ids->ipcs_idr, idx);
+			xa_erase(&ids->ipcs, idx);
 			idx = err;
 		}
 	}
+
 	if (idx < 0) {
 		new->deleted = true;
 		spin_unlock(&new->lock);
@@ -462,7 +465,7 @@ void ipc_rmid(struct ipc_ids *ids, struc
 {
 	int idx = ipcid_to_idx(ipcp->id);
 
-	idr_remove(&ids->ipcs_idr, idx);
+	xa_erase(&ids->ipcs, idx);
 	ipc_kht_remove(ids, ipcp);
 	ids->in_use--;
 	ipcp->deleted = true;
@@ -472,7 +475,7 @@ void ipc_rmid(struct ipc_ids *ids, struc
 			idx--;
 			if (idx == -1)
 				break;
-		} while (!idr_find(&ids->ipcs_idr, idx));
+		} while (!xa_load(&ids->ipcs, idx));
 		ids->max_idx = idx;
 	}
 }
@@ -595,7 +598,7 @@ struct kern_ipc_perm *ipc_obtain_object_
 	struct kern_ipc_perm *out;
 	int idx = ipcid_to_idx(id);
 
-	out = idr_find(&ids->ipcs_idr, idx);
+	out = xa_load(&ids->ipcs, idx);
 	if (!out)
 		return ERR_PTR(-EINVAL);
 
@@ -754,30 +757,16 @@ struct pid_namespace *ipc_seq_pid_ns(str
 static struct kern_ipc_perm *sysvipc_find_ipc(struct ipc_ids *ids, loff_t pos,
 					      loff_t *new_pos)
 {
+	unsigned long index = pos;
 	struct kern_ipc_perm *ipc;
-	int total, id;
-
-	total = 0;
-	for (id = 0; id < pos && total < ids->in_use; id++) {
-		ipc = idr_find(&ids->ipcs_idr, id);
-		if (ipc != NULL)
-			total++;
-	}
-
-	ipc = NULL;
-	if (total >= ids->in_use)
-		goto out;
 
-	for (; pos < ipc_mni; pos++) {
-		ipc = idr_find(&ids->ipcs_idr, pos);
-		if (ipc != NULL) {
-			rcu_read_lock();
-			ipc_lock_object(ipc);
-			break;
-		}
-	}
-out:
-	*new_pos = pos + 1;
+	rcu_read_lock();
+	ipc = xa_find(&ids->ipcs, &index, ULONG_MAX, XA_PRESENT);
+	if (ipc)
+		ipc_lock_object(ipc);
+	else
+		rcu_read_unlock();
+	*new_pos = index + 1;
 	return ipc;
 }
 
--- a/ipc/util.h~ipc-convert-ipcs_idr-to-xarray
+++ a/ipc/util.h
@@ -27,7 +27,7 @@
  */
 #define IPCMNI_SHIFT		15
 #define IPCMNI_EXTEND_SHIFT	24
-#define IPCMNI_EXTEND_MIN_CYCLE	(RADIX_TREE_MAP_SIZE * RADIX_TREE_MAP_SIZE)
+#define IPCMNI_EXTEND_MIN_CYCLE	(XA_CHUNK_SIZE * XA_CHUNK_SIZE)
 #define IPCMNI			(1 << IPCMNI_SHIFT)
 #define IPCMNI_EXTEND		(1 << IPCMNI_EXTEND_SHIFT)
 
@@ -42,7 +42,7 @@ extern int ipc_min_cycle;
 #else /* CONFIG_SYSVIPC_SYSCTL */
 
 #define ipc_mni			IPCMNI
-#define ipc_min_cycle		((int)RADIX_TREE_MAP_SIZE)
+#define ipc_min_cycle		((int)XA_CHUNK_SIZE)
 #define ipcmni_seq_shift()	IPCMNI_SHIFT
 #define IPCMNI_IDX_MASK		((1 << IPCMNI_SHIFT) - 1)
 #endif /* CONFIG_SYSVIPC_SYSCTL */
_

Patches currently in -mm which might be from willy@infradead.org are

  parent reply	other threads:[~2020-06-10  4:00 UTC|newest]

Thread overview: 105+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-09  4:29 incoming Andrew Morton
2020-06-09  4:29 ` [patch 01/93] kallsyms/printk: add loglvl to print_ip_sym() Andrew Morton
2020-06-09  4:30 ` [patch 02/93] alpha: add show_stack_loglvl() Andrew Morton
2020-06-09  4:30 ` [patch 03/93] arc: " Andrew Morton
2020-06-09  4:30 ` [patch 04/93] arm/asm: add loglvl to c_backtrace() Andrew Morton
2020-06-09  4:30 ` [patch 05/93] arm: add loglvl to unwind_backtrace() Andrew Morton
2020-06-09  4:30 ` [patch 06/93] arm: add loglvl to dump_backtrace() Andrew Morton
2020-06-09  4:30 ` [patch 07/93] arm: wire up dump_backtrace_{entry,stm} Andrew Morton
2020-06-09  4:30 ` [patch 08/93] arm: add show_stack_loglvl() Andrew Morton
2020-06-09  4:30 ` [patch 09/93] arm64: add loglvl to dump_backtrace() Andrew Morton
2020-06-09  4:30 ` [patch 10/93] arm64: add show_stack_loglvl() Andrew Morton
2020-06-09  4:30 ` [patch 11/93] c6x: " Andrew Morton
2020-06-09  4:30 ` [patch 12/93] csky: " Andrew Morton
2020-06-09  4:30 ` [patch 13/93] h8300: " Andrew Morton
2020-06-09  4:30 ` [patch 14/93] hexagon: " Andrew Morton
2020-06-09  4:30 ` [patch 15/93] ia64: pass log level as arg into ia64_do_show_stack() Andrew Morton
2020-06-09  4:30 ` [patch 16/93] ia64: add show_stack_loglvl() Andrew Morton
2020-06-09  4:30 ` [patch 17/93] m68k: " Andrew Morton
2020-06-09  4:30 ` [patch 18/93] microblaze: add loglvl to microblaze_unwind_inner() Andrew Morton
2020-06-09  4:30 ` [patch 19/93] microblaze: add loglvl to microblaze_unwind() Andrew Morton
2020-06-09  4:30 ` [patch 20/93] microblaze: add show_stack_loglvl() Andrew Morton
2020-06-09  4:30 ` [patch 21/93] mips: " Andrew Morton
2020-06-09  4:31 ` [patch 22/93] nds32: " Andrew Morton
2020-06-09  4:31 ` [patch 23/93] nios2: " Andrew Morton
2020-06-09  4:31 ` [patch 24/93] openrisc: " Andrew Morton
2020-06-09  4:31 ` [patch 25/93] parisc: " Andrew Morton
2020-06-09  4:31 ` [patch 26/93] powerpc: " Andrew Morton
2020-06-09  4:31 ` [patch 27/93] riscv: " Andrew Morton
2020-06-09  4:31 ` [patch 28/93] s390: " Andrew Morton
2020-06-09  4:31 ` [patch 29/93] sh: add loglvl to dump_mem() Andrew Morton
2020-06-09  4:31 ` [patch 30/93] sh: remove needless printk() Andrew Morton
2020-06-09  4:31 ` [patch 31/93] sh: add loglvl to printk_address() Andrew Morton
2020-06-09  4:31 ` [patch 32/93] sh: add loglvl to show_trace() Andrew Morton
2020-06-09  4:31 ` [patch 33/93] sh: add show_stack_loglvl() Andrew Morton
2020-06-09  4:31 ` [patch 34/93] sparc: " Andrew Morton
2020-06-09  4:31 ` [patch 35/93] um/sysrq: remove needless variable sp Andrew Morton
2020-06-09  4:31 ` [patch 36/93] um: add show_stack_loglvl() Andrew Morton
2020-06-09  4:31 ` [patch 37/93] unicore32: remove unused pmode argument in c_backtrace() Andrew Morton
2020-06-09  4:31 ` [patch 38/93] unicore32: add loglvl to c_backtrace() Andrew Morton
2020-06-09  4:31 ` [patch 39/93] unicore32: add show_stack_loglvl() Andrew Morton
2020-06-09  4:31 ` [patch 40/93] x86: add missing const qualifiers for log_lvl Andrew Morton
2020-06-09  4:32 ` [patch 41/93] x86: add show_stack_loglvl() Andrew Morton
2020-06-09  4:32 ` [patch 42/93] xtensa: add loglvl to show_trace() Andrew Morton
2020-06-09  4:32 ` [patch 43/93] xtensa: add show_stack_loglvl() Andrew Morton
2020-06-09  4:32 ` [patch 44/93] sysrq: use show_stack_loglvl() Andrew Morton
2020-06-09  4:32 ` [patch 45/93] x86/amd_gart: print stacktrace for a leak with KERN_ERR Andrew Morton
2020-06-09  4:32 ` [patch 46/93] power: use show_stack_loglvl() Andrew Morton
2020-06-09  4:32 ` [patch 47/93] kdb: don't play with console_loglevel Andrew Morton
2020-06-09  4:32 ` [patch 48/93] sched: print stack trace with KERN_INFO Andrew Morton
2020-06-09  4:32 ` [patch 49/93] kernel: use show_stack_loglvl() Andrew Morton
2020-06-09  4:32 ` [patch 50/93] kernel: rename show_stack_loglvl() => show_stack() Andrew Morton
2020-06-09  4:32 ` [patch 51/93] mm: don't include asm/pgtable.h if linux/mm.h is already included Andrew Morton
2020-06-09  4:32 ` [patch 52/93] mm: introduce include/linux/pgtable.h Andrew Morton
2020-06-09  4:32 ` [patch 53/93] mm: reorder includes after introduction of linux/pgtable.h Andrew Morton
2020-06-09  4:32 ` [patch 54/93] csky: replace definitions of __pXd_offset() with pXd_index() Andrew Morton
2020-06-09  4:32 ` [patch 55/93] m68k/mm/motorola: move comment about page table allocation funcitons Andrew Morton
2020-06-09  4:32 ` [patch 56/93] m68k/mm: move {cache,nocahe}_page() definitions close to their user Andrew Morton
2020-06-09  4:33 ` [patch 57/93] x86/mm: simplify init_trampoline() and surrounding logic Andrew Morton
2020-06-09  4:33 ` [patch 58/93] mm: pgtable: add shortcuts for accessing kernel PMD and PTE Andrew Morton
2020-06-09  4:33 ` [patch 59/93] mm: consolidate pte_index() and pte_offset_*() definitions Andrew Morton
2020-06-09  4:33 ` [patch 60/93] mmap locking API: initial implementation as rwsem wrappers Andrew Morton
2020-06-09  4:33 ` [patch 61/93] MMU notifier: use the new mmap locking API Andrew Morton
2020-06-09  4:33 ` [patch 62/93] DMA reservations: " Andrew Morton
2020-06-09  4:33 ` [patch 63/93] mmap locking API: use coccinelle to convert mmap_sem rwsem call sites Andrew Morton
2020-06-09  4:33 ` [patch 64/93] mmap locking API: convert mmap_sem call sites missed by coccinelle Andrew Morton
2020-06-09  4:33 ` [patch 65/93] mmap locking API: convert nested write lock sites Andrew Morton
2020-06-09  4:33 ` [patch 66/93] mmap locking API: add mmap_read_trylock_non_owner() Andrew Morton
2020-06-09  4:33 ` [patch 67/93] mmap locking API: add MMAP_LOCK_INITIALIZER Andrew Morton
2020-06-09  4:33 ` [patch 68/93] mmap locking API: add mmap_assert_locked() and mmap_assert_write_locked() Andrew Morton
2020-06-09  4:33 ` [patch 69/93] mmap locking API: rename mmap_sem to mmap_lock Andrew Morton
2020-06-09  4:33 ` [patch 70/93] mmap locking API: convert mmap_sem API comments Andrew Morton
2020-06-09  4:33 ` [patch 71/93] mmap locking API: convert mmap_sem comments Andrew Morton
2020-06-09  4:33 ` [patch 72/93] maccess: unexport probe_kernel_write() Andrew Morton
2020-06-09  4:34 ` [patch 73/93] maccess: remove various unused weak aliases Andrew Morton
2020-06-09  4:34 ` [patch 74/93] maccess: remove duplicate kerneldoc comments Andrew Morton
2020-06-09  4:34 ` [patch 75/93] maccess: clarify " Andrew Morton
2020-06-09  4:34 ` [patch 76/93] maccess: update the top of file comment Andrew Morton
2020-06-09  4:34 ` [patch 77/93] maccess: rename strncpy_from_unsafe_user to strncpy_from_user_nofault Andrew Morton
2020-06-09  4:34 ` [patch 78/93] maccess: rename strncpy_from_unsafe_strict to strncpy_from_kernel_nofault Andrew Morton
2020-06-09  4:34 ` [patch 79/93] maccess: rename strnlen_unsafe_user to strnlen_user_nofault Andrew Morton
2020-06-09  4:34 ` [patch 80/93] maccess: remove probe_read_common and probe_write_common Andrew Morton
2020-06-09  4:34 ` [patch 81/93] maccess: unify the probe kernel arch hooks Andrew Morton
2020-06-09  4:34 ` [patch 82/93] bpf: factor out a bpf_trace_copy_string helper Andrew Morton
2020-06-09  4:34 ` [patch 83/93] bpf: handle the compat string in bpf_trace_copy_string better Andrew Morton
2020-06-09  4:34 ` [patch 84/93] bpf:bpf_seq_printf(): handle potentially unsafe format string better Andrew Morton
2020-06-09  4:34 ` [patch 85/93] bpf: rework the compat kernel probe handling Andrew Morton
2020-06-09  4:34 ` [patch 86/93] tracing/kprobes: handle mixed kernel/userspace probes better Andrew Morton
2020-06-09  4:34 ` [patch 87/93] maccess: remove strncpy_from_unsafe Andrew Morton
2020-06-09  4:34 ` [patch 88/93] maccess: always use strict semantics for probe_kernel_read Andrew Morton
2020-06-09  4:34 ` [patch 89/93] maccess: move user access routines together Andrew Morton
2020-06-09  4:34 ` [patch 90/93] maccess: allow architectures to provide kernel probing directly Andrew Morton
2020-06-09  4:35 ` [patch 91/93] x86: use non-set_fs based maccess routines Andrew Morton
2020-06-09  4:35 ` [patch 92/93] maccess: return -ERANGE when probe_kernel_read() fails Andrew Morton
2020-06-09  4:35 ` [patch 93/93] include/linux/cache.h: expand documentation over __read_mostly Andrew Morton
2020-06-09  4:44 ` + linux-next-rejects.patch added to -mm tree Andrew Morton
2020-06-09  5:34 ` mmotm 2020-06-08-22-33 uploaded Andrew Morton
2020-06-09  5:36 ` mmotm 2020-06-08-22-35 uploaded Andrew Morton
2020-06-09 22:26 ` + arch-sparc-mm-srmmuc-fix-build.patch added to -mm tree Andrew Morton
2020-06-09 22:49 ` + lib-fix-bitmap_parse-on-64-bit-big-endian-archs-fix.patch " Andrew Morton
2020-06-09 22:53 ` + scripts-spelling-recommend-blocklist-allowlist-instead-of-blacklist-whitelist.patch " Andrew Morton
2020-06-10  3:59 ` [folded-merged] ipc-convert-ipcs_idr-to-xarray-update.patch removed from " Andrew Morton
2020-06-10  3:59 ` [folded-merged] ipc-convert-ipcs_idr-to-xarray-update-fix.patch " Andrew Morton
2020-06-10  4:00 ` Andrew Morton [this message]
2020-06-10 21:03 ` [to-be-updated] scripts-spelling-recommend-blocklist-allowlist-instead-of-blacklist-whitelist.patch " Andrew Morton
2020-06-10 21:33 ` + arch-powerpc-mm-pgtablec-another-missed-conversion.patch added to " 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=20200610040006.FqEXH90eZ%akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=dave@stgolabs.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=manfred@colorfullife.com \
    --cc=mm-commits@vger.kernel.org \
    --cc=willy@infradead.org \
    /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).