All of lore.kernel.org
 help / color / mirror / Atom feed
From: Petr Mladek <pmladek@suse.cz>
To: Andrew Morton <akpm@linux-foundation.org>,
	Oleg Nesterov <oleg@redhat.com>, Tejun Heo <tj@kernel.org>,
	Ingo Molnar <mingo@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>
Cc: Richard Weinberger <richard@nod.at>,
	Steven Rostedt <rostedt@goodmis.org>,
	David Woodhouse <dwmw2@infradead.org>,
	linux-mtd@lists.infradead.org,
	Trond Myklebust <trond.myklebust@primarydata.com>,
	Anna Schumaker <anna.schumaker@netapp.com>,
	linux-nfs@vger.kernel.org, Chris Mason <clm@fb.com>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Jiri Kosina <jkosina@suse.cz>, Borislav Petkov <bp@suse.de>,
	Michal Hocko <mhocko@suse.cz>,
	live-patching@vger.kernel.org, linux-api@vger.kernel.org,
	linux-kernel@vger.kernel.org, Petr Mladek <pmladek@suse.cz>
Subject: [RFC PATCH 09/18] kthread: Make it easier to correctly sleep in iterant kthreads
Date: Fri,  5 Jun 2015 17:01:08 +0200	[thread overview]
Message-ID: <1433516477-5153-10-git-send-email-pmladek@suse.cz> (raw)
In-Reply-To: <1433516477-5153-1-git-send-email-pmladek@suse.cz>

Many kthreads go into an interruptible sleep when there is nothing
to do. They should check if anyone did not requested the kthread
to terminate, freeze, or park in the meantime. It is easy to do
it a wrong way.

This patch adds an API to do the sleep easier and correct way.
The big advantage is that we will have all the checks on a single
place and will be able to fix all broken threads easily.

We need two steps. set_current_state(TASK_INTERRUPTIBLE)
is typically called under some lock together with a check for
a pending work. While schedule() has to be called outside
the lock.

We use the freezable variants of kthread_should_stop(), schedule(),
and cond_resched(). They are needed in freezable kthreads and they
do the right job also in non-freezable ones.

The API is ready to support more sleeping variants, e.g.
wait_event_freezable(), wait_event_freezable_timeout(). Well,
we will need to add some more items into the struct kthread_iterant
for them.

Signed-off-by: Petr Mladek <pmladek@suse.cz>
---
 include/linux/kthread.h | 13 +++++++++
 kernel/kthread.c        | 76 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+)

diff --git a/include/linux/kthread.h b/include/linux/kthread.h
index 100c1e006729..415178c20cde 100644
--- a/include/linux/kthread.h
+++ b/include/linux/kthread.h
@@ -48,14 +48,25 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data),
  * must be released and non-interruptible work finished.
  */
 
+/* Flags that modify the default behavior of iterant kthreads. */
+/* Reset pause flags for the next iteration. */
+#define KTI_PAUSE_ONCE		0x00000001
+/* Do interruptible sleep between iterations. */
+#define KTI_INT_SLEEP		0x00000002
+
+#define KTI_PAUSE_MASK		(KTI_INT_SLEEP | \
+				 KTI_PAUSE_ONCE)
+
 /**
  * struct kthread_iterant - structure describing the function of the kthread
+ * @type: modifies the kthread behavior using extra flags.
  * @data: pointer to a data passed to the functions.
  * @init: function called when the kthread is created.
  * @func: function called in the main cycle until the kthread is terminated.
  * @destroy: function called when the kthread is being terminated.
  */
 struct kthread_iterant {
+	unsigned int type;
 	void *data;
 	void (*init)(void *data);
 	void (*func)(void *data);
@@ -85,6 +96,8 @@ kthread_iterant_create_on_cpu(struct kthread_iterant *kti,
 	__k;								   \
 })
 
+void set_kthread_iterant_int_sleep(void);
+
 void kthread_bind(struct task_struct *k, unsigned int cpu);
 void kthread_stop_current(void);
 int kthread_stop(struct task_struct *k);
