linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Better CLONE_SETTLS support for Hammer
@ 2003-03-05 18:55 Ulrich Drepper
  2003-03-05 19:06 ` Andi Kleen
  0 siblings, 1 reply; 18+ messages in thread
From: Ulrich Drepper @ 2003-03-05 18:55 UTC (permalink / raw)
  To: Andi Kleen; +Cc: Linux Kernel

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Andi,

Please consider using this patch which changes the way CLONE_SETTLS is
handled on Hammer completely.  The old approach was to slavishly follow
what x86 does with the desastrous result that TCBs (and therefore
stacks) could only be allocated in the low 4GB.  This would have been a
really bad limitation going forward.

But as it turns out the kernel already has support for handling %fs in a
different way, to support prctl(ARCH_SET_FS).  So let's just use the
same mechanism.  clone() will simply take an 64-bit address and use it
as if prctl() was called.

The changes are pretty minimal.  The appened patch is relative to the
current BK sources and they also incorporate the bug fix to use the
correct register for the SETTLS clone() parameter.


- --- arch/x86_64/kernel/process.c	2003-02-23 22:02:23.000000000 -0800
+++ arch/x86_64/kernel/process.c-new	2003-03-05 10:14:46.000000000 -0800
@@ -269,11 +269,18 @@

 	p->thread.rip = (unsigned long) ret_from_fork;

- -	p->thread.fs = me->thread.fs;
+	if ((clone_flags & CLONE_SETTLS) && !test_thread_flag(TIF_IA32)) {
+		if (regs->r8 >= TASK_SIZE)
+			return -EPERM;
+		p->thread.fs = regs->r8;
+		p->thread.fsindex = 0;
+	} else {
+		p->thread.fs = me->thread.fs;
+		asm("movl %%fs,%0" : "=m" (p->thread.fsindex));
+	}
 	p->thread.gs = me->thread.gs;

 	asm("movl %%gs,%0" : "=m" (p->thread.gsindex));
- -	asm("movl %%fs,%0" : "=m" (p->thread.fsindex));
 	asm("movl %%es,%0" : "=m" (p->thread.es));
 	asm("movl %%ds,%0" : "=m" (p->thread.ds));

@@ -291,14 +298,12 @@
 	/*
 	 * Set a new TLS for the child thread?
 	 */
- -	if (clone_flags & CLONE_SETTLS) {
+	if ((clone_flags & CLONE_SETTLS) && test_thread_flag(TIF_IA32)) {
 		struct n_desc_struct *desc;
 		struct user_desc info;
 		int idx;

- -		if (copy_from_user(&info, test_thread_flag(TIF_IA32) ?
- -								  (void *)childregs->rsi :
- -								  (void *)childregs->rdx, sizeof(info)))
+		if (copy_from_user(&info, (void *)childregs->rsi))
 			return -EFAULT;
 		if (LDT_empty(&info))
 			return -EINVAL;


- -- 
- --------------.                        ,-.            444 Castro Street
Ulrich Drepper \    ,-----------------'   \ Mountain View, CA 94041 USA
Red Hat         `--' drepper at redhat.com `---------------------------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+Zkg32ijCOnn/RHQRAr9cAKDL+9bmX26v4P6GRpAq11kzUrgDOwCdFcrk
RO3CMzlLQrEpO28itl0JdxM=
=YxTu
-----END PGP SIGNATURE-----


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

end of thread, other threads:[~2003-03-06 18:58 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-03-05 18:55 Better CLONE_SETTLS support for Hammer Ulrich Drepper
2003-03-05 19:06 ` Andi Kleen
2003-03-05 19:25   ` Ulrich Drepper
2003-03-05 21:19     ` Andi Kleen
2003-03-05 19:32   ` Ulrich Drepper
2003-03-05 21:21     ` Andi Kleen
2003-03-05 23:04       ` Ulrich Drepper
2003-03-06  1:05         ` Andi Kleen
2003-03-06  3:53           ` Ulrich Drepper
2003-03-06  4:14           ` Ulrich Drepper
2003-03-06 10:27             ` Andi Kleen
2003-03-06 18:58               ` Ulrich Drepper
2003-03-06 19:09                 ` Andi Kleen
2003-03-06  2:08         ` Benjamin LaHaise
2003-03-06  3:52           ` Ulrich Drepper
2003-03-06  5:29             ` Benjamin LaHaise
2003-03-06  5:47               ` Ulrich Drepper
2003-03-06  5:33   ` H. Peter Anvin

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).