All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: alex.williamson@redhat.com, alexander.h.duyck@linux.intel.com,
	corbet@lwn.net, dan.j.williams@intel.com,
	daniel.m.jordan@oracle.com, dave.hansen@linux.intel.com,
	david@redhat.com, elliott@hpe.com, herbert@gondor.apana.org.au,
	jgg@ziepe.ca, josh@joshtriplett.org, ktkhai@virtuozzo.com,
	mhocko@kernel.org, mm-commits@vger.kernel.org,
	pasha.tatashin@soleen.com, pavel@ucw.cz, peterz@infradead.org,
	rdunlap@infradead.org, shile.zhang@linux.alibaba.com,
	steffen.klassert@secunet.com, steven.sistare@oracle.com,
	tj@kernel.org, ziy@nvidia.com
Subject: + padata-add-basic-support-for-multithreaded-jobs.patch added to -mm tree
Date: Wed, 27 May 2020 14:49:01 -0700	[thread overview]
Message-ID: <20200527214901.n_u65DHf3%akpm@linux-foundation.org> (raw)
In-Reply-To: <20200522222217.ee14ad7eda7aab1e6697da6c@linux-foundation.org>


The patch titled
     Subject: padata: add basic support for multithreaded jobs
has been added to the -mm tree.  Its filename is
     padata-add-basic-support-for-multithreaded-jobs.patch

This patch should soon appear at
    http://ozlabs.org/~akpm/mmots/broken-out/padata-add-basic-support-for-multithreaded-jobs.patch
and later at
    http://ozlabs.org/~akpm/mmotm/broken-out/padata-add-basic-support-for-multithreaded-jobs.patch

Before you just go and hit "reply", please:
   a) Consider who else should be cc'ed
   b) Prefer to cc a suitable mailing list as well
   c) Ideally: find the original patch on the mailing list and do a
      reply-to-all to that, adding suitable additional cc's

*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***

The -mm tree is included into linux-next and is updated
there every 3-4 working days

------------------------------------------------------
From: Daniel Jordan <daniel.m.jordan@oracle.com>
Subject: padata: add basic support for multithreaded jobs

Sometimes the kernel doesn't take full advantage of system memory
bandwidth, leading to a single CPU spending excessive time in
initialization paths where the data scales with memory size.

Multithreading naturally addresses this problem.

Extend padata, a framework that handles many parallel yet singlethreaded
jobs, to also handle multithreaded jobs by adding support for splitting up
the work evenly, specifying a minimum amount of work that's appropriate
for one helper thread to do, load balancing between helpers, and
coordinating them.

This is inspired by work from Pavel Tatashin and Steve Sistare.

Link: http://lkml.kernel.org/r/20200527173608.2885243-5-daniel.m.jordan@oracle.com
Signed-off-by: Daniel Jordan <daniel.m.jordan@oracle.com>
Tested-by: Josh Triplett <josh@joshtriplett.org>
Cc: Alexander Duyck <alexander.h.duyck@linux.intel.com>
Cc: Alex Williamson <alex.williamson@redhat.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Kirill Tkhai <ktkhai@virtuozzo.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: Robert Elliott <elliott@hpe.com>
Cc: Shile Zhang <shile.zhang@linux.alibaba.com>
Cc: Steffen Klassert <steffen.klassert@secunet.com>
Cc: Steven Sistare <steven.sistare@oracle.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 include/linux/padata.h |   29 +++++++
 kernel/padata.c        |  152 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 178 insertions(+), 3 deletions(-)

--- a/include/linux/padata.h~padata-add-basic-support-for-multithreaded-jobs
+++ a/include/linux/padata.h
@@ -4,6 +4,9 @@
  *
  * Copyright (C) 2008, 2009 secunet Security Networks AG
  * Copyright (C) 2008, 2009 Steffen Klassert <steffen.klassert@secunet.com>
+ *
+ * Copyright (c) 2020 Oracle and/or its affiliates.
+ * Author: Daniel Jordan <daniel.m.jordan@oracle.com>
  */
 
 #ifndef PADATA_H
