linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/5] ppc64: make current preempt safe
@ 2006-10-31 18:39 Hugh Dickins
  2006-10-31 18:40 ` [PATCH 2/5] ppc64: make high hugepage areas " Hugh Dickins
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: Hugh Dickins @ 2006-10-31 18:39 UTC (permalink / raw)
  To: Paul Mackerras; +Cc: linuxppc-dev

Repeated -j20 kernel builds on a G5 Quad running an SMP PREEMPT kernel
would often collapse within a day, some exec failing with "Bad address".
In each case examined, load_elf_binary was doing a kernel_read, but
generic_file_aio_read's access_ok saw current->thread.fs.seg as USER_DS
instead of KERNEL_DS.

objdump of filemap.o shows gcc 4.1.0 emitting "mr r5,r13 ... ld r9,416(r5)"
here for get_paca()->__current, instead of the expected and much more usual
"ld r9,416(r13)"; I've seen other gcc4s do the same, but perhaps not gcc3s.

So, if the task is preempted and rescheduled on a different cpu in between
the mr and the ld, r5 will be looking at a different paca_struct from the
one it's now on, pick up the wrong __current, and perhaps the wrong seg.
Presumably much worse could happen elsewhere, though that split is rare.

Other architectures appear to be safe (x86_64's read_pda is more limiting
than get_paca), but ppc64 needs to force "current" into one instruction.

Signed-off-by: Hugh Dickins <hugh@veritas.com>
---
I think this patch should go into both 2.6.19 and 2.6.18-stable.

 include/asm-powerpc/current.h |   12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

--- 2.6.19-rc4/include/asm-powerpc/current.h	2006-03-20 05:53:29.000000000 +0000
+++ linux/include/asm-powerpc/current.h	2006-10-30 19:27:05.000000000 +0000
@@ -14,7 +14,17 @@ struct task_struct;
 #ifdef __powerpc64__
 #include <asm/paca.h>
 
-#define current		(get_paca()->__current)
+static inline struct task_struct *get_current(void)
+{
+	struct task_struct *task;
+
+	__asm__ __volatile__("ld %0,%1(13)"
+	: "=r" (task)
+	: "i" (offsetof(struct paca_struct, __current)));
+
+	return task;
+}
+#define current	get_current()
 
 #else
 

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2007-02-26 12:04 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-10-31 18:39 [PATCH 1/5] ppc64: make current preempt safe Hugh Dickins
2006-10-31 18:40 ` [PATCH 2/5] ppc64: make high hugepage areas " Hugh Dickins
2006-11-01  3:42   ` David Gibson
2006-10-31 18:41 ` [PATCH 3/5] ppc64: make mmiowb's io_sync " Hugh Dickins
2006-10-31 18:43 ` [PATCH 4/5] ppc64: make soft_enabled irqs " Hugh Dickins
2006-11-10  9:18   ` Paul Mackerras
2006-11-10 21:32     ` Hugh Dickins
2006-10-31 18:44 ` [PATCH 5/5] ppc64: support CONFIG_DEBUG_PREEMPT Hugh Dickins
2007-02-25 19:04 ` [PATCH] include stddef.h in asm-powerpc/current.h to get definition of offsetof Olaf Hering
2007-02-26 11:34   ` Hugh Dickins

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).