From: Ingo Molnar <mingo@elte.hu>
To: linux-kernel@vger.kernel.org
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Arjan van de Ven <arjan@infradead.org>,
Christoph Hellwig <hch@infradead.org>,
Andrew Morton <akpm@zip.com.au>,
Alan Cox <alan@lxorguk.ukuu.org.uk>,
Ulrich Drepper <drepper@redhat.com>,
Zach Brown <zach.brown@oracle.com>,
Evgeniy Polyakov <johnpol@2ka.mipt.ru>,
"David S. Miller" <davem@davemloft.net>,
Suparna Bhattacharya <suparna@in.ibm.com>,
Davide Libenzi <davidel@xmailserver.org>,
Jens Axboe <jens.axboe@oracle.com>,
Thomas Gleixner <tglx@linutronix.de>
Subject: [patch 06/13] x86: split FPU state from task state
Date: Wed, 21 Feb 2007 22:15:26 +0100 [thread overview]
Message-ID: <20070221211526.GF7579@elte.hu> (raw)
In-Reply-To: <20070221211355.GA7302@elte.hu>
From: Arjan van de Ven <arjan@linux.intel.com>
Split the FPU save area from the task struct. This allows easy migration
of FPU context, and it's generally cleaner. It also allows the following
two (future) optimizations:
1) allocate the right size for the actual cpu rather than 512 bytes always
2) only allocate when the application actually uses FPU, so in the first
lazy FPU trap. This could save memory for non-fpu using apps.
Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
arch/i386/kernel/i387.c | 96 ++++++++++++++++++++---------------------
arch/i386/kernel/process.c | 56 +++++++++++++++++++++++
arch/i386/kernel/traps.c | 10 ----
include/asm-i386/i387.h | 6 +-
include/asm-i386/processor.h | 6 ++
include/asm-i386/thread_info.h | 6 ++
kernel/fork.c | 7 ++
7 files changed, 123 insertions(+), 64 deletions(-)
Index: linux/arch/i386/kernel/i387.c
===================================================================
--- linux.orig/arch/i386/kernel/i387.c
+++ linux/arch/i386/kernel/i387.c
@@ -31,9 +31,9 @@ void mxcsr_feature_mask_init(void)
unsigned long mask = 0;
clts();
if (cpu_has_fxsr) {
- memset(¤t->thread.i387.fxsave, 0, sizeof(struct i387_fxsave_struct));
- asm volatile("fxsave %0" : : "m" (current->thread.i387.fxsave));
- mask = current->thread.i387.fxsave.mxcsr_mask;
+ memset(¤t->thread.i387->fxsave, 0, sizeof(struct i387_fxsave_struct));
+ asm volatile("fxsave %0" : : "m" (current->thread.i387->fxsave));
+ mask = current->thread.i387->fxsave.mxcsr_mask;
if (mask == 0) mask = 0x0000ffbf;
}
mxcsr_feature_mask &= mask;
@@ -49,16 +49,16 @@ void mxcsr_feature_mask_init(void)
void init_fpu(struct task_struct *tsk)
{
if (cpu_has_fxsr) {
- memset(&tsk->thread.i387.fxsave, 0, sizeof(struct i387_fxsave_struct));
- tsk->thread.i387.fxsave.cwd = 0x37f;
+ memset(&tsk->thread.i387->fxsave, 0, sizeof(struct i387_fxsave_struct));
+ tsk->thread.i387->fxsave.cwd = 0x37f;
if (cpu_has_xmm)
- tsk->thread.i387.fxsave.mxcsr = 0x1f80;
+ tsk->thread.i387->fxsave.mxcsr = 0x1f80;
} else {
- memset(&tsk->thread.i387.fsave, 0, sizeof(struct i387_fsave_struct));
- tsk->thread.i387.fsave.cwd = 0xffff037fu;
- tsk->thread.i387.fsave.swd = 0xffff0000u;
- tsk->thread.i387.fsave.twd = 0xffffffffu;
- tsk->thread.i387.fsave.fos = 0xffff0000u;
+ memset(&tsk->thread.i387->fsave, 0, sizeof(struct i387_fsave_struct));
+ tsk->thread.i387->fsave.cwd = 0xffff037fu;
+ tsk->thread.i387->fsave.swd = 0xffff0000u;
+ tsk->thread.i387->fsave.twd = 0xffffffffu;
+ tsk->thread.i387->fsave.fos = 0xffff0000u;
}
/* only the device not available exception or ptrace can call init_fpu */
set_stopped_child_used_math(tsk);
@@ -152,18 +152,18 @@ static inline unsigned long twd_fxsr_to_
unsigned short get_fpu_cwd( struct task_struct *tsk )
{
if ( cpu_has_fxsr ) {
- return tsk->thread.i387.fxsave.cwd;
+ return tsk->thread.i387->fxsave.cwd;
} else {
- return (unsigned short)tsk->thread.i387.fsave.cwd;
+ return (unsigned short)tsk->thread.i387->fsave.cwd;
}
}
unsigned short get_fpu_swd( struct task_struct *tsk )
{
if ( cpu_has_fxsr ) {
- return tsk->thread.i387.fxsave.swd;
+ return tsk->thread.i387->fxsave.swd;
} else {
- return (unsigned short)tsk->thread.i387.fsave.swd;
+ return (unsigned short)tsk->thread.i387->fsave.swd;
}
}
@@ -171,9 +171,9 @@ unsigned short get_fpu_swd( struct task_
unsigned short get_fpu_twd( struct task_struct *tsk )
{
if ( cpu_has_fxsr ) {
- return tsk->thread.i387.fxsave.twd;
+ return tsk->thread.i387->fxsave.twd;
} else {
- return (unsigned short)tsk->thread.i387.fsave.twd;
+ return (unsigned short)tsk->thread.i387->fsave.twd;
}
}
#endif /* 0 */
@@ -181,7 +181,7 @@ unsigned short get_fpu_twd( struct task_
unsigned short get_fpu_mxcsr( struct task_struct *tsk )
{
if ( cpu_has_xmm ) {
- return tsk->thread.i387.fxsave.mxcsr;
+ return tsk->thread.i387->fxsave.mxcsr;
} else {
return 0x1f80;
}
@@ -192,27 +192,27 @@ unsigned short get_fpu_mxcsr( struct tas
void set_fpu_cwd( struct task_struct *tsk, unsigned short cwd )
{
if ( cpu_has_fxsr ) {
- tsk->thread.i387.fxsave.cwd = cwd;
+ tsk->thread.i387->fxsave.cwd = cwd;
} else {
- tsk->thread.i387.fsave.cwd = ((long)cwd | 0xffff0000u);
+ tsk->thread.i387->fsave.cwd = ((long)cwd | 0xffff0000u);
}
}
void set_fpu_swd( struct task_struct *tsk, unsigned short swd )
{
if ( cpu_has_fxsr ) {
- tsk->thread.i387.fxsave.swd = swd;
+ tsk->thread.i387->fxsave.swd = swd;
} else {
- tsk->thread.i387.fsave.swd = ((long)swd | 0xffff0000u);
+ tsk->thread.i387->fsave.swd = ((long)swd | 0xffff0000u);
}
}
void set_fpu_twd( struct task_struct *tsk, unsigned short twd )
{
if ( cpu_has_fxsr ) {
- tsk->thread.i387.fxsave.twd = twd_i387_to_fxsr(twd);
+ tsk->thread.i387->fxsave.twd = twd_i387_to_fxsr(twd);
} else {
- tsk->thread.i387.fsave.twd = ((long)twd | 0xffff0000u);
+ tsk->thread.i387->fsave.twd = ((long)twd | 0xffff0000u);
}
}
@@ -298,8 +298,8 @@ static inline int save_i387_fsave( struc
struct task_struct *tsk = current;
unlazy_fpu( tsk );
- tsk->thread.i387.fsave.status = tsk->thread.i387.fsave.swd;
- if ( __copy_to_user( buf, &tsk->thread.i387.fsave,
+ tsk->thread.i387->fsave.status = tsk->thread.i387->fsave.swd;
+ if ( __copy_to_user( buf, &tsk->thread.i387->fsave,
sizeof(struct i387_fsave_struct) ) )
return -1;
return 1;
@@ -312,15 +312,15 @@ static int save_i387_fxsave( struct _fps
unlazy_fpu( tsk );
- if ( convert_fxsr_to_user( buf, &tsk->thread.i387.fxsave ) )
+ if ( convert_fxsr_to_user( buf, &tsk->thread.i387->fxsave ) )
return -1;
- err |= __put_user( tsk->thread.i387.fxsave.swd, &buf->status );
+ err |= __put_user( tsk->thread.i387->fxsave.swd, &buf->status );
err |= __put_user( X86_FXSR_MAGIC, &buf->magic );
if ( err )
return -1;
- if ( __copy_to_user( &buf->_fxsr_env[0], &tsk->thread.i387.fxsave,
+ if ( __copy_to_user( &buf->_fxsr_env[0], &tsk->thread.i387->fxsave,
sizeof(struct i387_fxsave_struct) ) )
return -1;
return 1;
@@ -343,7 +343,7 @@ int save_i387( struct _fpstate __user *b
return save_i387_fsave( buf );
}
} else {
- return save_i387_soft( ¤t->thread.i387.soft, buf );
+ return save_i387_soft( ¤t->thread.i387->soft, buf );
}
}
@@ -351,7 +351,7 @@ static inline int restore_i387_fsave( st
{
struct task_struct *tsk = current;
clear_fpu( tsk );
- return __copy_from_user( &tsk->thread.i387.fsave, buf,
+ return __copy_from_user( &tsk->thread.i387->fsave, buf,
sizeof(struct i387_fsave_struct) );
}
@@ -360,11 +360,11 @@ static int restore_i387_fxsave( struct _
int err;
struct task_struct *tsk = current;
clear_fpu( tsk );
- err = __copy_from_user( &tsk->thread.i387.fxsave, &buf->_fxsr_env[0],
+ err = __copy_from_user( &tsk->thread.i387->fxsave, &buf->_fxsr_env[0],
sizeof(struct i387_fxsave_struct) );
/* mxcsr reserved bits must be masked to zero for security reasons */
- tsk->thread.i387.fxsave.mxcsr &= mxcsr_feature_mask;
- return err ? 1 : convert_fxsr_from_user( &tsk->thread.i387.fxsave, buf );
+ tsk->thread.i387->fxsave.mxcsr &= mxcsr_feature_mask;
+ return err ? 1 : convert_fxsr_from_user( &tsk->thread.i387->fxsave, buf );
}
int restore_i387( struct _fpstate __user *buf )
@@ -378,7 +378,7 @@ int restore_i387( struct _fpstate __user
err = restore_i387_fsave( buf );
}
} else {
- err = restore_i387_soft( ¤t->thread.i387.soft, buf );
+ err = restore_i387_soft( ¤t->thread.i387->soft, buf );
}
set_used_math();
return err;
@@ -391,7 +391,7 @@ int restore_i387( struct _fpstate __user
static inline int get_fpregs_fsave( struct user_i387_struct __user *buf,
struct task_struct *tsk )
{
- return __copy_to_user( buf, &tsk->thread.i387.fsave,
+ return __copy_to_user( buf, &tsk->thread.i387->fsave,
sizeof(struct user_i387_struct) );
}
@@ -399,7 +399,7 @@ static inline int get_fpregs_fxsave( str
struct task_struct *tsk )
{
return convert_fxsr_to_user( (struct _fpstate __user *)buf,
- &tsk->thread.i387.fxsave );
+ &tsk->thread.i387->fxsave );
}
int get_fpregs( struct user_i387_struct __user *buf, struct task_struct *tsk )
@@ -411,7 +411,7 @@ int get_fpregs( struct user_i387_struct
return get_fpregs_fsave( buf, tsk );
}
} else {
- return save_i387_soft( &tsk->thread.i387.soft,
+ return save_i387_soft( &tsk->thread.i387->soft,
(struct _fpstate __user *)buf );
}
}
@@ -419,14 +419,14 @@ int get_fpregs( struct user_i387_struct
static inline int set_fpregs_fsave( struct task_struct *tsk,
struct user_i387_struct __user *buf )
{
- return __copy_from_user( &tsk->thread.i387.fsave, buf,
+ return __copy_from_user( &tsk->thread.i387->fsave, buf,
sizeof(struct user_i387_struct) );
}
static inline int set_fpregs_fxsave( struct task_struct *tsk,
struct user_i387_struct __user *buf )
{
- return convert_fxsr_from_user( &tsk->thread.i387.fxsave,
+ return convert_fxsr_from_user( &tsk->thread.i387->fxsave,
(struct _fpstate __user *)buf );
}
@@ -439,7 +439,7 @@ int set_fpregs( struct task_struct *tsk,
return set_fpregs_fsave( tsk, buf );
}
} else {
- return restore_i387_soft( &tsk->thread.i387.soft,
+ return restore_i387_soft( &tsk->thread.i387->soft,
(struct _fpstate __user *)buf );
}
}
@@ -447,7 +447,7 @@ int set_fpregs( struct task_struct *tsk,
int get_fpxregs( struct user_fxsr_struct __user *buf, struct task_struct *tsk )
{
if ( cpu_has_fxsr ) {
- if (__copy_to_user( buf, &tsk->thread.i387.fxsave,
+ if (__copy_to_user( buf, &tsk->thread.i387->fxsave,
sizeof(struct user_fxsr_struct) ))
return -EFAULT;
return 0;
@@ -461,11 +461,11 @@ int set_fpxregs( struct task_struct *tsk
int ret = 0;
if ( cpu_has_fxsr ) {
- if (__copy_from_user( &tsk->thread.i387.fxsave, buf,
+ if (__copy_from_user( &tsk->thread.i387->fxsave, buf,
sizeof(struct user_fxsr_struct) ))
ret = -EFAULT;
/* mxcsr reserved bits must be masked to zero for security reasons */
- tsk->thread.i387.fxsave.mxcsr &= mxcsr_feature_mask;
+ tsk->thread.i387->fxsave.mxcsr &= mxcsr_feature_mask;
} else {
ret = -EIO;
}
@@ -479,7 +479,7 @@ int set_fpxregs( struct task_struct *tsk
static inline void copy_fpu_fsave( struct task_struct *tsk,
struct user_i387_struct *fpu )
{
- memcpy( fpu, &tsk->thread.i387.fsave,
+ memcpy( fpu, &tsk->thread.i387->fsave,
sizeof(struct user_i387_struct) );
}
@@ -490,10 +490,10 @@ static inline void copy_fpu_fxsave( stru
unsigned short *from;
int i;
- memcpy( fpu, &tsk->thread.i387.fxsave, 7 * sizeof(long) );
+ memcpy( fpu, &tsk->thread.i387->fxsave, 7 * sizeof(long) );
to = (unsigned short *)&fpu->st_space[0];
- from = (unsigned short *)&tsk->thread.i387.fxsave.st_space[0];
+ from = (unsigned short *)&tsk->thread.i387->fxsave.st_space[0];
for ( i = 0 ; i < 8 ; i++, to += 5, from += 8 ) {
memcpy( to, from, 5 * sizeof(unsigned short) );
}
@@ -540,7 +540,7 @@ int dump_task_extended_fpu(struct task_s
if (fpvalid) {
if (tsk == current)
unlazy_fpu(tsk);
- memcpy(fpu, &tsk->thread.i387.fxsave, sizeof(*fpu));
+ memcpy(fpu, &tsk->thread.i387->fxsave, sizeof(*fpu));
}
return fpvalid;
}
Index: linux/arch/i386/kernel/process.c
===================================================================
--- linux.orig/arch/i386/kernel/process.c
+++ linux/arch/i386/kernel/process.c
@@ -645,7 +645,7 @@ struct task_struct fastcall * __switch_t
/* we're going to use this soon, after a few expensive things */
if (next_p->fpu_counter > 5)
- prefetch(&next->i387.fxsave);
+ prefetch(&next->i387->fxsave);
/*
* Reload esp0.
@@ -908,3 +908,57 @@ unsigned long arch_align_stack(unsigned
sp -= get_random_int() % 8192;
return sp & ~0xf;
}
+
+
+
+struct kmem_cache *task_struct_cachep;
+struct kmem_cache *task_i387_cachep;
+
+struct task_struct * alloc_task_struct(void)
+{
+ struct task_struct *tsk;
+ tsk = kmem_cache_alloc(task_struct_cachep, GFP_KERNEL);
+ if (!tsk)
+ return NULL;
+ tsk->thread.i387 = kmem_cache_alloc(task_i387_cachep, GFP_KERNEL);
+ if (!tsk->thread.i387)
+ goto error;
+ WARN_ON((unsigned long)tsk->thread.i387 & 15);
+ return tsk;
+
+error:
+ kfree(tsk);
+ return NULL;
+}
+
+void memcpy_task_struct(struct task_struct *dst, struct task_struct *src)
+{
+ union i387_union *ptr;
+ ptr = dst->thread.i387;
+ *dst = *src;
+ dst->thread.i387 = ptr;
+ memcpy(dst->thread.i387, src->thread.i387, sizeof(union i387_union));
+}
+
+void free_task_struct(struct task_struct *tsk)
+{
+ kmem_cache_free(task_i387_cachep, tsk->thread.i387);
+ tsk->thread.i387=NULL;
+ kmem_cache_free(task_struct_cachep, tsk);
+}
+
+
+void task_struct_slab_init(void)
+{
+ /* create a slab on which task_structs can be allocated */
+ task_struct_cachep =
+ kmem_cache_create("task_struct", sizeof(struct task_struct),
+ ARCH_MIN_TASKALIGN, SLAB_PANIC, NULL, NULL);
+ task_i387_cachep =
+ kmem_cache_create("task_i387", sizeof(union i387_union), 32,
+ SLAB_PANIC | SLAB_MUST_HWCACHE_ALIGN, NULL, NULL);
+}
+
+
+/* the very init task needs a static allocated i387 area */
+union i387_union init_i387_context;
Index: linux/arch/i386/kernel/traps.c
===================================================================
--- linux.orig/arch/i386/kernel/traps.c
+++ linux/arch/i386/kernel/traps.c
@@ -1154,16 +1154,6 @@ void __init trap_init(void)
set_trap_gate(19,&simd_coprocessor_error);
if (cpu_has_fxsr) {
- /*
- * Verify that the FXSAVE/FXRSTOR data will be 16-byte aligned.
- * Generates a compile-time "error: zero width for bit-field" if
- * the alignment is wrong.
- */
- struct fxsrAlignAssert {
- int _:!(offsetof(struct task_struct,
- thread.i387.fxsave) & 15);
- };
-
printk(KERN_INFO "Enabling fast FPU save and restore... ");
set_in_cr4(X86_CR4_OSFXSR);
printk("done.\n");
Index: linux/include/asm-i386/i387.h
===================================================================
--- linux.orig/include/asm-i386/i387.h
+++ linux/include/asm-i386/i387.h
@@ -34,7 +34,7 @@ extern void init_fpu(struct task_struct
"nop ; frstor %1", \
"fxrstor %1", \
X86_FEATURE_FXSR, \
- "m" ((tsk)->thread.i387.fxsave))
+ "m" ((tsk)->thread.i387->fxsave))
extern void kernel_fpu_begin(void);
#define kernel_fpu_end() do { stts(); preempt_enable(); } while(0)
@@ -60,8 +60,8 @@ static inline void __save_init_fpu( stru
"fxsave %[fx]\n"
"bt $7,%[fsw] ; jnc 1f ; fnclex\n1:",
X86_FEATURE_FXSR,
- [fx] "m" (tsk->thread.i387.fxsave),
- [fsw] "m" (tsk->thread.i387.fxsave.swd) : "memory");
+ [fx] "m" (tsk->thread.i387->fxsave),
+ [fsw] "m" (tsk->thread.i387->fxsave.swd) : "memory");
/* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception
is pending. Clear the x87 state here by setting it to fixed
values. safe_address is a random variable that should be in L1 */
Index: linux/include/asm-i386/processor.h
===================================================================
--- linux.orig/include/asm-i386/processor.h
+++ linux/include/asm-i386/processor.h
@@ -407,7 +407,7 @@ struct thread_struct {
/* fault info */
unsigned long cr2, trap_no, error_code;
/* floating point info */
- union i387_union i387;
+ union i387_union *i387;
/* virtual 86 mode info */
struct vm86_struct __user * vm86_info;
unsigned long screen_bitmap;
@@ -420,11 +420,15 @@ struct thread_struct {
unsigned long io_bitmap_max;
};
+
+extern union i387_union init_i387_context;
+
#define INIT_THREAD { \
.vm86_info = NULL, \
.sysenter_cs = __KERNEL_CS, \
.io_bitmap_ptr = NULL, \
.gs = __KERNEL_PDA, \
+ .i387 = &init_i387_context, \
}
/*
Index: linux/include/asm-i386/thread_info.h
===================================================================
--- linux.orig/include/asm-i386/thread_info.h
+++ linux/include/asm-i386/thread_info.h
@@ -102,6 +102,12 @@ static inline struct thread_info *curren
#define free_thread_info(info) kfree(info)
+#define __HAVE_ARCH_TASK_STRUCT_ALLOCATOR
+extern struct task_struct * alloc_task_struct(void);
+extern void free_task_struct(struct task_struct *tsk);
+extern void memcpy_task_struct(struct task_struct *dst, struct task_struct *src);
+extern void task_struct_slab_init(void);
+
#else /* !__ASSEMBLY__ */
/* how to get the thread information struct from ASM */
Index: linux/kernel/fork.c
===================================================================
--- linux.orig/kernel/fork.c
+++ linux/kernel/fork.c
@@ -84,6 +84,8 @@ int nr_processes(void)
#ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR
# define alloc_task_struct() kmem_cache_alloc(task_struct_cachep, GFP_KERNEL)
# define free_task_struct(tsk) kmem_cache_free(task_struct_cachep, (tsk))
+# define memcpy_task_struct(dst, src) *dst = *src;
+
static struct kmem_cache *task_struct_cachep;
#endif
@@ -138,6 +140,8 @@ void __init fork_init(unsigned long memp
task_struct_cachep =
kmem_cache_create("task_struct", sizeof(struct task_struct),
ARCH_MIN_TASKALIGN, SLAB_PANIC, NULL, NULL);
+#else
+ task_struct_slab_init();
#endif
/*
@@ -176,7 +180,8 @@ static struct task_struct *dup_task_stru
return NULL;
}
- *tsk = *orig;
+ memcpy_task_struct(tsk, orig);
+
tsk->thread_info = ti;
setup_thread_stack(tsk, orig);
next prev parent reply other threads:[~2007-02-21 21:23 UTC|newest]
Thread overview: 337+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-21 21:13 [patch 00/13] Syslets, "Threadlets", generic AIO support, v3 Ingo Molnar
2007-02-21 21:14 ` [patch 01/13] syslets: add async.h include file, kernel-side API definitions Ingo Molnar
2007-02-21 21:15 ` [patch 02/13] syslets: add syslet.h include file, user API/ABI definitions Ingo Molnar
2007-02-21 21:15 ` [patch 03/13] syslets: generic kernel bits Ingo Molnar
2007-02-21 21:15 ` [patch 04/13] syslets: core code Ingo Molnar
2007-02-23 23:08 ` Davide Libenzi
2007-02-24 7:04 ` Ingo Molnar
2007-02-24 21:10 ` Davide Libenzi
2007-02-24 22:08 ` Kyle Moffett
2007-02-24 22:25 ` Davide Libenzi
2007-02-25 7:59 ` Ingo Molnar
2007-02-21 21:15 ` [patch 05/13] syslets: core, documentation Ingo Molnar
2007-02-26 21:32 ` Randy Dunlap
2007-02-27 6:20 ` Ingo Molnar
2007-02-21 21:15 ` Ingo Molnar [this message]
2007-02-21 21:15 ` [patch 07/13] syslets: x86, add create_async_thread() method Ingo Molnar
2007-02-21 21:15 ` [patch 08/13] syslets: x86, add move_user_context() method Ingo Molnar
2007-02-21 23:03 ` Davide Libenzi
2007-02-21 23:20 ` Ingo Molnar
2007-02-22 4:10 ` Davide Libenzi
2007-02-21 21:15 ` [patch 09/13] syslets: x86, mark async unsafe syscalls Ingo Molnar
2007-02-21 21:15 ` [patch 10/13] syslets: x86: enable ASYNC_SUPPORT Ingo Molnar
2007-02-21 21:15 ` [patch 11/13] syslets: x86, wire up the syslet system calls Ingo Molnar
2007-02-21 21:15 ` [patch 12/13] syslets: x86: optimized copy_uatom() Ingo Molnar
2007-02-21 21:16 ` [patch 13/13] syslets: x86: optimized sys_umem_add() Ingo Molnar
2007-02-21 22:46 ` [patch 00/13] Syslets, "Threadlets", generic AIO support, v3 Michael K. Edwards
2007-02-21 22:57 ` Ingo Molnar
2007-02-22 0:53 ` Michael K. Edwards
2007-02-22 1:33 ` Michael K. Edwards
2007-02-22 6:51 ` Ingo Molnar
2007-02-22 8:59 ` Michael K. Edwards
2007-02-22 19:52 ` x86 hardware and transputers (Re: [patch 00/13] Syslets, "Threadlets", generic AIO support, v3) Oleg Verych
2007-02-22 20:45 ` Michael K. Edwards
2007-02-21 23:03 ` [patch 00/13] Syslets, "Threadlets", generic AIO support, v3 Ingo Molnar
2007-02-21 23:24 ` Ingo Molnar
2007-02-22 0:55 ` Michael K. Edwards
2007-02-21 23:31 ` Ingo Molnar
2007-02-21 23:46 ` Ulrich Drepper
2007-02-22 7:40 ` Ingo Molnar
2007-02-22 11:31 ` Evgeniy Polyakov
2007-02-22 11:52 ` Arjan van de Ven
2007-02-22 12:39 ` Evgeniy Polyakov
2007-02-22 13:41 ` David Miller
2007-02-22 14:31 ` Ingo Molnar
2007-02-22 14:47 ` David Miller
2007-02-22 15:02 ` Evgeniy Polyakov
2007-02-22 15:15 ` Ingo Molnar
2007-02-22 15:29 ` Ingo Molnar
2007-02-22 17:17 ` David Miller
2007-02-23 11:12 ` Ingo Molnar
2007-02-22 20:13 ` Davide Libenzi
2007-02-22 21:30 ` Zach Brown
2007-02-22 14:59 ` Ingo Molnar
2007-02-22 21:42 ` Michael K. Edwards
2007-02-22 14:53 ` Avi Kivity
2007-02-22 12:59 ` Ingo Molnar
2007-02-22 13:32 ` Evgeniy Polyakov
2007-02-22 19:46 ` Davide Libenzi
2007-02-23 12:15 ` Evgeniy Polyakov
2007-02-23 17:43 ` Davide Libenzi
2007-02-23 18:01 ` Evgeniy Polyakov
2007-02-23 20:43 ` Davide Libenzi
2007-02-23 11:51 ` Ingo Molnar
2007-02-23 12:22 ` Evgeniy Polyakov
2007-02-23 12:41 ` Evgeniy Polyakov
2007-02-25 17:45 ` Ingo Molnar
2007-02-25 18:09 ` Evgeniy Polyakov
2007-02-25 19:04 ` Ingo Molnar
2007-02-25 19:42 ` Evgeniy Polyakov
2007-02-25 20:38 ` Ingo Molnar
2007-02-26 12:39 ` Ingo Molnar
2007-02-26 14:05 ` Evgeniy Polyakov
2007-02-26 14:15 ` Ingo Molnar
2007-02-26 16:55 ` Evgeniy Polyakov
2007-02-26 20:35 ` Ingo Molnar
2007-02-26 22:06 ` Bill Huey
2007-02-27 10:09 ` Evgeniy Polyakov
2007-02-27 17:13 ` Pavel Machek
2007-02-27 2:18 ` Davide Libenzi
2007-02-27 10:13 ` Evgeniy Polyakov
2007-02-27 16:01 ` Davide Libenzi
2007-02-27 16:21 ` Evgeniy Polyakov
2007-02-27 16:58 ` Eric Dumazet
2007-02-27 17:06 ` Evgeniy Polyakov
2007-02-27 19:20 ` Davide Libenzi
2007-02-26 19:47 ` Davide Libenzi
2007-02-25 23:14 ` Michael K. Edwards
2007-02-22 14:17 ` Suparna Bhattacharya
2007-02-22 14:36 ` Ingo Molnar
2007-02-23 14:23 ` Suparna Bhattacharya
2007-02-22 21:24 ` Michael K. Edwards
2007-02-23 0:30 ` Alan
2007-02-23 2:47 ` Michael K. Edwards
2007-02-23 8:31 ` Michael K. Edwards
2007-02-23 10:22 ` Ingo Molnar
2007-02-23 12:37 ` Alan
2007-02-23 23:49 ` Michael K. Edwards
2007-02-24 1:08 ` Alan
2007-02-24 0:51 ` Michael K. Edwards
2007-02-24 2:17 ` Michael K. Edwards
2007-02-24 3:25 ` Michael K. Edwards
2007-02-23 12:17 ` Ingo Molnar
2007-02-24 19:52 ` Michael K. Edwards
2007-02-24 21:04 ` Davide Libenzi
2007-02-24 23:01 ` Michael K. Edwards
2007-02-25 22:44 ` Linus Torvalds
2007-02-26 13:11 ` Ingo Molnar
2007-02-26 17:37 ` Evgeniy Polyakov
2007-02-26 18:19 ` Arjan van de Ven
2007-02-26 18:38 ` Evgeniy Polyakov
2007-02-26 18:56 ` Chris Friesen
2007-02-26 19:20 ` Evgeniy Polyakov
2007-02-26 17:28 ` Evgeniy Polyakov
2007-02-26 17:57 ` Linus Torvalds
2007-02-26 18:32 ` Evgeniy Polyakov
2007-02-26 19:22 ` Linus Torvalds
2007-02-26 19:30 ` Evgeniy Polyakov
2007-02-26 20:04 ` Linus Torvalds
2007-02-27 8:09 ` Evgeniy Polyakov
2007-02-26 19:54 ` Ingo Molnar
2007-02-27 10:28 ` Evgeniy Polyakov
2007-02-27 11:52 ` Theodore Tso
2007-02-27 12:11 ` Evgeniy Polyakov
2007-02-27 12:13 ` Ingo Molnar
2007-02-27 12:40 ` Evgeniy Polyakov
2007-02-28 16:14 ` Pavel Machek
2007-03-01 8:18 ` Evgeniy Polyakov
2007-03-01 9:26 ` Pavel Machek
2007-03-01 9:47 ` Evgeniy Polyakov
2007-03-01 9:54 ` Ingo Molnar
2007-03-01 10:59 ` Evgeniy Polyakov
2007-03-01 11:00 ` Ingo Molnar
2007-03-01 11:16 ` Evgeniy Polyakov
2007-03-01 11:27 ` Ingo Molnar
2007-03-01 11:36 ` Evgeniy Polyakov
2007-03-01 11:41 ` Ingo Molnar
2007-03-01 11:47 ` Ingo Molnar
2007-03-01 12:10 ` Evgeniy Polyakov
2007-03-01 12:43 ` Ingo Molnar
2007-03-01 13:01 ` Evgeniy Polyakov
2007-03-01 13:11 ` Ingo Molnar
2007-03-01 13:30 ` Evgeniy Polyakov
2007-03-01 14:19 ` Eric Dumazet
2007-03-01 14:16 ` Ingo Molnar
2007-03-01 14:31 ` Eric Dumazet
2007-03-01 14:27 ` Ingo Molnar
2007-03-01 14:54 ` Evgeniy Polyakov
2007-03-01 15:09 ` Ingo Molnar
2007-03-01 15:36 ` Evgeniy Polyakov
2007-03-02 10:57 ` Ingo Molnar
2007-03-02 11:48 ` Evgeniy Polyakov
2007-03-02 17:32 ` Davide Libenzi
2007-03-02 19:39 ` Ingo Molnar
2007-03-02 20:18 ` Davide Libenzi
2007-03-02 20:29 ` Ingo Molnar
2007-03-02 20:53 ` Davide Libenzi
2007-03-02 21:21 ` Michael K. Edwards
2007-03-02 21:43 ` Nicholas Miell
2007-03-03 0:52 ` Davide Libenzi
2007-03-03 1:36 ` Nicholas Miell
2007-03-03 1:48 ` Benjamin LaHaise
2007-03-03 2:19 ` Davide Libenzi
2007-03-03 7:19 ` Ingo Molnar
2007-03-03 7:20 ` Ingo Molnar
2007-03-03 9:02 ` Davide Libenzi
2007-03-01 19:31 ` Davide Libenzi
2007-03-02 8:10 ` Evgeniy Polyakov
2007-03-02 17:13 ` Davide Libenzi
2007-03-02 19:13 ` Davide Libenzi
2007-03-03 10:06 ` Evgeniy Polyakov
2007-03-03 18:46 ` Davide Libenzi
2007-03-03 20:31 ` Evgeniy Polyakov
2007-03-03 21:57 ` Davide Libenzi
2007-03-03 22:10 ` Davide Libenzi
2007-03-04 16:23 ` Kirk Kuchov
2007-03-04 17:46 ` Kyle Moffett
2007-03-05 5:23 ` Michael K. Edwards
2007-03-04 21:17 ` Davide Libenzi
2007-03-04 22:49 ` Kirk Kuchov
2007-03-04 22:57 ` Davide Libenzi
2007-03-05 4:46 ` Magnus Naeslund(k)
2007-03-06 8:19 ` Pavel Machek
2007-03-07 12:02 ` Kirk Kuchov
2007-03-07 17:26 ` Linus Torvalds
2007-03-07 17:39 ` Ingo Molnar
2007-03-07 18:21 ` Kirk Kuchov
2007-03-07 18:24 ` Jens Axboe
2007-03-07 18:32 ` Evgeniy Polyakov
2007-03-01 12:01 ` Evgeniy Polyakov
2007-03-01 11:14 ` Eric Dumazet
2007-03-01 11:20 ` Evgeniy Polyakov
2007-03-01 11:28 ` Eric Dumazet
2007-03-01 11:47 ` Evgeniy Polyakov
2007-03-01 13:12 ` Eric Dumazet
2007-03-01 14:43 ` Evgeniy Polyakov
2007-03-01 14:47 ` Ingo Molnar
2007-03-01 15:23 ` Evgeniy Polyakov
2007-03-01 15:32 ` Eric Dumazet
2007-03-01 15:41 ` Eric Dumazet
2007-03-01 15:51 ` Evgeniy Polyakov
2007-03-01 15:47 ` Evgeniy Polyakov
2007-03-01 19:47 ` Davide Libenzi
2007-03-01 14:57 ` Evgeniy Polyakov
2007-03-01 12:19 ` Evgeniy Polyakov
2007-03-01 12:34 ` Ingo Molnar
2007-03-01 13:26 ` Evgeniy Polyakov
2007-03-01 13:32 ` Ingo Molnar
2007-03-01 14:24 ` Evgeniy Polyakov
2007-03-01 16:56 ` David Lang
2007-03-01 17:56 ` Evgeniy Polyakov
2007-03-01 18:41 ` David Lang
2007-03-01 19:19 ` Davide Libenzi
2007-03-01 10:11 ` Pavel Machek
2007-03-01 10:19 ` Ingo Molnar
2007-03-01 11:18 ` Evgeniy Polyakov
2007-03-02 10:27 ` Pavel Machek
2007-03-02 10:37 ` Evgeniy Polyakov
2007-03-02 10:56 ` Ingo Molnar
2007-03-02 11:08 ` Evgeniy Polyakov
2007-03-02 17:28 ` Davide Libenzi
2007-03-03 10:27 ` Evgeniy Polyakov
2007-03-01 19:24 ` Johann Borck
2007-03-01 19:37 ` David Lang
2007-03-01 20:34 ` Johann Borck
2007-02-27 12:34 ` Ingo Molnar
2007-02-27 13:14 ` Evgeniy Polyakov
2007-02-27 13:32 ` Avi Kivity
2007-02-28 3:03 ` Michael K. Edwards
2007-02-28 8:02 ` Evgeniy Polyakov
2007-02-28 17:01 ` Michael K. Edwards
2007-03-05 2:16 ` Discussing LKML community [OT from the Re: [patch 00/13] Syslets, "Threadlets", generic AIO support, v3] Oleg Verych
2007-02-28 16:38 ` [patch 00/13] Syslets, "Threadlets", generic AIO support, v3 Phillip Susi
2007-02-22 19:38 ` Davide Libenzi
2007-02-28 9:45 ` Ingo Molnar
2007-02-28 16:17 ` Davide Libenzi
2007-02-28 16:42 ` Linus Torvalds
2007-02-28 17:26 ` Ingo Molnar
2007-02-28 18:22 ` Davide Libenzi
2007-02-28 18:42 ` Linus Torvalds
2007-02-28 18:50 ` Davide Libenzi
2007-02-28 19:03 ` Chris Friesen
2007-02-28 19:42 ` Davide Libenzi
2007-03-01 8:38 ` Evgeniy Polyakov
2007-03-01 9:28 ` Evgeniy Polyakov
2007-02-28 23:12 ` Ingo Molnar
2007-03-01 1:33 ` Andrea Arcangeli
2007-03-01 9:15 ` Evgeniy Polyakov
2007-03-01 21:27 ` Linus Torvalds
2007-02-28 20:21 ` Ingo Molnar
2007-02-28 21:09 ` Davide Libenzi
2007-02-28 21:23 ` Ingo Molnar
2007-02-28 21:46 ` Davide Libenzi
2007-02-28 22:22 ` Ingo Molnar
2007-02-28 22:47 ` Davide Libenzi
2007-02-22 21:23 ` Zach Brown
2007-02-22 21:32 ` Benjamin LaHaise
2007-02-22 21:44 ` Zach Brown
2007-02-22 1:04 ` Michael K. Edwards
2007-02-22 7:00 ` Ingo Molnar
2007-02-22 9:29 ` Michael K. Edwards
2007-02-22 10:01 ` Suparna Bhattacharya
2007-02-22 11:20 ` Ingo Molnar
2007-02-23 12:52 ` A quick fio test (was Re: [patch 00/13] Syslets, "Threadlets", generic AIO support, v3) Jens Axboe
2007-02-23 13:55 ` Suparna Bhattacharya
2007-02-23 14:58 ` Ingo Molnar
2007-02-23 15:15 ` Suparna Bhattacharya
2007-02-23 16:25 ` Jens Axboe
2007-02-23 17:13 ` Suparna Bhattacharya
2007-02-23 18:35 ` Jens Axboe
2007-02-26 13:57 ` Jens Axboe
2007-02-26 14:13 ` Suparna Bhattacharya
2007-02-26 14:18 ` Ingo Molnar
2007-02-26 14:45 ` Jens Axboe
2007-02-27 4:33 ` Suparna Bhattacharya
2007-02-27 9:42 ` Jens Axboe
2007-02-27 11:12 ` Evgeniy Polyakov
2007-02-27 11:29 ` Jens Axboe
2007-02-27 12:19 ` Evgeniy Polyakov
2007-02-27 18:45 ` Jens Axboe
2007-02-27 19:08 ` Evgeniy Polyakov
2007-02-27 19:25 ` Jens Axboe
2007-02-27 12:39 ` Suparna Bhattacharya
2007-02-28 8:31 ` Jens Axboe
2007-02-28 8:38 ` Ingo Molnar
2007-02-28 9:07 ` Jens Axboe
2007-02-27 13:54 ` Avi Kivity
2007-02-27 15:25 ` Ingo Molnar
2007-02-27 16:15 ` Avi Kivity
2007-02-27 16:16 ` Ingo Molnar
2007-02-27 16:26 ` Avi Kivity
2007-02-27 18:49 ` Jens Axboe
2007-02-26 21:40 ` Davide Libenzi
2007-02-23 16:59 ` Ingo Molnar
2007-02-23 22:31 ` Joel Becker
2007-02-24 12:18 ` Jens Axboe
2007-02-24 7:41 ` [patchset] Syslets/threadlets, generic AIO support, v4 Ingo Molnar
2007-02-24 18:34 ` [patch 00/13] Syslets, "Threadlets", generic AIO support, v3 Evgeniy Polyakov
2007-02-25 17:23 ` Ingo Molnar
2007-02-25 17:44 ` Evgeniy Polyakov
2007-02-25 17:54 ` Ingo Molnar
2007-02-25 18:21 ` Evgeniy Polyakov
2007-02-25 18:22 ` Ingo Molnar
2007-02-25 18:37 ` Evgeniy Polyakov
2007-02-25 18:34 ` Ingo Molnar
2007-02-25 20:01 ` Frederik Deweerdt
2007-02-25 19:21 ` Ingo Molnar
[not found] ` <20070225194645.GB1353@2ka.mipt.ru>
[not found] ` <20070225195308.GC15681@elte.hu>
[not found] ` <Pine.LNX.4.64.0702251232350.6011@alien.or.mcafeemobile.com>
2007-02-25 21:34 ` threadlets as 'naive pool of threads', epoll, some measurements Ingo Molnar
2007-02-26 10:45 ` Ingo Molnar
2007-02-26 11:48 ` Ingo Molnar
2007-02-26 12:25 ` Evgeniy Polyakov
2007-02-26 12:50 ` Ingo Molnar
2007-02-26 14:32 ` Evgeniy Polyakov
2007-02-26 20:23 ` Ingo Molnar
2007-02-27 8:16 ` Evgeniy Polyakov
2007-02-27 8:27 ` Ingo Molnar
2007-02-27 10:37 ` Evgeniy Polyakov
2007-02-27 12:15 ` Ingo Molnar
2007-02-27 12:22 ` Evgeniy Polyakov
2007-02-26 21:22 ` Davide Libenzi
2007-02-26 8:16 ` [patch 00/13] Syslets, "Threadlets", generic AIO support, v3 Ingo Molnar
2007-02-26 9:25 ` Evgeniy Polyakov
2007-02-26 9:55 ` Ingo Molnar
2007-02-26 10:31 ` Ingo Molnar
2007-02-26 10:43 ` Evgeniy Polyakov
2007-02-26 20:02 ` Davide Libenzi
2007-02-26 10:33 ` Evgeniy Polyakov
2007-02-26 10:35 ` Ingo Molnar
2007-02-26 10:47 ` Evgeniy Polyakov
2007-02-26 12:51 ` Ingo Molnar
2007-02-26 16:46 ` Evgeniy Polyakov
2007-02-27 6:24 ` Ingo Molnar
2007-02-27 10:41 ` Evgeniy Polyakov
2007-02-27 10:49 ` Ingo Molnar
2007-02-25 18:25 ` Evgeniy Polyakov
2007-02-25 18:24 ` Ingo Molnar
2007-02-25 14:33 ` Threadlet/syslet v4 bug report Evgeniy Polyakov
2007-02-25 15:24 ` Evgeniy Polyakov
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=20070221211526.GF7579@elte.hu \
--to=mingo@elte.hu \
--cc=akpm@zip.com.au \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=arjan@infradead.org \
--cc=davem@davemloft.net \
--cc=davidel@xmailserver.org \
--cc=drepper@redhat.com \
--cc=hch@infradead.org \
--cc=jens.axboe@oracle.com \
--cc=johnpol@2ka.mipt.ru \
--cc=linux-kernel@vger.kernel.org \
--cc=suparna@in.ibm.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=zach.brown@oracle.com \
/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