@@ -131,6 +134,31 @@ struct padata_shell {
 };
 
 /**
+ * struct padata_mt_job - represents one multithreaded job
+ *
+ * @thread_fn: Called for each chunk of work that a padata thread does.
+ * @fn_arg: The thread function argument.
+ * @start: The start of the job (units are job-specific).
+ * @size: size of this node's work (units are job-specific).
+ * @align: Ranges passed to the thread function fall on this boundary, with the
+ *         possible exceptions of the beginning and end of the job.
+ * @min_chunk: The minimum chunk size in job-specific units.  This allows
+ *             the client to communicate the minimum amount of work that's
+ *             appropriate for one worker thread to do at once.
+ * @max_threads: Max threads to use for the job, actual number may be less
+ *               depending on task size and minimum chunk size.
+ */
+struct padata_mt_job {
+	void (*thread_fn)(unsigned long start, unsigned long end, void *arg);
+	void			*fn_arg;
+	unsigned long		start;
+	unsigned long		size;
+	unsigned long		align;
+	unsigned long		min_chunk;
+	int			max_threads;
+};
+
+/**
  * struct padata_instance - The overall control structure.
  *
  * @node: Used by CPU hotplug.
@@ -171,6 +199,7 @@ extern void padata_free_shell(struct pad
 extern int padata_do_parallel(struct padata_shell *ps,
 			      struct padata_priv *padata, int *cb_cpu);
 extern void padata_do_serial(struct padata_priv *padata);
+extern void __init padata_do_multithreaded(struct padata_mt_job *job);
 extern int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
 			      cpumask_var_t cpumask);
 extern int padata_start(struct padata_instance *pinst);
--- a/kernel/padata.c~padata-add-basic-support-for-multithreaded-jobs
+++ a/kernel/padata.c
@@ -7,6 +7,9 @@
  * Copyright (C) 2008, 2009 secunet Security Networks AG
  * Copyright (C) 2008, 2009 Steffen Klassert <steffen.klassert@secunet.com>
  *
+ * Copyright (c) 2020 Oracle and/or its affiliates.
+ * Author: Daniel Jordan <daniel.m.jordan@oracle.com>
+ *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
  * version 2, as published by the Free Software Foundation.
@@ -21,6 +24,7 @@
  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#include <linux/completion.h>
 #include <linux/export.h>
 #include <linux/cpumask.h>
 #include <linux/err.h>
@@ -32,6 +36,8 @@
 #include <linux/sysfs.h>
 #include <linux/rcupdate.h>
 
+#define	PADATA_WORK_ONSTACK	1	/* Work's memory is on stack */
+
 struct padata_work {
 	struct work_struct	pw_work;
 	struct list_head	pw_list;  /* padata_free_works linkage */
@@ -42,7 +48,17 @@ static DEFINE_SPINLOCK(padata_works_lock
 static struct padata_work *padata_works;
 static LIST_HEAD(padata_free_works);
 
+struct padata_mt_job_state {
+	spinlock_t		lock;
+	struct completion	completion;
+	struct padata_mt_job	*job;
+	int			nworks;
+	int			nworks_fini;
+	unsigned long		chunk_size;
+};
+
 static void padata_free_pd(struct parallel_data *pd);
+static void __init padata_mt_helper(struct work_struct *work);
 
 static int padata_index_to_cpu(struct parallel_data *pd, int cpu_index)
 {
@@ -81,18 +97,56 @@ static struct padata_work *padata_work_a
 }
 
 static void padata_work_init(struct padata_work *pw, work_func_t work_fn,
-			     void *data)
+			     void *data, int flags)
 {
-	INIT_WORK(&pw->pw_work, work_fn);
+	if (flags & PADATA_WORK_ONSTACK)
+		INIT_WORK_ONSTACK(&pw->pw_work, work_fn);
+	else
+		INIT_WORK(&pw->pw_work, work_fn);
 	pw->pw_data = data;
 }
 
+static int __init padata_work_alloc_mt(int nworks, void *data,
+				       struct list_head *head)
+{
+	int i;
+
+	spin_lock(&padata_works_lock);
+	/* Start at 1 because the current task participates in the job. */
+	for (i = 1; i < nworks; ++i) {
+		struct padata_work *pw = padata_work_alloc();
+
+		if (!pw)
+			break;
+		padata_work_init(pw, padata_mt_helper, data, 0);
+		list_add(&pw->pw_list, head);
+	}
+	spin_unlock(&padata_works_lock);
+
+	return i;
+}
+
 static void padata_work_free(struct padata_work *pw)
 {
 	lockdep_assert_held(&padata_works_lock);
 	list_add(&pw->pw_list, &padata_free_works);
 }
 
+static void __init padata_works_free(struct list_head *works)
+{
+	struct padata_work *cur, *next;
+
+	if (list_empty(works))
+		return;
+
+	spin_lock(&padata_works_lock);
+	list_for_each_entry_safe(cur, next, works, pw_list) {
+		list_del(&cur->pw_list);
+		padata_work_free(cur);
+	}
+	spin_unlock(&padata_works_lock);
+}
+
 static void padata_parallel_worker(struct work_struct *parallel_work)
 {
 	struct padata_work *pw = container_of(parallel_work, struct padata_work,
@@ -168,7 +222,7 @@ int padata_do_parallel(struct padata_she
 	pw = padata_work_alloc();
 	spin_unlock(&padata_works_lock);
 	if (pw) {
-		padata_work_init(pw, padata_parallel_worker, padata);
+		padata_work_init(pw, padata_parallel_worker, padata, 0);
 		queue_work(pinst->parallel_wq, &pw->pw_work);
 	} else {
 		/* Maximum works limit exceeded, run in the current task. */
@@ -409,6 +463,98 @@ out:
 	return err;
 }
 
+static void __init padata_mt_helper(struct work_struct *w)
+{
+	struct padata_work *pw = container_of(w, struct padata_work, pw_work);
+	struct padata_mt_job_state *ps = pw->pw_data;
+	struct padata_mt_job *job = ps->job;
+	bool done;
+
+	spin_lock(&ps->lock);
+
+	while (job->size > 0) {
+		unsigned long start, size, end;
+
+		start = job->start;
+		/* So end is chunk size aligned if enough work remains. */
+		size = roundup(start + 1, ps->chunk_size) - start;
+		size = min(size, job->size);
+		end = start + size;
+
+		job->start = end;
+		job->size -= size;
+
+		spin_unlock(&ps->lock);
+		job->thread_fn(start, end, job->fn_arg);
+		spin_lock(&ps->lock);
+	}
+
+	++ps->nworks_fini;
+	done = (ps->nworks_fini == ps->nworks);
+	spin_unlock(&ps->lock);
+
+	if (done)
+		complete(&ps->completion);
+}
+
+/**
+ * padata_do_multithreaded - run a multithreaded job
+ * @job: Description of the job.
+ *
+ * See the definition of struct padata_mt_job for more details.
+ */
+void __init padata_do_multithreaded(struct padata_mt_job *job)
+{
+	/* In case threads finish at different times. */
+	static const unsigned long load_balance_factor = 4;
+	struct padata_work my_work, *pw;
+	struct padata_mt_job_state ps;
+	LIST_HEAD(works);
+	int nworks;
+
+	if (job->size == 0)
+		return;
+
+	/* Ensure at least one thread when size < min_chunk. */
+	nworks = max(job->size / job->min_chunk, 1ul);
+	nworks = min(nworks, job->max_threads);
+
+	if (nworks == 1) {
+		/* Single thread, no coordination needed, cut to the chase. */
+		job->thread_fn(job->start, job->start + job->size, job->fn_arg);
+		return;
+	}
+
+	spin_lock_init(&ps.lock);
+	init_completion(&ps.completion);
+	ps.job	       = job;
+	ps.nworks      = padata_work_alloc_mt(nworks, &ps, &works);
+	ps.nworks_fini = 0;
+
+	/*
+	 * Chunk size is the amount of work a helper does per call to the
+	 * thread function.  Load balance large jobs between threads by
+	 * increasing the number of chunks, guarantee at least the minimum
+	 * chunk size from the caller, and honor the caller's alignment.
+	 */
+	ps.chunk_size = job->size / (ps.nworks * load_balance_factor);
+	ps.chunk_size = max(ps.chunk_size, job->min_chunk);
+	ps.chunk_size = roundup(ps.chunk_size, job->align);
+
+	list_for_each_entry(pw, &works, pw_list)
+		queue_work(system_unbound_wq, &pw->pw_work);
+
+	/* Use the current thread, which saves starting a workqueue worker. */
+	padata_work_init(&my_work, padata_mt_helper, &ps, PADATA_WORK_ONSTACK);
+	padata_mt_helper(&my_work.pw_work);
+
+	/* Wait for all the helpers to finish. */
+	wait_for_completion(&ps.completion);
+
+	destroy_work_on_stack(&my_work.pw_work);
+	padata_works_free(&works);
+}
+
 static void __padata_list_init(struct padata_list *pd_list)
 {
 	INIT_LIST_HEAD(&pd_list->list);
_

Patches currently in -mm which might be from daniel.m.jordan@oracle.com are

mm-call-touch_nmi_watchdog-on-max-order-boundaries-in-deferred-init.patch
padata-remove-exit-routine.patch
padata-initialize-earlier.patch
padata-allocate-work-structures-for-parallel-jobs-from-a-pool.patch
padata-add-basic-support-for-multithreaded-jobs.patch
mm-dont-track-number-of-pages-during-deferred-initialization.patch
mm-parallelize-deferred_init_memmap.patch
mm-make-deferred-inits-max-threads-arch-specific.patch
padata-document-multithreaded-jobs.patch

  parent reply	other threads:[~2020-05-27 21:49 UTC|newest]

Thread overview: 94+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-23  5:22 incoming Andrew Morton
2020-05-23  5:22 ` [patch 01/11] device-dax: don't leak kernel memory to user space after unloading kmem Andrew Morton
2020-05-23  5:22 ` [patch 02/11] x86: bitops: fix build regression Andrew Morton
2020-05-23  5:22 ` [patch 03/11] rapidio: fix an error in get_user_pages_fast() error handling Andrew Morton
2020-05-23  5:22 ` [patch 04/11] selftests/vm/.gitignore: add mremap_dontunmap Andrew Morton
2020-05-23  5:22 ` [patch 05/11] selftests/vm/write_to_hugetlbfs.c: fix unused variable warning Andrew Morton
2020-05-23  5:22 ` [patch 06/11] kasan: disable branch tracing for core runtime Andrew Morton
2020-05-23  5:23 ` [patch 07/11] sh: include linux/time_types.h for sockios Andrew Morton
2020-05-23  5:23 ` [patch 08/11] MAINTAINERS: update email address for Naoya Horiguchi Andrew Morton
2020-05-23  5:23 ` [patch 09/11] sparc32: use PUD rather than PGD to get PMD in srmmu_nocache_init() Andrew Morton
2020-05-23 19:01   ` Mike Rapoport
2020-05-23 19:10     ` Linus Torvalds
2020-05-23 19:10       ` Linus Torvalds
2020-05-23 19:57       ` Mike Rapoport
2020-05-23  5:23 ` [patch 10/11] z3fold: fix use-after-free when freeing handles Andrew Morton
2020-05-23  5:23 ` [patch 11/11] MAINTAINERS: add files related to kdump Andrew Morton
2020-05-25  0:06 ` + bitops-simplify-get_count_order_long.patch added to -mm tree Andrew Morton
2020-05-25  0:08 ` + mmthp-stop-leaking-unreleased-file-pages.patch " Andrew Morton
2020-05-25  0:45 ` + mmap-locking-api-convert-mmap_sem-comments-fix-fix-fix.patch " Andrew Morton
2020-05-25  0:49 ` + mm-remove-vm_bug_onpageslab-from-page_mapcount.patch " Andrew Morton
2020-05-25  0:49   ` Andrew Morton
2020-05-25  0:57 ` + swap-reduce-lock-contention-on-swap-cache-from-swap-slots-allocation-v3.patch " Andrew Morton
2020-05-25  5:10 ` mmotm 2020-05-24-22-09 uploaded Andrew Morton
2020-05-25  5:10 ` Andrew Morton
2020-05-25 20:01 ` + khugepaged-allow-to-collapse-a-page-shared-across-fork-fix-fix.patch added to -mm tree Andrew Morton
2020-05-25 20:19 ` + x86-mm-simplify-init_trampoline-and-surrounding-logic-fix.patch " Andrew Morton
2020-05-25 20:41 ` + lib-make-a-test-module-with-set-clear-bit.patch " Andrew Morton
2020-05-25 20:57 ` + mm-gupc-convert-to-use-get_user_pagepages_fast_only.patch " Andrew Morton
2020-05-25 21:11 ` + mm-remove-vm_bug_onpageslab-from-page_mapcount-fix.patch " Andrew Morton
2020-05-25 21:55 ` + mm_typesh-change-set_page_private-to-inline-function.patch " Andrew Morton
2020-05-25 23:57 ` mmotm 2020-05-25-16-56 uploaded Andrew Morton
2020-05-26  3:49   ` mmotm 2020-05-25-16-56 uploaded (drm/nouveau) Randy Dunlap
2020-05-26  3:49     ` Randy Dunlap
2020-05-26  4:23     ` Dave Airlie
2020-05-26  4:23       ` Dave Airlie
2020-05-26  4:23       ` Dave Airlie
2020-05-26  4:31       ` Randy Dunlap
2020-05-26  4:31         ` Randy Dunlap
2020-05-26  6:56   ` mmotm 2020-05-25-16-56 uploaded (mtd/nand/raw/arasan-nand-controller) Randy Dunlap
2020-05-26 19:37     ` Miquel Raynal
2020-05-26 21:18 ` [failures] proc-meminfo-avoid-open-coded-reading-of-vm_committed_as.patch removed from -mm tree Andrew Morton
2020-05-26 21:18 ` [failures] mm-utilc-make-vm_memory_committed-more-accurate.patch " Andrew Morton
2020-05-26 21:18 ` [failures] mm-adjust-vm_committed_as_batch-according-to-vm-overcommit-policy.patch " Andrew Morton
2020-05-27 19:12 ` + mm-swap-fix-vmstats-for-huge-pages.patch added to " Andrew Morton
2020-05-27 19:12 ` + mm-swap-memcg-fix-memcg-stats-for-huge-pages.patch " Andrew Morton
2020-05-27 21:33 ` + mm-prepare-for-swap-over-high-accounting-and-penalty-calculation.patch " Andrew Morton
2020-05-27 21:33 ` + mm-move-penalty-delay-clamping-out-of-calculate_high_delay.patch " Andrew Morton
2020-05-27 21:33 ` + mm-move-cgroup-high-memory-limit-setting-into-struct-page_counter.patch " Andrew Morton
2020-05-27 21:33 ` + mm-automatically-penalize-tasks-with-high-swap-use.patch " Andrew Morton
2020-05-27 21:36 ` + mm-gup-update-pin_user_pagesrst-for-case-3-mmu-notifiers.patch " Andrew Morton
2020-05-27 21:48 ` + padata-remove-exit-routine.patch " Andrew Morton
2020-05-27 21:48 ` + padata-initialize-earlier.patch " Andrew Morton
2020-05-27 21:48 ` + padata-allocate-work-structures-for-parallel-jobs-from-a-pool.patch " Andrew Morton
2020-05-27 21:49 ` Andrew Morton [this message]
2020-05-27 21:49 ` + mm-dont-track-number-of-pages-during-deferred-initialization.patch " Andrew Morton
2020-05-27 21:49 ` + mm-parallelize-deferred_init_memmap.patch " Andrew Morton
2020-05-27 21:49 ` + mm-make-deferred-inits-max-threads-arch-specific.patch " Andrew Morton
2020-05-27 21:49 ` + padata-document-multithreaded-jobs.patch " Andrew Morton
2020-05-27 21:55 ` + cpumask-guard-cpumask_of_node-macro-argument.patch " Andrew Morton
2020-05-27 22:15 ` + sparc32-register-memory-occupied-by-kernel-as-memblockmemory.patch " Andrew Morton
2020-05-27 22:32 ` + x86-mm-ptdump-calculate-effective-permissions-correctly-fix.patch " Andrew Morton
2020-05-27 22:55 ` + ocfs2-clear-links-count-in-ocfs2_mknod-if-an-error-occurs.patch " Andrew Morton
2020-05-27 22:55 ` + ocfs2-fix-ocfs2-corrupt-when-iputting-an-inode.patch " Andrew Morton
2020-05-27 23:17 ` + mm-gup-introduce-pin_user_pages_locked.patch " Andrew Morton
2020-05-27 23:17 ` + mm-gup-frame_vector-convert-get_user_pages-pin_user_pages.patch " Andrew Morton
2020-05-27 23:52 ` + mm-memory_failure-only-send-bus_mceerr_ao-to-early-kill-process.patch " Andrew Morton
2020-05-28  0:10 ` + relay-handle-alloc_percpu-returning-null-in-relay_open.patch " Andrew Morton
2020-05-28  0:16 ` + xtensa-implement-flush_icache_user_range-fix.patch " Andrew Morton
2020-05-28  0:36 ` + maccess-unexport-probe_kernel_write-and-probe_user_write.patch " Andrew Morton
2020-05-28  0:36 ` + maccess-remove-various-unused-weak-aliases.patch " Andrew Morton
2020-05-28  0:36 ` + maccess-remove-duplicate-kerneldoc-comments.patch " Andrew Morton
2020-05-28  0:36 ` + maccess-clarify-kerneldoc-comments.patch " Andrew Morton
2020-05-28  0:37 ` + maccess-update-the-top-of-file-comment.patch " Andrew Morton
2020-05-28  0:37 ` + maccess-rename-strncpy_from_unsafe_user-to-strncpy_from_user_nofault.patch " Andrew Morton
2020-05-28  0:37 ` + maccess-rename-strncpy_from_unsafe_strict-to-strncpy_from_kernel_nofault.patch " Andrew Morton
2020-05-28  0:37 ` + maccess-rename-strnlen_unsafe_user-to-strnlen_user_nofault.patch " Andrew Morton
2020-05-28  0:37 ` + maccess-remove-probe_read_common-and-probe_write_common.patch " Andrew Morton
2020-05-28  0:37 ` + maccess-unify-the-probe-kernel-arch-hooks.patch " Andrew Morton
2020-05-28  0:37 ` + bpf-factor-out-a-bpf_trace_copy_string-helper.patch " Andrew Morton
2020-05-28  0:37 ` + bpf-handle-the-compat-string-in-bpf_trace_copy_string-better.patch " Andrew Morton
2020-05-28  0:37 ` + bpf-rework-the-compat-kernel-probe-handling.patch " Andrew Morton
2020-05-28  0:37 ` + tracing-kprobes-handle-mixed-kernel-userspace-probes-better.patch " Andrew Morton
2020-05-28  0:37 ` + maccess-remove-strncpy_from_unsafe.patch " Andrew Morton
2020-05-28  0:37 ` + maccess-always-use-strict-semantics-for-probe_kernel_read.patch " Andrew Morton
2020-05-28  0:37 ` + maccess-move-user-access-routines-together.patch " Andrew Morton
2020-05-28  0:37 ` + maccess-allow-architectures-to-provide-kernel-probing-directly.patch " Andrew Morton
2020-05-28  0:37 ` + x86-use-non-set_fs-based-maccess-routines.patch " Andrew Morton
2020-05-28  0:37 ` + maccess-return-erange-when-copy_from_kernel_nofault_allowed-fails.patch " Andrew Morton
2020-05-28  0:45 ` + x86-use-non-set_fs-based-maccess-routines-checkpatch-fixes.patch " Andrew Morton
2020-05-28  0:55 ` + maccess-unify-the-probe-kernel-arch-hooks-fix.patch " Andrew Morton
2020-05-28  1:02 ` + maccess-always-use-strict-semantics-for-probe_kernel_read-fix.patch " Andrew Morton
2020-05-28  2:04 ` + bpf-bpf_seq_printf-handle-potentially-unsafe-format-string-better.patch " Andrew Morton
2020-05-28  3:09 ` [to-be-updated] mm-memory_failure-only-send-bus_mceerr_ao-to-early-kill-process.patch removed from " Andrew Morton
  -- strict thread matches above, loose matches on Subject: below --
2020-05-14  0:50 incoming Andrew Morton
2020-05-20 23:31 ` + padata-add-basic-support-for-multithreaded-jobs.patch added to -mm tree 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=20200527214901.n_u65DHf3%akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=alex.williamson@redhat.com \
    --cc=alexander.h.duyck@linux.intel.com \
    --cc=corbet@lwn.net \
    --cc=dan.j.williams@intel.com \
    --cc=daniel.m.jordan@oracle.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=david@redhat.com \
    --cc=elliott@hpe.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=jgg@ziepe.ca \
    --cc=josh@joshtriplett.org \
    --cc=ktkhai@virtuozzo.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhocko@kernel.org \
    --cc=mm-commits@vger.kernel.org \
    --cc=pasha.tatashin@soleen.com \
    --cc=pavel@ucw.cz \
    --cc=peterz@infradead.org \
    --cc=rdunlap@infradead.org \
    --cc=shile.zhang@linux.alibaba.com \
    --cc=steffen.klassert@secunet.com \
    --cc=steven.sistare@oracle.com \
    --cc=tj@kernel.org \
    --cc=ziy@nvidia.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.