All of lore.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Peter Zijlstra <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: hpa@zytor.com, torvalds@linux-foundation.org,
	linux-kernel@vger.kernel.org, peterz@infradead.org,
	mingo@kernel.org, efault@gmx.de, tglx@linutronix.de
Subject: [tip:sched/core] sched/core: Create preempt_count invariant
Date: Tue, 29 Sep 2015 03:30:58 -0700	[thread overview]
Message-ID: <tip-e26d555f695ac8a3aa38055dd04bd23c1334723b@git.kernel.org> (raw)
In-Reply-To: <20150929093519.817299442@infradead.org>

Commit-ID:  e26d555f695ac8a3aa38055dd04bd23c1334723b
Gitweb:     http://git.kernel.org/tip/e26d555f695ac8a3aa38055dd04bd23c1334723b
Author:     Peter Zijlstra <peterz@infradead.org>
AuthorDate: Tue, 29 Sep 2015 11:28:27 +0200
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Tue, 29 Sep 2015 12:27:40 +0200

sched/core: Create preempt_count invariant

Ensure that upon scheduling preempt_count == 2; although
currently an additional PREEMPT_ACTIVE is still possible.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: fweisbec@gmail.com
Cc: linux-kernel@vger.kernel.org
Cc: oleg@redhat.com
Cc: rostedt@goodmis.org
Cc: umgwanakikbuti@gmail.com
Link: http://lkml.kernel.org/r/20150929093519.817299442@infradead.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/include/asm/preempt.h |  3 ++-
 include/asm-generic/preempt.h  |  2 +-
 kernel/sched/core.c            | 14 ++++++++++----
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h
index b12f810..183d95c6 100644
--- a/arch/x86/include/asm/preempt.h
+++ b/arch/x86/include/asm/preempt.h
@@ -31,7 +31,8 @@ static __always_inline void preempt_count_set(int pc)
  * must be macros to avoid header recursion hell
  */
 #define init_task_preempt_count(p) do { \
-	task_thread_info(p)->saved_preempt_count = PREEMPT_DISABLED; \
+	task_thread_info(p)->saved_preempt_count = \
+		2*PREEMPT_DISABLE_OFFSET + PREEMPT_NEED_RESCHED; \
 } while (0)
 
 #define init_idle_preempt_count(p, cpu) do { \
diff --git a/include/asm-generic/preempt.h b/include/asm-generic/preempt.h
index 0bec580..1d6f104 100644
--- a/include/asm-generic/preempt.h
+++ b/include/asm-generic/preempt.h
@@ -24,7 +24,7 @@ static __always_inline void preempt_count_set(int pc)
  * must be macros to avoid header recursion hell
  */
 #define init_task_preempt_count(p) do { \
