From: Andi Kleen <ak@suse.de>
To: Christoph Lameter <clameter@sgi.com>
Cc: Ingo Molnar <mingo@elte.hu>,
Michal Piotrowski <michal.k.k.piotrowski@gmail.com>,
Andrew Morton <akpm@osdl.org>,
linux-kernel@vger.kernel.org
Subject: Re: broken local_t on i386
Date: Mon, 12 Jun 2006 18:48:05 +0200 [thread overview]
Message-ID: <200606121848.05438.ak@suse.de> (raw)
In-Reply-To: <Pine.LNX.4.64.0606120921130.18975@schroedinger.engr.sgi.com>
On Monday 12 June 2006 18:37, Christoph Lameter wrote:
> On Mon, 12 Jun 2006, Ingo Molnar wrote:
>
> > below is an updated patch that includes fixups for i386 - but the real
> > fix should be to properly reduce the per-arch local.h footprint to the
> > bare minimum possible, and to do this fix on the asm-generic headers.
>
> Nak. This is simply evidence of local.t breakage on i386. One cannot
> calculate the address of a per cpu area and then increment without
> disabling preemption. The process may have been moved to another processor
> between those two operations and will then increment the event counter of
> the former processor (which in turn may at the same time increment the
> same counter). The inc is not atomic in the sense that it syncs multiple
> processors. So we will have the race back.
True - i forgot that race.
> The increment must occur directly through the atomic-vs-interrupt dec/inc
> on the local per cpu area *without* any use of *_smp_processor_id().
>
> As far as I can see x86_64 does the right thing and it increments on the
> local per cpu area. The definition of __get_cpu_var is:
>
> #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset()))
It is also affected by your race. The inc would only be atomic if the counter
was in the PDA, but standard per cpu data isn't. So it has to follow
a pointer and then it could already have switched.
[I think Ingo stated this earlier, but I didn't get -- sorry]
Fix would be to disable preemption. I don't think it needs cli/sti
on non preemptible kernels.
> i386 uses the asm-generic/percpu.h but provides its own
> implementation of local.t. That simply cannot work. i386
> must provide a definition of __get_per_var that increments directly
> on the variable in the local per cpu area.
>
> The definition for __get_cpu_var in asm-generic/percpu.h is:
>
> #define __get_cpu_var(var) per_cpu(var, smp_processor_id())
>
> This breaks the cpu_* operations for local.t on i386.
>
> Also we have various forms of __raw_get_cpu_var() around. Is there any
> reason for their existence. The presence of these shows the assumption
> that one can determine the current processor id and then index into an
> array of per cpu areas. That is not possible with preemption enabled.
>
> In the absence of a race free __get_cpu_var() i386 would need to fall
> back to atomic ops by using asm-generic/local.t.
Or just disable preemption?
-Andi
next prev parent reply other threads:[~2006-06-12 16:48 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-10 4:40 2.6.16-rc6-mm2 Andrew Morton
2006-06-10 10:23 ` 2.6.16-rc6-mm2 Michal Piotrowski
2006-06-10 16:24 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-10 16:43 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-10 16:51 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-10 17:03 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-10 18:04 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-10 18:14 ` 2.6.16-rc6-mm2 Michal Piotrowski
2006-06-10 18:31 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-10 18:35 ` 2.6.16-rc6-mm2 Michal Piotrowski
2006-06-12 11:05 ` 2.6.16-rc6-mm2 Ingo Molnar
2006-06-12 11:48 ` 2.6.16-rc6-mm2 Ingo Molnar
2006-06-12 12:14 ` 2.6.16-rc6-mm2 Andi Kleen
2006-06-12 13:07 ` 2.6.16-rc6-mm2 Ingo Molnar
2006-06-12 13:41 ` 2.6.16-rc6-mm2 Andi Kleen
2006-06-13 3:28 ` 2.6.16-rc6-mm2 Keith Owens
2006-06-13 4:56 ` 2.6.16-rc6-mm2 Andi Kleen
2006-06-13 5:08 ` 2.6.16-rc6-mm2 Keith Owens
2006-06-13 5:18 ` 2.6.16-rc6-mm2 Andi Kleen
2006-06-13 5:43 ` 2.6.16-rc6-mm2 Nick Piggin
2006-06-13 5:48 ` 2.6.16-rc6-mm2 Andi Kleen
2006-06-13 11:45 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-13 12:41 ` 2.6.16-rc6-mm2 Keith Owens
2006-06-12 16:37 ` broken local_t on i386 Christoph Lameter
2006-06-12 16:48 ` Andi Kleen [this message]
2006-06-12 16:54 ` Christoph Lameter
2006-06-12 17:06 ` Andi Kleen
2006-06-12 17:11 ` Christoph Lameter
2006-06-12 17:29 ` Andi Kleen
2006-06-12 18:14 ` Lee Revell
2006-06-12 18:46 ` Alan Cox
2006-06-12 18:27 ` Christoph Lameter
2006-06-12 17:35 ` Andi Kleen
2006-06-12 18:42 ` Christoph Lameter
2006-06-12 17:55 ` Andi Kleen
2006-06-12 18:59 ` Christoph Lameter
2006-06-12 18:11 ` Andi Kleen
2006-06-12 19:15 ` Christoph Lameter
2006-06-13 3:36 ` Andi Kleen
2006-06-12 20:12 ` Alan Cox
2006-06-13 4:02 ` Andi Kleen
2006-06-12 13:50 ` 2.6.16-rc6-mm2 Michal Piotrowski
2006-06-12 14:20 ` 2.6.16-rc6-mm2 Ingo Molnar
2006-06-12 14:57 ` 2.6.16-rc6-mm2 Michal Piotrowski
[not found] ` <6bffcb0e0606101126v55cc20dbk275d8aa7fdcb0f1a@mail.gmail.com>
2006-06-10 18:36 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-10 19:08 ` 2.6.16-rc6-mm2 Michal Piotrowski
2006-06-10 16:58 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-10 14:56 ` 2.6.16-rc6-mm2 Martin J. Bligh
2006-06-10 16:43 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-10 16:18 ` 2.6.16-rc6-mm2 Dominik Karall
2006-06-10 16:25 ` 2.6.16-rc6-mm2 Michal Piotrowski
2006-06-10 17:42 ` 2.6.16-rc6-mm2 Dominik Karall
2006-06-10 18:43 ` 2.6.16-rc6-mm2 Rafael J. Wysocki
2006-06-11 10:17 ` 2.6.16-rc6-mm2 Jan Engelhardt
2006-06-11 10:58 ` 2.6.16-rc6-mm2 Rafael J. Wysocki
2006-06-12 16:56 ` 2.6.16-rc6-mm2 Zan Lynx
2006-06-12 17:35 ` 2.6.16-rc6-mm2 Cedric Le Goater
2006-06-12 22:16 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-13 0:24 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-14 21:56 ` 2.6.16-rc6-mm2 Trond Myklebust
2006-06-13 7:22 ` 2.6.16-rc6-mm2 Cedric Le Goater
2006-06-13 17:54 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-13 19:35 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-13 20:22 ` 2.6.16-rc6-mm2 Cedric Le Goater
2006-06-13 21:13 ` 2.6.16-rc6-mm2 Christoph Lameter
2006-06-13 21:50 ` 2.6.16-rc6-mm2 Cedric Le Goater
2006-06-12 18:19 ` 2.6.16-rc6-mm2 Badari Pulavarty
2006-06-13 13:54 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-13 17:04 ` 2.6.16-rc6-mm2 Badari Pulavarty
2006-06-12 22:09 ` 2.6.16-rc6-mm2 Steve Fox
2006-06-13 13:54 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-13 14:10 ` 2.6.16-rc6-mm2 Sergei Shtylyov
2006-06-13 19:01 ` 2.6.16-rc6-mm2 Steve Fox
2006-06-13 21:43 ` 2.6.16-rc6-mm2 Andrew Morton
2006-06-13 21:51 ` 2.6.16-rc6-mm2 Badari Pulavarty
2006-06-13 22:36 ` 2.6.16-rc6-mm2 Steve Fox
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=200606121848.05438.ak@suse.de \
--to=ak@suse.de \
--cc=akpm@osdl.org \
--cc=clameter@sgi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=michal.k.k.piotrowski@gmail.com \
--cc=mingo@elte.hu \
/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