public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Andrea Arcangeli <andrea@cpushare.com>
To: unlisted-recipients:; (no To-header on input)
Cc: Mikael Pettersson <mikpe@csd.uu.se>,
	Andrew Morton <akpm@osdl.org>,
	linux-kernel@vger.kernel.org
Subject: Re: 2.6.12-rc5-mm1
Date: Fri, 27 May 2005 04:47:19 +0200	[thread overview]
Message-ID: <20050527024719.GV5691@g5.random> (raw)
In-Reply-To: <20050526222256.GS5691@g5.random>

Here an update that passed successfully basic testing verifying task
gets killed with sig11 if rdtsc is used in seccomp mode on x86-64 (i686
still untested but fully symmetric).

From: Andrea Arcangeli <andrea@cpushare.com>

I believe at least for seccomp it's worth to turn off the tsc, not just for
HT but for the L2 cache too.  So it's up to you, either you turn it off
completely (which isn't very nice IMHO) or I recommend to apply this below
patch.

This has been tested successfully on x86-64 against current cogito
repository (i686 compiles so I didn't bother testing ;).  People selling
the cpu through cpushare may appreciate this bit for a peace of mind. 

There's no way to get any timing info anymore with this applied
(gettimeofday is forbidden of course).  The seccomp environment is
completely deterministic so it can't be allowed to get timing info, it has
to be deterministic so in the future I can enable a computing mode that
does a parallel computing for each task with server side transparent
checkpointing and verification that the output is the same from all the 2/3
seller computers for each task, without the buyer even noticing (for now
the verification is left to the buyer client side and there's no
checkpointing, since that would require more kernel changes to track the
dirty bits but it'll be easy to extend once the basic mode is finished).

Eliminating a cold-cache read of the cr4 global variable will save one
cacheline during the tlb flush while making the code per-cpu-safe at the
same time. Thanks to Mikael Pettersson for noticing the tlb flush wasn't
per-cpu-safe. 

The global tlb flush can run from irq (IPI calling do_flush_tlb_all) but
it'll be transparent to the switch_to code since the IPI won't make any
change to the cr4 contents from the point of view of the interrupted
code and since it's now all per-cpu stuff, it will not race. So no need
to disable irqs in switch_to slow path.

Signed-off-by: Andrea Arcangeli <andrea@cpushare.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 arch/i386/kernel/process.c   |   21 +++++++++++++++++++++
 arch/x86_64/kernel/process.c |   21 +++++++++++++++++++++
 include/linux/seccomp.h      |    6 ++++++
 3 files changed, 48 insertions(+)

Index: arch/i386/kernel/process.c
===================================================================
--- 3ac9a34948049bff79a2b2ce49c0a3c84e35a748/arch/i386/kernel/process.c  (mode:100644)
+++ uncommitted/arch/i386/kernel/process.c  (mode:100644)
@@ -561,6 +561,25 @@
 }
 
 /*
+ * 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)) {
+			write_cr4(read_cr4() & ~X86_CR4_TSD);
+		} else if (!has_secure_computing(prev) &&
+			   has_secure_computing(next))
+			write_cr4(read_cr4() | X86_CR4_TSD);
+	}
+}
+
+/*
  *	switch_to(x,yn) should switch tasks from x to y.
  *
  * We fsave/fwait so that an exception goes off at the right time
@@ -639,6 +658,8 @@
 	if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr))
 		handle_io_bitmap(next, tss);
 
+	disable_tsc(prev_p->thread_info, next_p->thread_info);
+
 	return prev_p;
 }
 
Index: arch/x86_64/kernel/process.c
===================================================================
--- 3ac9a34948049bff79a2b2ce49c0a3c84e35a748/arch/x86_64/kernel/process.c  (mode:100644)
+++ uncommitted/arch/x86_64/kernel/process.c  (mode:100644)
@@ -439,6 +439,25 @@
 }
 
 /*
+ * 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)) {
+			write_cr4(read_cr4() & ~X86_CR4_TSD);
+		} else if (!has_secure_computing(prev) &&
+			   has_secure_computing(next))
+			write_cr4(read_cr4() | X86_CR4_TSD);
+	}
+}
+
+/*
  * This special macro can be used to load a debugging register
  */
 #define loaddebug(thread,r) set_debug(thread->debugreg ## r, r)
@@ -556,6 +575,8 @@
 		}
 	}
 
