public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Andrea Arcangeli <andrea@cpushare.com>
To: Mikael Pettersson <mikpe@csd.uu.se>
Cc: Andrew Morton <akpm@osdl.org>, linux-kernel@vger.kernel.org
Subject: Re: 2.6.12-rc5-mm1
Date: Thu, 26 May 2005 15:04:02 +0200	[thread overview]
Message-ID: <20050526130402.GN5691@g5.random> (raw)
In-Reply-To: <17045.36727.602005.757948@alkaid.it.uu.se>

On Thu, May 26, 2005 at 10:57:27AM +0200, Mikael Pettersson wrote:
> 2.6.12-rc5-mm1 includes Andrea's seccomp-disable-tsc patch,
> which I believe is broken on SMP. In process.c we find:
> 
>  /*
> + * This function selects if the context switch from prev to next
> + * has to tweak the TSC disable bit in the cr4.
> + */
> +static void disable_tsc(struct thread_info *prev,
> +			struct thread_info *next)
> +{
> +	if (unlikely(has_secure_computing(prev) ||
> +		     has_secure_computing(next))) {
> +		/* slow path here */
> +		if (has_secure_computing(prev) &&
> +		    !has_secure_computing(next)) {
> +			clear_in_cr4(X86_CR4_TSD);
> +		} else if (!has_secure_computing(prev) &&
> +			   has_secure_computing(next))
> +			set_in_cr4(X86_CR4_TSD);
> +	}
> +}
> 
> which it calls from __switch_to().
> 
> The problem is that {set,clear}_in_cr4() both update a single
> global mmu_cr4_features variable, which is asynchronously written
> to all CPUs by {,__}flush_tlb_all(). Hence, the CR4.TSD setting
> is at best probabilistic.

You're right. This won't destabilize the kernel (and it couldn't trigger
in my testing) but it may lead to the tsc to be erroneously disabled on
a non-seccomp task, after a change_page_attr (i.e. insmod) or similar
events using flush_tlb_all (like rmmod). I didn't notice this race
condition sorry (I now recall why we overwrite the cr4 flag in the
global tlb flush: just to flush the global pagetables, since vmalloc
uses global pagetables too).

> I spotted this because perfctr used to flip CR4.PCE in __switch_to()
> ages ago, but I had to abandon that when kernel 2.3.40 changed to
> the current scheme with a global mmu_cr4_features.
> (Another reason was that CR4 writes were and still are very slow.)

Speed is not an issue, cr4 would never be tweaked unless you use
seccomp, the cr4 flip is in an extreme slow path.

I think there are two ways to solve this race:

1) why don't we read the cr4 from the cpu? would movl %%cr4, %%eax
generate a general protection fault? Can the cr4 be read in ring 0?
Why to read it from memory if we've that information in the cpu already?
2) If there's a good reason to read if from memory, then what about
making the mmu_cr4_features per-cpu? That way would solve the problem
too.

Both solutions relay on the fact that the pagetable flush cannot happen
from irqs, so as long as set/clear_in_cr4 is never called from irq (like
in switch_to with this patch), no locking would be required. If the
pagetable flush can be called from irqs (or alternatively if the
set/clear_in_cr4 can be called from irqs) then we'd need to use
test_and_set/clear_bit instead of normal C code despite the structure
being per-cpu, or despite reading the data from the cpu instead of
reading it from memory. In theory we could add a BUG_ON(in_interrupt())
to both, since both set/clear_in_cr4 and the flush_tlb_all aren't fast
paths (probably it worth it just in case).