diff --git a/kernel/kthread.c b/kernel/kthread.c
index 41fb6a43a1f1..fa40fb549e22 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -414,6 +414,80 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data),
 }
 
 /**
+ * set_kthread_iterant_pause_type - set the type of the pause before
+ *	the next iteration
+ * @type: flags that define the type of the pause; they are the same
+ *	  as the flags used for @type in struct kthread_iterant
+ */
+static void set_kthread_iterant_pause_type(struct kthread_iterant *kti,
+					   unsigned int type)
+{
+	WARN_ONCE(type & ~KTI_PAUSE_MASK,
+		  "unknown pause type: 0x%x\n", type);
+	type &= KTI_PAUSE_MASK;
+
+	kti->type &= ~KTI_PAUSE_MASK;
+	kti->type |= type;
+	/* this function set the pause only for the next iteration */
+	kti->type |= KTI_PAUSE_ONCE;
+}
+
+/**
+ * set_kthread_iterant_int_sleep - do interruptible sleep before
+ *	the next iteration
+ *
+ * This function is typically called under a lock when the main func()
+ * checks for the pending work.
+ *
+ * Kthreads should pause between iterations only when there is no work,
+ * signal pending, freezing, parking, or termination. We want to do most
+ * of these checks properly on a single place: kthread_iterant_fn().
+ * Only the checks for pending work need to be done in the main func()
+ * because they are not generic.
+ */
+void set_kthread_iterant_int_sleep(void)
+{
+	struct kthread_iterant *kti = to_kthread_iterant(current);
+
+	set_kthread_iterant_pause_type(kti, KTI_INT_SLEEP);
+	set_current_state(TASK_INTERRUPTIBLE);
+}
+EXPORT_SYMBOL(set_kthread_iterant_int_sleep);
+
+/**
+ * do_kthread_iterant_pause - do the selected pause before next iteration
+ *
+ * Most kthreads sleep or wait between iterations. This function
+ * allows to do it the right way. The particular pause variant
+ * is defined by @type flags in struct kthread_iterant. Anyway,
+ * this is a safe place to call cond_resched().
+ */
+static void do_kthread_iterant_pause(struct kthread_iterant *kti)
+{
+	unsigned int type = kti->type;
+
+	/*
+	 * Explicitly set the task state when it was not set by
+	 * set_kthread_iterant_int_sleep*() functions.
+	 */
+	if (!(type & KTI_PAUSE_ONCE) && (type & KTI_INT_SLEEP))
+		set_current_state(TASK_INTERRUPTIBLE);
+
+	if (kthread_freezable_should_stop(NULL)) {
+		set_current_state(TASK_RUNNING);
+		return;
+	}
+
+	if (type & KTI_INT_SLEEP)
+		freezable_schedule();
+	else
+		freezable_cond_resched();
+
+	if (type & KTI_PAUSE_ONCE)
+		kti->type &= ~KTI_PAUSE_MASK;
+}
+
+/**
  * kthread_iterant_fn - kthread function to process an iterant kthread
  * @kti_ptr: pointer to an initialized struct kthread_iterant.
  *
@@ -443,6 +517,8 @@ static int kthread_iterant_fn(void *kti_ptr)
 		if (kti->func)
 			kti->func(data);
 
+		do_kthread_iterant_pause(kti);
+
 		if (signal_pending(current))
 			kthread_do_signal();
 
-- 
1.8.5.6


WARNING: multiple messages have this Message-ID (diff)
From: Petr Mladek <pmladek@suse.cz>
To: Andrew Morton <akpm@linux-foundation.org>,
	Oleg Nesterov <oleg@redhat.com>, Tejun Heo <tj@kernel.org>,
	Ingo Molnar <mingo@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>
Cc: linux-nfs@vger.kernel.org, Borislav Petkov <bp@suse.de>,
	Jiri Kosina <jkosina@suse.cz>,
	Richard Weinberger <richard@nod.at>,
	Trond Myklebust <trond.myklebust@primarydata.com>,
	linux-kernel@vger.kernel.org,
	Steven Rostedt <rostedt@goodmis.org>,
	Michal Hocko <mhocko@suse.cz>, Chris Mason <clm@fb.com>,
	Petr Mladek <pmladek@suse.cz>,
	linux-mtd@lists.infradead.org, linux-api@vger.kernel.org,
	Linus Torvalds <torvalds@linux-foundation.org>,
	live-patching@vger.kernel.org,
	Thomas Gleixner <tglx@linutronix.de>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
	David Woodhouse <dwmw2@infradead.org>,
	Anna Schumaker <anna.schumaker@netapp.com>
Subject: [RFC PATCH 09/18] kthread: Make it easier to correctly sleep in iterant kthreads
Date: Fri,  5 Jun 2015 17:01:08 +0200	[thread overview]
Message-ID: <1433516477-5153-10-git-send-email-pmladek@suse.cz> (raw)
In-Reply-To: <1433516477-5153-1-git-send-email-pmladek@suse.cz>

Many kthreads go into an interruptible sleep when there is nothing
to do. They should check if anyone did not requested the kthread
to terminate, freeze, or park in the meantime. It is easy to do
it a wrong way.

This patch adds an API to do the sleep easier and correct way.
The big advantage is that we will have all the checks on a single
place and will be able to fix all broken threads easily.

We need two steps. set_current_state(TASK_INTERRUPTIBLE)
is typically called under some lock together with a check for
a pending work. While schedule() has to be called outside
the lock.

We use the freezable variants of kthread_should_stop(), schedule(),
and cond_resched(). They are needed in freezable kthreads and they
do the right job also in non-freezable ones.

The API is ready to support more sleeping variants, e.g.
wait_event_freezable(), wait_event_freezable_timeout(). Well,
we will need to add some more items into the struct kthread_iterant
for them.

Signed-off-by: Petr Mladek <pmladek@suse.cz>
---
 include/linux/kthread.h | 13 +++++++++
 kernel/kthread.c        | 76 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+)

diff --git a/include/linux/kthread.h b/include/linux/kthread.h
index 100c1e006729..415178c20cde 100644
--- a/include/linux/kthread.h
+++ b/include/linux/kthread.h
@@ -48,14 +48,25 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data),
  * must be released and non-interruptible work finished.
  */
 
