public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Nick Piggin <nickpiggin@yahoo.com.au>
To: Nicolas Pitre <nico@cam.org>
Cc: Linus Torvalds <torvalds@osdl.org>,
	Russell King <rmk@arm.linux.org.uk>,
	lkml <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] fix race with preempt_enable()
Date: Thu, 22 Dec 2005 18:09:15 +1100	[thread overview]
Message-ID: <43AA511B.9040400@yahoo.com.au> (raw)
In-Reply-To: <Pine.LNX.4.64.0512211135550.26663@localhost.localdomain>

Nicolas Pitre wrote:
> Currently a simple
> 
> 	void foo(void) { preempt_enable(); }
> 
> produces the following code on ARM:
> 
> foo:
> 	bic	r3, sp, #8128
> 	bic	r3, r3, #63
> 	ldr	r2, [r3, #4]
> 	ldr	r1, [r3, #0]
> 	sub	r2, r2, #1
> 	tst	r1, #4
> 	str	r2, [r3, #4]
> 	blne	preempt_schedule
> 	mov	pc, lr
> 
> The problem is that the TIF_NEED_RESCHED flag is loaded _before_ the 
> preemption count is stored back, hence any interrupt coming within that 
> 3 instruction window causing TIF_NEED_RESCHED to be set won't be 
> seen and scheduling won't happen as it should.
> 
> Nothing currently prevents gcc from performing that reordering.  There 
> is already a barrier() before the decrement of the preemption count, but 
> another one is needed between this and the TIF_NEED_RESCHED flag test 
> for proper code ordering.
> 

Nice catch, this is not ARM specific either of course.

kernel/sched.c:preempt_schedule() has an equivalent barrier after
subtracting the preempt count and before checking TIF_NEED_RESCHED,
so I think this is the correct fix.

Linus will you apply?

> Signed-off-by: Nicolas Pitre <nico@cam.org>
> 
> ---
> 
> diff --git a/include/linux/preempt.h b/include/linux/preempt.h
> index d9a2f52..5769d14 100644
> --- a/include/linux/preempt.h
> +++ b/include/linux/preempt.h
> @@ -48,6 +48,7 @@ do { \
>  #define preempt_enable() \
>  do { \
>  	preempt_enable_no_resched(); \
> +	barrier(); \
>  	preempt_check_resched(); \
>  } while (0)
>  

-- 
SUSE Labs, Novell Inc.

Send instant messages to your online friends http://au.messenger.yahoo.com 

      reply	other threads:[~2005-12-22  7:09 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-12-21 17:26 [PATCH] fix race with preempt_enable() Nicolas Pitre
2005-12-22  7:09 ` Nick Piggin [this message]

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=43AA511B.9040400@yahoo.com.au \
    --to=nickpiggin@yahoo.com.au \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nico@cam.org \
    --cc=rmk@arm.linux.org.uk \
    --cc=torvalds@osdl.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox