mirror of https://lore.kernel.org/lkml/
 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 16/18] kthread: Support interruptible sleep with a timeout by iterant kthreads
Date: Fri,  5 Jun 2015 17:01:15 +0200	[thread overview]
Message-ID: <1433516477-5153-17-git-send-email-pmladek@suse.cz> (raw)
In-Reply-To: <1433516477-5153-1-git-send-email-pmladek@suse.cz>

The aim of kthread iterant API is to maintain some non-trivial operations
on the single place. One of this operations is sleeping between iterations
because we need to handle properly system freezing, parking, and
kthread stopping.

This patch adds support for interruptible sleep with a timeout. It defines
the type, function to set and do the sleep. The timeout value is added
into the struct kthread_iterant.

Signed-off-by: Petr Mladek <pmladek@suse.cz>
---
 include/linux/kthread.h |  5 +++++
 kernel/kthread.c        | 30 +++++++++++++++++++++++++++++-
 2 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/include/linux/kthread.h b/include/linux/kthread.h
index 415178c20cde..e8f7c0106cfd 100644
--- a/include/linux/kthread.h
+++ b/include/linux/kthread.h
@@ -53,13 +53,16 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data),
 #define KTI_PAUSE_ONCE		0x00000001
 /* Do interruptible sleep between iterations. */
 #define KTI_INT_SLEEP		0x00000002
+#define KTI_INT_SLEEP_TIMEOUT	0x00000004
 
 #define KTI_PAUSE_MASK		(KTI_INT_SLEEP | \
+				 KTI_INT_SLEEP_TIMEOUT | \
 				 KTI_PAUSE_ONCE)
 
 /**
  * struct kthread_iterant - structure describing the function of the kthread
  * @type: modifies the kthread behavior using extra flags.
+ * @timeout: timeout value in jiffies.
  * @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.
@@ -67,6 +70,7 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data),
  */
 struct kthread_iterant {
 	unsigned int type;
+	signed long timeout;
 	void *data;
 	void (*init)(void *data);
 	void (*func)(void *data);
@@ -97,6 +101,7 @@ kthread_iterant_create_on_cpu(struct kthread_iterant *kti,
 })
 
 void set_kthread_iterant_int_sleep(void);
+void set_kthread_iterant_int_sleep_timeout(signed long timeout);
 
 void kthread_bind(struct task_struct *k, unsigned int cpu);
 void kthread_stop_current(void);
diff --git a/kernel/kthread.c b/kernel/kthread.c
index fa40fb549e22..9a5845674419 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -455,6 +455,30 @@ void set_kthread_iterant_int_sleep(void)
 EXPORT_SYMBOL(set_kthread_iterant_int_sleep);
 
 /**
+ * set_kthread_iterant_int_sleep_timeout - do interuptible sleep
+ *	with a timeout before the next iteration
+ * @timeout: timeout value in jiffies
+ *
+ * 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 check for pending work need to be done in the main func()
+ * because it is not generic.
+ */
+void set_kthread_iterant_int_sleep_timeout(signed long timeout)
+{
+	struct kthread_iterant *kti = to_kthread_iterant(current);
+
+	set_kthread_iterant_pause_type(kti, KTI_INT_SLEEP_TIMEOUT);
+	kti->timeout = timeout;
+	set_current_state(TASK_INTERRUPTIBLE);
+}
+EXPORT_SYMBOL(set_kthread_iterant_int_sleep_timeout);
+
+/**
  * do_kthread_iterant_pause - do the selected pause before next iteration
  *
  * Most kthreads sleep or wait between iterations. This function
@@ -470,7 +494,9 @@ static void do_kthread_iterant_pause(struct kthread_iterant *kti)
 	 * 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))
+	if (!(type & KTI_PAUSE_ONCE) &&
+	    ((type & KTI_INT_SLEEP) ||
+	     (type & KTI_INT_SLEEP_TIMEOUT)))
 		set_current_state(TASK_INTERRUPTIBLE);
 
 	if (kthread_freezable_should_stop(NULL)) {
@@ -480,6 +506,8 @@ static void do_kthread_iterant_pause(struct kthread_iterant *kti)
 
 	if (type & KTI_INT_SLEEP)
 		freezable_schedule();
+	else if (type & KTI_INT_SLEEP_TIMEOUT)
+		freezable_schedule_timeout(kti->timeout);
 	else
 		freezable_cond_resched();
 
-- 
1.8.5.6


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

Thread overview: 62+ 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:01 ` [RFC PATCH 01/18] kthread: Allow to call __kthread_create_on_node() with va_list args Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 02/18] kthread: Add API for iterant kthreads Petr Mladek
2015-06-09  6:23   ` Tejun Heo
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 ` [RFC PATCH 04/18] signal: Rename kernel_sigaction() to kthread_sigaction() and clean it up Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 05/18] freezer/scheduler: Add freezable_cond_resched() Petr Mladek
2015-06-05 15:01 ` [RFC PATCH 06/18] signal/kthread: Initial implementation of kthread signal handling Petr Mladek
2015-06-06 21:58   ` Oleg Nesterov
2015-06-08 13:51     ` Petr Mladek
2015-06-08 21:13       ` Oleg Nesterov
2015-06-15 13:13         ` Petr Mladek
2015-06-15 19:14           ` Oleg Nesterov
2015-06-16  7:54             ` Petr Mladek
2015-06-09  7:10   ` Tejun Heo
2015-06-09 12:15     ` Jiri Kosina
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-09  7:20   ` Tejun Heo
2015-06-09 15:53     ` Petr Mladek
2015-06-10  4:31       ` Tejun Heo
2015-06-12 13:24         ` Petr Mladek
2015-06-13 23:22           ` Tejun Heo
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 ` [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-08 10:01     ` Petr Mladek
2015-06-08 11:39       ` Peter Zijlstra
2015-06-09 15:25         ` Petr Mladek
2015-06-10  9:05           ` Peter Zijlstra
2015-06-09  7:32       ` Tejun Heo
2015-06-08 17:48     ` Steven Rostedt
2015-06-10  9:07       ` Peter Zijlstra
2015-06-10 14:07         ` Steven Rostedt
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 ` [RFC PATCH 11/18] jffs2: Convert jffs2_gcd_mtd kthread into the iterant API Petr Mladek
2015-06-06 21:16   ` Oleg Nesterov
2015-06-06 21:32     ` Jiri Kosina
2015-06-06 22:30       ` Oleg Nesterov
2015-06-06 22:44         ` Jiri Kosina
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 ` [RFC PATCH 13/18] ring_buffer: Use iterant kthreads API in the ring buffer benchmark 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 ` [RFC PATCH 15/18] ring_buffer: Allow to exit the ring buffer benchmark immediately Petr Mladek
2015-06-08 17:44   ` Steven Rostedt
2015-06-15 15:23     ` Petr Mladek
2015-06-15 15:33       ` Steven Rostedt
2015-06-15 15:54         ` Petr Mladek
2015-06-05 15:01 ` Petr Mladek [this message]
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 ` [RFC PATCH 18/18] jffs2: Use the new API for a sleep with a timeout Petr Mladek
2015-06-05 16:22 ` [RFC PATCH 00/18] kthreads/signal: Safer kthread API and signal handling Peter Zijlstra
2015-06-09  6:14   ` Tejun Heo
2015-06-10 10:40     ` Peter Zijlstra
2015-06-11 22:02       ` Tejun Heo
2015-06-09  6:10 ` Tejun Heo
2015-06-09  7:58   ` Tejun Heo
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-17-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®