Comments welcome, thanks!

  reply	other threads:[~2005-05-26 13:04 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-05-25 20:49 2.6.12-rc5-mm1 Andrew Morton
2005-05-25 21:37 ` 2.6.12-rc5-mm1 Alexandre Buisse
2005-05-25 21:51 ` 2.6.12-rc5-mm1 Brice Goglin
2005-05-25 21:58 ` 2.6.12-rc5-mm1 Brice Goglin
2005-05-26  5:29   ` 2.6.12-rc5-mm1 Yani Ioannou
2005-05-25 22:57 ` 2.6.12-rc5-mm1 Jesper Juhl
2005-05-26  1:17 ` 2.6.12-rc5-mm1 Matthew Dobson
2005-05-26  2:43 ` 2.6.12-rc5-mm1 Ed Tomlinson
2005-05-26  3:41   ` 2.6.12-rc5-mm1 Andrew Morton
2005-05-26  7:43     ` 2.6.12-rc5-mm1 J.A. Magallon
2005-05-26  7:58       ` 2.6.12-rc5-mm1 Andrew Morton
2005-05-26 13:54         ` 2.6.12-rc5-mm1 Rafael J. Wysocki
2005-05-26 20:45           ` 2.6.12-rc5-mm1 Andrew Morton
2005-05-26 21:04             ` 2.6.12-rc5-mm1 Lee Revell
2005-05-26 21:07             ` 2.6.12-rc5-mm1 Chris Wright
2005-05-27 10:29             ` 2.6.12-rc5-mm1 Rafael J. Wysocki
2005-05-27 17:38               ` 2.6.12-rc5-mm1 Chen, Kenneth W
2005-05-27 22:32                 ` 2.6.12-rc5-mm1 J.A. Magallon
2005-05-26 21:39         ` 2.6.12-rc5-mm1 J.A. Magallon
2005-05-26  7:44 ` 2.6.12-rc5-mm1 J.A. Magallon
2005-05-26  7:52   ` 2.6.12-rc5-mm1 Andrew Morton
2005-05-26  8:57 ` 2.6.12-rc5-mm1 Mikael Pettersson
2005-05-26 13:04   ` Andrea Arcangeli [this message]
2005-05-26 19:15     ` 2.6.12-rc5-mm1 Mikael Pettersson
2005-05-26 22:22       ` 2.6.12-rc5-mm1 Andrea Arcangeli
2005-05-27  2:47         ` 2.6.12-rc5-mm1 Andrea Arcangeli
2005-05-27 21:13 ` 2.6.12-rc5-mm1 Arnd Bergmann
2005-05-28  7:07   ` 2.6.12-rc5-mm1 Christoph Hellwig
2005-06-29 13:42     ` 2.6.12-rc5-mm1 Arnd Bergmann
2005-06-29 16:22       ` Xtensa syscalls (Was: Re: 2.6.12-rc5-mm1) Christian Zankel
2005-06-29 16:29         ` Christoph Hellwig
2005-06-29 16:47         ` Andrew Morton
2005-06-29 19:11         ` Arnd Bergmann
2005-05-27 22:21 ` Kill signed chars !!! [was Re: 2.6.12-rc5-mm1] J.A. Magallon
2005-05-27 23:46   ` Jesper Juhl
2005-06-21 12:54   ` Kill signed chars !!! => PPC uses unsigned chars Willy Tarreau
2005-06-21 14:23     ` cutaway
2005-06-21 21:13       ` J.A. Magallon
2005-05-29 14:26 ` 2.6.12-rc5-mm1: fork connector doesn't compile with gcc 2.95 Adrian Bunk
2005-05-29 14:38 ` 2.6.12-rc5-mm1: drivers/char/tpm/ compile errors " Adrian Bunk
2005-05-29 14:38 ` 2.6.12-rc5-mm1: drivers/dlm/: compile error " Adrian Bunk
2005-05-29 14:43   ` Matthias-Christian Ott
2005-05-29 15:00     ` Adrian Bunk
2005-05-29 14:45 ` 2.6.12-rc5-mm1: drivers/media/dvb/dvb-usb/a800.c compile error Adrian Bunk
2005-05-30  8:29   ` Patrick Boettcher
2005-05-30  9:14     ` Johannes Stezenbach
2005-05-30  9:30       ` Patrick Boettcher
2005-05-29 15:12 ` 2.6.12-rc5-mm1: drivers/usb/atm/speedtch.c: gcc 2.95 " Adrian Bunk
2005-05-30  7:45   ` Duncan Sands
2005-05-30  8:04     ` Andrew Morton
2005-05-30  8:16       ` Duncan Sands
2005-05-30 13:52 ` 2.6.12-rc5-mm1 Stefano Rivoir
2005-05-30 19:50 ` [-mm patch] drivers/message/i2o/device.c: i2o_parm_issue has to be global Adrian Bunk
2005-05-31 12:00 ` [PATCH 2.6.12-rc5-mm1] m32r: Insert set_tsk_need_resched() to cpu_idle() (was Re: 2.6.12-rc5-mm1) Hirokazu Takata
  -- strict thread matches above, loose matches on Subject: below --
2005-05-26  6:37 2.6.12-rc5-mm1 Martin J. Bligh
2005-05-26  6:40 ` 2.6.12-rc5-mm1 Martin J. Bligh
2005-05-26  6:47 ` 2.6.12-rc5-mm1 Andrew Morton
2005-05-26  7:05   ` 2.6.12-rc5-mm1 Martin J. Bligh
2005-05-26  7:14     ` 2.6.12-rc5-mm1 Martin J. Bligh
2005-05-26  7:23       ` 2.6.12-rc5-mm1 Martin J. Bligh
2005-05-26  7:24       ` 2.6.12-rc5-mm1 Andrew Morton
2005-05-26 11:09         ` 2.6.12-rc5-mm1 Roman Zippel
2005-05-26 14:48         ` 2.6.12-rc5-mm1 Steven Cole

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=20050526130402.GN5691@g5.random \
    --to=andrea@cpushare.com \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mikpe@csd.uu.se \
    /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