+	disable_tsc(prev_p->thread_info, next_p->thread_info);
+
 	return prev_p;
 }
 
Index: include/asm-i386/tlbflush.h
===================================================================
--- 3ac9a34948049bff79a2b2ce49c0a3c84e35a748/include/asm-i386/tlbflush.h  (mode:100644)
+++ uncommitted/include/asm-i386/tlbflush.h  (mode:100644)
@@ -22,16 +22,18 @@
  */
 #define __flush_tlb_global()						\
 	do {								\
-		unsigned int tmpreg;					\
+		unsigned int tmpreg, cr4, cr4_orig;			\
 									\
 		__asm__ __volatile__(					\
-			"movl %1, %%cr4;  # turn off PGE     \n"	\
+			"movl %%cr4, %2;  # turn off PGE     \n"	\
+			"movl %2, %1;                        \n"	\
+			"andl %3, %1;                        \n"	\
+			"movl %1, %%cr4;                     \n"	\
 			"movl %%cr3, %0;                     \n"	\
 			"movl %0, %%cr3;  # flush TLB        \n"	\
 			"movl %2, %%cr4;  # turn PGE back on \n"	\
-			: "=&r" (tmpreg)				\
-			: "r" (mmu_cr4_features & ~X86_CR4_PGE),	\
-			  "r" (mmu_cr4_features)			\
+			: "=&r" (tmpreg), "=&r" (cr4), "=&r" (cr4_orig)	\
+			: "i" (~X86_CR4_PGE)				\
 			: "memory");					\
 	} while (0)
 
Index: include/asm-x86_64/tlbflush.h
===================================================================
--- 3ac9a34948049bff79a2b2ce49c0a3c84e35a748/include/asm-x86_64/tlbflush.h  (mode:100644)
+++ uncommitted/include/asm-x86_64/tlbflush.h  (mode:100644)
@@ -22,16 +22,18 @@
  */
 #define __flush_tlb_global()						\
 	do {								\
-		unsigned long tmpreg;					\
+		unsigned long tmpreg, cr4, cr4_orig;			\
 									\
 		__asm__ __volatile__(					\
-			"movq %1, %%cr4;  # turn off PGE     \n"	\
+			"movq %%cr4, %2;  # turn off PGE     \n"	\
+			"movq %2, %1;                        \n"	\
+			"andq %3, %1;                        \n"	\
+			"movq %1, %%cr4;                     \n"	\
 			"movq %%cr3, %0;  # flush TLB        \n"	\
 			"movq %0, %%cr3;                     \n"	\
 			"movq %2, %%cr4;  # turn PGE back on \n"	\
-			: "=&r" (tmpreg)				\
-			: "r" (mmu_cr4_features & ~X86_CR4_PGE),	\
-			  "r" (mmu_cr4_features)			\
+			: "=&r" (tmpreg), "=&r" (cr4), "=&r" (cr4_orig)	\
+			: "i" (~X86_CR4_PGE)				\
 			: "memory");					\
 	} while (0)
 
Index: include/linux/seccomp.h
===================================================================
--- 3ac9a34948049bff79a2b2ce49c0a3c84e35a748/include/linux/seccomp.h  (mode:100644)
+++ uncommitted/include/linux/seccomp.h  (mode:100644)
@@ -19,6 +19,11 @@
 		__secure_computing(this_syscall);
 }
 
+static inline int has_secure_computing(struct thread_info *ti)
+{
+	return unlikely(test_ti_thread_flag(ti, TIF_SECCOMP));
+}
+
 #else /* CONFIG_SECCOMP */
 
 #if (__GNUC__ > 2)
@@ -28,6 +33,7 @@
 #endif
 
 #define secure_computing(x) do { } while (0)
+#define has_secure_computing(x) 0
 
 #endif /* CONFIG_SECCOMP */
 

  reply	other threads:[~2005-05-27  2:47 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   ` 2.6.12-rc5-mm1 Andrea Arcangeli
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         ` Andrea Arcangeli [this message]
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=20050527024719.GV5691@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