lkml.org 
[lkml]   [2003]   [Mar]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectBetter CLONE_SETTLS support for Hammer
-----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-----
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:33    [from the cache]
©2003-2014 Jasper Spaans. Advertise on this site