-	task_thread_info(p)->preempt_count = PREEMPT_DISABLED; \
+	task_thread_info(p)->preempt_count = 2*PREEMPT_DISABLED; \
 } while (0)
 
 #define init_idle_preempt_count(p, cpu) do { \
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index a91df61..ecd585c 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2588,11 +2588,17 @@ asmlinkage __visible void schedule_tail(struct task_struct *prev)
 {
 	struct rq *rq;
 
-	/* finish_task_switch() drops rq->lock and enables preemtion */
-	preempt_disable();
-	rq = finish_task_switch(prev);
+	/*
+	 * Still have preempt_count() == 2, from:
+	 *
+	 *	schedule()
+	 *	  preempt_disable();			// 1
+	 *	  __schedule()
+	 *	    raw_spin_lock_irq(&rq->lock)	// 2
+	 */
+	rq = finish_task_switch(prev); /* drops rq->lock, preempt_count() == 1 */
 	balance_callback(rq);
-	preempt_enable();
+	preempt_enable(); /* preempt_count() == 0 */
 
 	if (current->set_child_tid)
 		put_user(task_pid_vnr(current), current->set_child_tid);

  reply	other threads:[~2015-09-29 10:33 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-29  9:28 [RFC][PATCH 00/11] sched: Killing PREEMPT_ACTIVE Peter Zijlstra
2015-09-29  9:28 ` [RFC][PATCH 01/11] sched: Simplify INIT_PREEMPT_COUNT Peter Zijlstra
2015-09-29 10:30   ` [tip:sched/core] sched/core: " tip-bot for Peter Zijlstra
2015-09-29 13:19   ` [RFC][PATCH 01/11] sched: " Frederic Weisbecker
2015-09-29 14:43   ` Steven Rostedt
2015-09-29 14:47     ` Peter Zijlstra
     [not found]   ` <20150929103729.00899e69@gandalf.local.home>
     [not found]     ` <20150929143559.GL3816@twins.programming.kicks-ass.net>
2015-09-29 15:00       ` Steven Rostedt
2015-09-29 15:05         ` Peter Zijlstra
2015-09-29  9:28 ` [RFC][PATCH 02/11] sched: Create preempt_count invariant Peter Zijlstra
2015-09-29 10:30   ` tip-bot for Peter Zijlstra [this message]
2015-09-29 12:55   ` Frederic Weisbecker
2015-09-29 13:02     ` Peter Zijlstra
2015-09-29 14:40       ` Steven Rostedt
2015-09-29 13:11   ` Thomas Gleixner
2015-09-29 14:09     ` Peter Zijlstra
2015-09-29  9:28 ` [RFC][PATCH 03/11] sched: Robustify preemption leak checks Peter Zijlstra
2015-09-29 10:31   ` [tip:sched/core] sched/core: " tip-bot for Peter Zijlstra
2015-09-29 13:13   ` [RFC][PATCH 03/11] sched: " Thomas Gleixner
2015-09-29 13:25   ` Frederic Weisbecker
2015-09-29 14:24     ` Peter Zijlstra
2015-09-29 14:32       ` Frederic Weisbecker
2015-09-29 15:07   ` Steven Rostedt
2015-09-29 15:17     ` Peter Zijlstra
2015-09-29  9:28 ` [RFC][PATCH 04/11] sched: Rework TASK_DEAD preemption exception Peter Zijlstra
2015-09-29 13:13   ` Thomas Gleixner
2015-09-29 13:41   ` Frederic Weisbecker
2015-09-29 15:10   ` Steven Rostedt
2015-09-29  9:28 ` [RFC][PATCH 05/11] sched: Add preempt argument to __schedule() Peter Zijlstra
2015-09-29 13:14   ` Thomas Gleixner
2015-09-29 13:18   ` Frederic Weisbecker
2015-09-29 15:28   ` Steven Rostedt
2015-09-29 15:30     ` Steven Rostedt
2015-09-29 15:29       ` Peter Zijlstra
2015-09-29  9:28 ` [RFC][PATCH 06/11] sched: Fix trace_sched_switch() Peter Zijlstra
2015-09-29 13:15   ` Thomas Gleixner
2015-09-29 15:38   ` Steven Rostedt
2015-09-29 15:48     ` Peter Zijlstra
2015-09-29 16:30       ` Steven Rostedt
2015-09-29  9:28 ` [RFC][PATCH 07/11] sched: Stop setting PREEMPT_ACTIVE Peter Zijlstra
2015-09-29 13:16   ` Thomas Gleixner
2015-09-29 15:41   ` Steven Rostedt
2015-09-29 16:25     ` Peter Zijlstra
2015-09-29  9:28 ` [RFC][PATCH 08/11] sched: Simplify preempt_count tests Peter Zijlstra
2015-09-29 13:17   ` Thomas Gleixner
2015-09-29 15:42   ` Steven Rostedt
2015-09-29  9:28 ` [RFC][PATCH 09/11] sched, x86: Kill saved_preempt_count Peter Zijlstra
2015-09-29 13:18   ` Thomas Gleixner
2015-09-29 15:44   ` Steven Rostedt
2015-09-29 15:46     ` Peter Zijlstra
2015-09-29  9:28 ` [RFC][PATCH 10/11] sched: Kill PREEMPT_ACTIVE Peter Zijlstra
2015-09-29 13:18   ` Thomas Gleixner
2015-09-29 15:45   ` Steven Rostedt
2015-09-29  9:28 ` [RFC][PATCH 11/11] sched: More notrace Peter Zijlstra
2015-09-29 13:19   ` Thomas Gleixner
2015-09-29 15:58   ` Steven Rostedt
2015-09-29 10:27 ` [RFC][PATCH 12/11] sched: Add preempt_count invariant check Peter Zijlstra
2015-09-29 10:32   ` Peter Zijlstra
2015-09-29 10:56   ` [RFC][PATCH v2 " Peter Zijlstra
2015-09-29 11:55     ` Linus Torvalds
2015-09-29 11:55       ` Peter Zijlstra
2015-09-29 10:34 ` [RFC][PATCH 00/11] sched: Killing PREEMPT_ACTIVE Ingo Molnar

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=tip-e26d555f695ac8a3aa38055dd04bd23c1334723b@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=efault@gmx.de \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.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 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.