+/* Flags that modify the default behavior of iterant kthreads. */
+/* Reset pause flags for the next iteration. */
+#define KTI_PAUSE_ONCE		0x00000001
+/* Do interruptible sleep between iterations. */
+#define KTI_INT_SLEEP		0x00000002
+
+#define KTI_PAUSE_MASK		(KTI_INT_SLEEP | \
+				 KTI_PAUSE_ONCE)
+
 /**
  * struct kthread_iterant - structure describing the function of the kthread
+ * @type: modifies the kthread behavior using extra flags.
  * @data: pointer to a data passed to the functions.
  * @init: function called when the kthread is created.
  * @func: function called in the main cycle until the kthread is terminated.
  * @destroy: function called when the kthread is being terminated.
  */
 struct kthread_iterant {
+	unsigned int type;
 	void *data;
 	void (*init)(void *data);
 	void (*func)(void *data);
@@ -85,6 +96,8 @@ kthread_iterant_create_on_cpu(struct kthread_iterant *kti,
 	__k;								   \
 })
 
+void set_kthread_iterant_int_sleep(void);
+
 void kthread_bind(struct task_struct *k, unsigned int cpu);
 void kthread_stop_current(void);
 int kthread_stop(struct task_struct *k);
diff --git a/kernel/kthread.c b/kernel/kthread.c
index 41fb6a43a1f1..fa40fb549e22 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -414,6 +414,80 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data),
 }
 
 /**
+ * set_kthread_iterant_pause_type - set the type of the pause before
+ *	the next iteration
+ * @type: flags that define the type of the pause; they are the same
+ *	  as the flags used for @type in struct kthread_iterant
+ */
+static void set_kthread_iterant_pause_type(struct kthread_iterant *kti,
+					   unsigned int type)
+{
+	WARN_ONCE(type & ~KTI_PAUSE_MASK,
+		  "unknown pause type: 0x%x\n", type);
+	type &= KTI_PAUSE_MASK;
+
+	kti->type &= ~KTI_PAUSE_MASK;
+	kti->type |= type;
+	/* this function set the pause only for the next iteration */
+	kti->type |= KTI_PAUSE_ONCE;
+}
+
+/**
+ * set_kthread_iterant_int_sleep - do interruptible sleep before
+ *	the next iteration
+ *
+ * This function is typically called under a lock when the main func()
+ * checks for the pending work.
+ *
+ * Kthreads should pause between iterations only when there is no work,
+ * signal pending, freezing, parking, or termination. We want to do most
+ * of these checks properly on a single place: kthread_iterant_fn().
+ * Only the checks for pending work need to be done in the main func()
+ * because they are not generic.
+ */
+void set_kthread_iterant_int_sleep(void)
+{
+	struct kthread_iterant *kti = to_kthread_iterant(current);
+
+	set_kthread_iterant_pause_type(kti, KTI_INT_SLEEP);
+	set_current_state(TASK_INTERRUPTIBLE);
+}
+EXPORT_SYMBOL(set_kthread_iterant_int_sleep);
+
+/**
+ * do_kthread_iterant_pause - do the selected pause before next iteration
+ *
+ * Most kthreads sleep or wait between iterations. This function
+ * allows to do it the right way. The particular pause variant
+ * is defined by @type flags in struct kthread_iterant. Anyway,
+ * this is a safe place to call cond_resched().
+ */
+static void do_kthread_iterant_pause(struct kthread_iterant *kti)
+{
+	unsigned int type = kti->type;
+
+	/*
+	 * Explicitly set the task state when it was not set by
+	 * set_kthread_iterant_int_sleep*() functions.
+	 */
+	if (!(type & KTI_PAUSE_ONCE) && (type & KTI_INT_SLEEP))
+		set_current_state(TASK_INTERRUPTIBLE);
+
+	if (kthread_freezable_should_stop(NULL)) {
+		set_current_state(TASK_RUNNING);
+		return;
+	}
+
+	if (type & KTI_INT_SLEEP)
+		freezable_schedule();
+	else
+		freezable_cond_resched();
+
+	if (type & KTI_PAUSE_ONCE)
+		kti->type &= ~KTI_PAUSE_MASK;
+}
+
+/**
  * kthread_iterant_fn - kthread function to process an iterant kthread
  * @kti_ptr: pointer to an initialized struct kthread_iterant.
  *
@@ -443,6 +517,8 @@ static int kthread_iterant_fn(void *kti_ptr)
 		if (kti->func)
 			kti->func(data);
 
+		do_kthread_iterant_pause(kti);
+
 		if (signal_pending(current))
 			kthread_do_signal();
 
-- 
1.8.5.6

  parent reply	other threads:[~2015-06-05 15:05 UTC|newest]

Thread overview: 175+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-05 15:00 [RFC PATCH 00/18] kthreads/signal: Safer kthread API and signal handling Petr Mladek
2015-06-05 15:00 ` Petr Mladek
2015-06-05 15:00 ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 01/18] kthread: Allow to call __kthread_create_on_node() with va_list args Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 02/18] kthread: Add API for iterant kthreads Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-09  6:23   ` Tejun Heo
2015-06-09  6:23     ` Tejun Heo
2015-06-09  6:23     ` Tejun Heo
2015-06-15 12:46     ` Petr Mladek
2015-06-15 12:46       ` Petr Mladek
2015-06-15 12:46       ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 03/18] kthread: Add kthread_stop_current() Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 04/18] signal: Rename kernel_sigaction() to kthread_sigaction() and clean it up Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 05/18] freezer/scheduler: Add freezable_cond_resched() Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 06/18] signal/kthread: Initial implementation of kthread signal handling Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-06 21:58   ` Oleg Nesterov
2015-06-06 21:58     ` Oleg Nesterov
2015-06-06 21:58     ` Oleg Nesterov
2015-06-08 13:51     ` Petr Mladek
2015-06-08 13:51       ` Petr Mladek
2015-06-08 13:51       ` Petr Mladek
2015-06-08 21:13       ` Oleg Nesterov
2015-06-08 21:13         ` Oleg Nesterov
2015-06-08 21:13         ` Oleg Nesterov
2015-06-15 13:13         ` Petr Mladek
2015-06-15 13:13           ` Petr Mladek
2015-06-15 13:13           ` Petr Mladek
2015-06-15 19:14           ` Oleg Nesterov
2015-06-15 19:14             ` Oleg Nesterov
2015-06-15 19:14             ` Oleg Nesterov
2015-06-16  7:54             ` Petr Mladek
2015-06-16  7:54               ` Petr Mladek
2015-06-16  7:54               ` Petr Mladek
2015-06-09  7:10   ` Tejun Heo
2015-06-09  7:10     ` Tejun Heo
2015-06-09  7:10     ` Tejun Heo
2015-06-09 12:15     ` Jiri Kosina
2015-06-09 12:15       ` Jiri Kosina
2015-06-09 12:15       ` Jiri Kosina
2015-06-10  3:13       ` Tejun Heo
2015-06-10  3:13         ` Tejun Heo
2015-06-10  3:13         ` Tejun Heo
2015-06-05 15:01 ` [RFC PATCH 07/18] kthread: Make iterant kthreads freezable by default Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-09  7:20   ` Tejun Heo
2015-06-09  7:20     ` Tejun Heo
2015-06-09  7:20     ` Tejun Heo
2015-06-09 15:53     ` Petr Mladek
2015-06-09 15:53       ` Petr Mladek
2015-06-09 15:53       ` Petr Mladek
2015-06-10  4:31       ` Tejun Heo
2015-06-10  4:31         ` Tejun Heo
2015-06-10  4:31         ` Tejun Heo
2015-06-12 13:24         ` Petr Mladek
2015-06-12 13:24           ` Petr Mladek
2015-06-12 13:24           ` Petr Mladek
2015-06-13 23:22           ` Tejun Heo
2015-06-13 23:22             ` Tejun Heo
2015-06-13 23:22             ` Tejun Heo
2015-06-15  9:28             ` Petr Mladek
2015-06-15  9:28               ` Petr Mladek
2015-06-15  9:28               ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 08/18] kthread: Allow to get struct kthread_iterant from task_struct Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01 ` Petr Mladek [this message]
2015-06-05 15:01   ` [RFC PATCH 09/18] kthread: Make it easier to correctly sleep in iterant kthreads Petr Mladek
2015-06-05 16:10   ` Peter Zijlstra
2015-06-05 16:10     ` Peter Zijlstra
2015-06-05 16:10     ` Peter Zijlstra
2015-06-08 10:01     ` Petr Mladek
2015-06-08 10:01       ` Petr Mladek
2015-06-08 10:01       ` Petr Mladek
2015-06-08 11:39       ` Peter Zijlstra
2015-06-08 11:39         ` Peter Zijlstra
2015-06-09 15:25         ` Petr Mladek
2015-06-09 15:25           ` Petr Mladek
2015-06-09 15:25           ` Petr Mladek
2015-06-10  9:05           ` Peter Zijlstra
2015-06-10  9:05             ` Peter Zijlstra
2015-06-10  9:05             ` Peter Zijlstra
2015-06-09  7:32       ` Tejun Heo
2015-06-09  7:32         ` Tejun Heo
2015-06-09  7:32         ` Tejun Heo
2015-06-08 17:48     ` Steven Rostedt
2015-06-08 17:48       ` Steven Rostedt
2015-06-08 17:48       ` Steven Rostedt
2015-06-10  9:07       ` Peter Zijlstra
2015-06-10  9:07         ` Peter Zijlstra
2015-06-10  9:07         ` Peter Zijlstra
2015-06-10 14:07         ` Steven Rostedt
2015-06-10 14:07           ` Steven Rostedt
2015-06-11  4:28           ` Jiri Kosina
2015-06-11  4:28             ` Jiri Kosina
2015-06-11  4:28             ` Jiri Kosina
2015-06-05 15:01 ` [RFC PATCH 10/18] jffs2: Remove forward definition of jffs2_garbage_collect_thread() Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 11/18] jffs2: Convert jffs2_gcd_mtd kthread into the iterant API Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-06 21:16   ` Oleg Nesterov
2015-06-06 21:16     ` Oleg Nesterov
2015-06-06 21:16     ` Oleg Nesterov
2015-06-06 21:32     ` Jiri Kosina
2015-06-06 21:32       ` Jiri Kosina
2015-06-06 21:32       ` Jiri Kosina
2015-06-06 22:30       ` Oleg Nesterov
2015-06-06 22:30         ` Oleg Nesterov
2015-06-06 22:30         ` Oleg Nesterov
2015-06-06 22:44         ` Jiri Kosina
2015-06-06 22:44           ` Jiri Kosina
2015-06-06 22:44           ` Jiri Kosina
2015-06-06 22:58           ` Oleg Nesterov
2015-06-06 22:58             ` Oleg Nesterov
2015-06-06 22:58             ` Oleg Nesterov
2015-06-05 15:01 ` [RFC PATCH 12/18] lockd: Convert the central lockd service to kthread_iterant API Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 13/18] ring_buffer: Use iterant kthreads API in the ring buffer benchmark Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 14/18] ring_buffer: Allow to cleanly freeze the ring buffer benchmark kthreads Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 15/18] ring_buffer: Allow to exit the ring buffer benchmark immediately Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-08 17:44   ` Steven Rostedt
2015-06-08 17:44     ` Steven Rostedt
2015-06-08 17:44     ` Steven Rostedt
2015-06-15 15:23     ` Petr Mladek
2015-06-15 15:23       ` Petr Mladek
2015-06-15 15:23       ` Petr Mladek
2015-06-15 15:23       ` Petr Mladek
2015-06-15 15:33       ` Steven Rostedt
2015-06-15 15:33         ` Steven Rostedt
2015-06-15 15:33         ` Steven Rostedt
2015-06-15 15:54         ` Petr Mladek
2015-06-15 15:54           ` Petr Mladek
2015-06-15 15:54           ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 16/18] kthread: Support interruptible sleep with a timeout by iterant kthreads Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 17/18] ring_buffer: Use the new API for a sleep with a timeout in the benchmark Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 18/18] jffs2: Use the new API for a sleep with a timeout Petr Mladek
2015-06-05 15:01   ` Petr Mladek
2015-06-05 16:22 ` [RFC PATCH 00/18] kthreads/signal: Safer kthread API and signal handling Peter Zijlstra
2015-06-05 16:22   ` Peter Zijlstra
2015-06-09  6:14   ` Tejun Heo
2015-06-09  6:14     ` Tejun Heo
2015-06-09  6:14     ` Tejun Heo
2015-06-10 10:40     ` Peter Zijlstra
2015-06-10 10:40       ` Peter Zijlstra
2015-06-10 10:40       ` Peter Zijlstra
2015-06-11 22:02       ` Tejun Heo
2015-06-11 22:02         ` Tejun Heo
2015-06-11 22:02         ` Tejun Heo
2015-06-09  6:10 ` Tejun Heo
2015-06-09  6:10   ` Tejun Heo
2015-06-09  6:10   ` Tejun Heo
2015-06-09  7:58   ` Tejun Heo
2015-06-09  7:58     ` Tejun Heo
2015-06-09  7:58     ` Tejun Heo
2015-06-17 11:34 ` Christoph Hellwig
2015-06-17 11:34   ` Christoph Hellwig
2015-06-17 11:34   ` Christoph Hellwig

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=1433516477-5153-10-git-send-email-pmladek@suse.cz \
    --to=pmladek@suse.cz \
    --cc=akpm@linux-foundation.org \
    --cc=anna.schumaker@netapp.com \
    --cc=bp@suse.de \
    --cc=clm@fb.com \
    --cc=dwmw2@infradead.org \
    --cc=jkosina@suse.cz \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=live-patching@vger.kernel.org \
    --cc=mhocko@suse.cz \
    --cc=mingo@redhat.com \
    --cc=oleg@redhat.com \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=richard@nod.at \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=trond.myklebust@primarydata.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.