All of lore.kernel.org
 help / color / mirror / Atom feed
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

  reply	other threads:[~2006-06-12 16:48 UTC|newest]

Thread overview: 81+ 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 14:56   ` 2.6.16-rc6-mm2 Martin J. Bligh
2006-06-10 15:40   ` 2.6.16-rc6-mm2 Felix Oxley
2006-06-10 16:43   ` 2.6.16-rc6-mm2 Andrew Morton
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 20:55   ` Fwd: 2.6.16-rc6-mm2 Michal Piotrowski
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-12 20:48   ` Fwd: 2.6.16-rc6-mm2 Michal Piotrowski
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 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.