From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932071AbbI3JcP (ORCPT ); Wed, 30 Sep 2015 05:32:15 -0400 Received: from smtprelay0219.hostedemail.com ([216.40.44.219]:39432 "EHLO smtprelay.hostedemail.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751545AbbI3JcM (ORCPT ); Wed, 30 Sep 2015 05:32:12 -0400 X-Session-Marker: 726F737465647440676F6F646D69732E6F7267 X-Spam-Summary: 2,0,0,,d41d8cd98f00b204,rostedt@goodmis.org,:::::::::::::::,RULES_HIT:41:355:379:541:599:800:960:968:973:988:989:1260:1277:1311:1313:1314:1345:1359:1437:1515:1516:1518:1534:1542:1593:1594:1711:1730:1747:1777:1792:1981:2194:2198:2199:2200:2393:2553:2559:2562:2693:3138:3139:3140:3141:3142:3354:3622:3865:3866:3867:3868:3870:3871:3872:3873:3874:4605:5007:6261:7875:8660:10004:10400:10848:10967:11026:11232:11473:11657:11658:11914:12043:12291:12296:12438:12517:12519:12740:13148:13230:21080,0,RBL:none,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fn,MSBL:0,DNSBL:none,Custom_rules:0:0:0 X-HE-Tag: rail88_4d0d7c574c301 X-Filterd-Recvd-Size: 3685 Date: Wed, 30 Sep 2015 05:32:08 -0400 From: Steven Rostedt To: Peter Zijlstra Cc: mingo@kernel.org, linux-kernel@vger.kernel.org, torvalds@linux-foundation.org, fweisbec@gmail.com, oleg@redhat.com, umgwanakikbuti@gmail.com, tglx@linutronix.de Subject: Re: [PATCH v2 03/12] sched: Create preempt_count invariant Message-ID: <20150930053208.0604317b@gandalf.local.home> In-Reply-To: <20150930072303.844400616@infradead.org> References: <20150930071035.514587432@infradead.org> <20150930072303.844400616@infradead.org> X-Mailer: Claws Mail 3.12.0 (GTK+ 2.24.28; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 30 Sep 2015 09:10:38 +0200 Peter Zijlstra wrote: > Assuming units of PREEMPT_DISABLE_OFFSET for preempt_count() numbers. > > Now that TASK_DEAD no longer results in preempt_count() == 3 during > scheduling, we will always call context_switch() with preempt_count() > == 2. > > However, we don't always end up with preempt_count() == 2 in > finish_task_switch() because new tasks get created with > preempt_count() == 1. > > Create FORK_PREEMPT_COUNT and set it to 2 and use that in the right > places. Note that we cannot use INIT_PREEMPT_COUNT as that serves > another purpose (boot). > > After this, preempt_count() is invariant across the context switch, > with exception of PREEMPT_ACTIVE. > > Signed-off-by: Peter Zijlstra (Intel) > --- > arch/x86/include/asm/preempt.h | 2 +- > include/asm-generic/preempt.h | 2 +- > include/linux/sched.h | 17 ++++++++++++----- > kernel/sched/core.c | 23 +++++++++++++++++++++-- > 4 files changed, 35 insertions(+), 9 deletions(-) > > --- a/arch/x86/include/asm/preempt.h > +++ b/arch/x86/include/asm/preempt.h > @@ -31,7 +31,7 @@ static __always_inline void preempt_coun > * 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 = FORK_PREEMPT_COUNT; \ > } while (0) > > #define init_idle_preempt_count(p, cpu) do { \ > --- a/include/asm-generic/preempt.h > +++ b/include/asm-generic/preempt.h > @@ -24,7 +24,7 @@ static __always_inline void preempt_coun > * 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 = FORK_PREEMPT_COUNT; \ > } while (0) > > #define init_idle_preempt_count(p, cpu) do { \ > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -599,11 +599,7 @@ struct task_cputime_atomic { > .sum_exec_runtime = ATOMIC64_INIT(0), \ > } > > -#ifdef CONFIG_PREEMPT_COUNT > -#define PREEMPT_DISABLED (1 + PREEMPT_ENABLED) > -#else > -#define PREEMPT_DISABLED PREEMPT_ENABLED > -#endif > +#define PREEMPT_DISABLED (PREEMPT_DISABLE_OFFSET + PREEMPT_ENABLED) Hmm, it looks to me that you removed all users of PREEMPT_DISABLED. Did you add another user of it? -- Steve > > /* > * Disable preemption until the scheduler is running -- use an unconditional > @@ -613,6 +609,17 @@ struct task_cputime_atomic { > */ > #define INIT_PREEMPT_COUNT PREEMPT_OFFSET >