From: Peter Zijlstra <peterz@infradead.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Steven Rostedt <rostedt@goodmis.org>,
paulmck@linux.vnet.ibm.com, Gregory Haskins <ghaskins@novell.com>,
Ingo Molnar <mingo@elte.hu>, Matthew Wilcox <matthew@wil.cx>,
Andi Kleen <andi@firstfloor.org>,
Chris Mason <chris.mason@oracle.com>,
Andrew Morton <akpm@linux-foundation.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
linux-fsdevel <linux-fsdevel@vger.kernel.org>,
linux-btrfs <linux-btrfs@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Nick Piggin <npiggin@suse.de>,
Peter Morreale <pmorreale@novell.com>,
Sven Dietrich <SDietrich@novell.com>
Subject: [PATCH -v6][RFC]: mutex: implement adaptive spinning
Date: Thu, 08 Jan 2009 10:58:38 +0100 [thread overview]
Message-ID: <1231408718.11687.400.camel@twins> (raw)
In-Reply-To: <alpine.LFD.2.00.0901071509160.3057@localhost.localdomain>
On Wed, 2009-01-07 at 15:10 -0800, Linus Torvalds wrote:
> Please take all my patches to be pseudo-code. They've neither been
> compiled nor tested, and I'm just posting them in the hope that somebody
> else will then do things in the direction I think is the proper one ;)
Linux opteron 2.6.28-tip #585 SMP PREEMPT Thu Jan 8 10:38:09 CET 2009 x86_64 x86_64 x86_64 GNU/Linux
[root@opteron bench]# echo NO_OWNER_SPIN > /debug/sched_features; ./timec -e -5,-4,-3,-2 ./test-mutex V 16 10
2 CPUs, running 16 parallel test-tasks.
checking VFS performance.
| loops/sec: 69415
avg ops/sec: 74996
average cost per op: 0.00 usecs
average cost per lock: 0.00 usecs
average cost per unlock: 0.00 usecs
max cost per op: 0.00 usecs
max cost per lock: 0.00 usecs
max cost per unlock: 0.00 usecs
average deviance per op: 0.00 usecs
Performance counter stats for './test-mutex':
12098.324578 task clock ticks (msecs)
1081 CPU migrations (events)
7102 context switches (events)
2763 pagefaults (events)
12098.324578 task clock ticks (msecs)
Wall-clock time elapsed: 12026.804839 msecs
[root@opteron bench]# echo OWNER_SPIN > /debug/sched_features; ./timec -e -5,-4,-3,-2 ./test-mutex V 16 10
2 CPUs, running 16 parallel test-tasks.
checking VFS performance.
| loops/sec: 208147
avg ops/sec: 228126
average cost per op: 0.00 usecs
average cost per lock: 0.00 usecs
average cost per unlock: 0.00 usecs
max cost per op: 0.00 usecs
max cost per lock: 0.00 usecs
max cost per unlock: 0.00 usecs
average deviance per op: 0.00 usecs
Performance counter stats for './test-mutex':
22280.283224 task clock ticks (msecs)
117 CPU migrations (events)
5711 context switches (events)
2781 pagefaults (events)
22280.283224 task clock ticks (msecs)
Wall-clock time elapsed: 12307.053737 msecs
* WOW *
---
Subject: mutex: implement adaptive spin
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
Date: Thu Jan 08 09:41:22 CET 2009
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
---
include/linux/mutex.h | 4 +-
include/linux/sched.h | 1
kernel/mutex-debug.c | 7 ----
kernel/mutex-debug.h | 18 +++++-----
kernel/mutex.c | 81 ++++++++++++++++++++++++++++++++++++++++++------
kernel/mutex.h | 22 +++++++++++--
kernel/sched.c | 63 +++++++++++++++++++++++++++++++++++++
kernel/sched_features.h | 1
8 files changed, 170 insertions(+), 27 deletions(-)
Index: linux-2.6/include/linux/mutex.h
===================================================================
--- linux-2.6.orig/include/linux/mutex.h
+++ linux-2.6/include/linux/mutex.h
@@ -50,8 +50,10 @@ struct mutex {
atomic_t count;
spinlock_t wait_lock;
struct list_head wait_list;
-#ifdef CONFIG_DEBUG_MUTEXES
+#if defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_SMP)
struct thread_info *owner;
+#endif
+#ifdef CONFIG_DEBUG_MUTEXES
const char *name;
void *magic;
#endif
Index: linux-2.6/kernel/mutex-debug.c
===================================================================
--- linux-2.6.orig/kernel/mutex-debug.c
+++ linux-2.6/kernel/mutex-debug.c
@@ -26,11 +26,6 @@
/*
* Must be called with lock->wait_lock held.
*/
-void debug_mutex_set_owner(struct mutex *lock, struct thread_info *new_owner)
-{
- lock->owner = new_owner;
-}
-
void debug_mutex_lock_common(struct mutex *lock, struct mutex_waiter *waiter)
{
memset(waiter, MUTEX_DEBUG_INIT, sizeof(*waiter));
@@ -82,7 +77,6 @@ void debug_mutex_unlock(struct mutex *lo
DEBUG_LOCKS_WARN_ON(lock->magic != lock);
DEBUG_LOCKS_WARN_ON(lock->owner != current_thread_info());
DEBUG_LOCKS_WARN_ON(!lock->wait_list.prev && !lock->wait_list.next);
- DEBUG_LOCKS_WARN_ON(lock->owner != current_thread_info());
}
void debug_mutex_init(struct mutex *lock, const char *name,
@@ -95,7 +89,6 @@ void debug_mutex_init(struct mutex *lock
debug_check_no_locks_freed((void *)lock, sizeof(*lock));
lockdep_init_map(&lock->dep_map, name, key, 0);
#endif
- lock->owner = NULL;
lock->magic = lock;
}
Index: linux-2.6/kernel/mutex-debug.h
===================================================================
--- linux-2.6.orig/kernel/mutex-debug.h
+++ linux-2.6/kernel/mutex-debug.h
@@ -13,14 +13,6 @@
/*
* This must be called with lock->wait_lock held.
*/
-extern void
-debug_mutex_set_owner(struct mutex *lock, struct thread_info *new_owner);
-
-static inline void debug_mutex_clear_owner(struct mutex *lock)
-{
- lock->owner = NULL;
-}
-
extern void debug_mutex_lock_common(struct mutex *lock,
struct mutex_waiter *waiter);
extern void debug_mutex_wake_waiter(struct mutex *lock,
@@ -35,6 +27,16 @@ extern void debug_mutex_unlock(struct mu
extern void debug_mutex_init(struct mutex *lock, const char *name,
struct lock_class_key *key);
+static inline void mutex_set_owner(struct mutex *lock)
+{
+ lock->owner = current_thread_info();
+}
+
+static incline void mutex_clear_owner(struct mutex *lock)
+{
+ lock->owner = NULL;
+}
+
#define spin_lock_mutex(lock, flags) \
do { \
struct mutex *l = container_of(lock, struct mutex, wait_lock); \
Index: linux-2.6/kernel/mutex.c
===================================================================
--- linux-2.6.orig/kernel/mutex.c
+++ linux-2.6/kernel/mutex.c
@@ -10,6 +10,11 @@
* Many thanks to Arjan van de Ven, Thomas Gleixner, Steven Rostedt and
* David Howells for suggestions and improvements.
*
+ * - Adaptive spinning for mutexes by Peter Zijlstra. (Ported to mainline
+ * from the -rt tree, where it was originally implemented for rtmutexes
+ * by Steven Rostedt, based on work by Gregory Haskins, Peter Morreale
+ * and Sven Dietrich.
+ *
* Also see Documentation/mutex-design.txt.
*/
#include <linux/mutex.h>
@@ -46,6 +51,7 @@ __mutex_init(struct mutex *lock, const c
atomic_set(&lock->count, 1);
spin_lock_init(&lock->wait_lock);
INIT_LIST_HEAD(&lock->wait_list);
+ mutex_clear_owner(lock);
debug_mutex_init(lock, name, key);
}
@@ -91,6 +97,7 @@ void inline __sched mutex_lock(struct mu
* 'unlocked' into 'locked' state.
*/
__mutex_fastpath_lock(&lock->count, __mutex_lock_slowpath);
+ mutex_set_owner(lock);
}
EXPORT_SYMBOL(mutex_lock);
@@ -115,11 +122,21 @@ void __sched mutex_unlock(struct mutex *
* The unlocking fastpath is the 0->1 transition from 'locked'
* into 'unlocked' state:
*/
+#ifndef CONFIG_DEBUG_MUTEXES
+ /*
+ * When debugging is enabled we must not clear the owner before time,
+ * the slow path will always be taken, and that clears the owner field
+ * after verifying that it was indeed current.
+ */
+ mutex_clear_owner(lock);
+#endif
__mutex_fastpath_unlock(&lock->count, __mutex_unlock_slowpath);
}
EXPORT_SYMBOL(mutex_unlock);
+#define MUTEX_SLEEPERS (-1000)
+
/*
* Lock a mutex (possibly interruptible), slowpath:
*/
@@ -132,6 +149,34 @@ __mutex_lock_common(struct mutex *lock,
unsigned int old_val;
unsigned long flags;
+#ifdef CONFIG_SMP
+ /* Optimistic spinning.. */
+ for (;;) {
+ struct thread_info *owner;
+ int oldval = atomic_read(&lock->count);
+
+ if (oldval <= MUTEX_SLEEPERS)
+ break;
+ if (oldval == 1) {
+ oldval = atomic_cmpxchg(&lock->count, oldval, 0);
+ if (oldval == 1) {
+ mutex_set_owner(lock);
+ return 0;
+ }
+ } else {
+ /* See who owns it, and spin on him if anybody */
+ owner = ACCESS_ONCE(lock->owner);
+ if (owner && !spin_on_owner(lock, owner))
+ break;
+ }
+
+ if (need_resched())
+ break;
+
+ cpu_relax();
+ }
+#endif
+
spin_lock_mutex(&lock->wait_lock, flags);
debug_mutex_lock_common(lock, &waiter);
@@ -142,7 +187,7 @@ __mutex_lock_common(struct mutex *lock,
list_add_tail(&waiter.list, &lock->wait_list);
waiter.task = task;
- old_val = atomic_xchg(&lock->count, -1);
+ old_val = atomic_xchg(&lock->count, MUTEX_SLEEPERS);
if (old_val == 1)
goto done;
@@ -158,7 +203,7 @@ __mutex_lock_common(struct mutex *lock,
* that when we release the lock, we properly wake up the
* other waiters:
*/
- old_val = atomic_xchg(&lock->count, -1);
+ old_val = atomic_xchg(&lock->count, MUTEX_SLEEPERS);
if (old_val == 1)
break;
@@ -187,7 +232,7 @@ done:
lock_acquired(&lock->dep_map, ip);
/* got the lock - rejoice! */
mutex_remove_waiter(lock, &waiter, task_thread_info(task));
- debug_mutex_set_owner(lock, task_thread_info(task));
+ mutex_set_owner(lock);
/* set it to 0 if there are no waiters left: */
if (likely(list_empty(&lock->wait_list)))
@@ -260,7 +305,7 @@ __mutex_unlock_common_slowpath(atomic_t
wake_up_process(waiter->task);
}
- debug_mutex_clear_owner(lock);
+ mutex_clear_owner(lock);
spin_unlock_mutex(&lock->wait_lock, flags);
}
@@ -298,18 +343,30 @@ __mutex_lock_interruptible_slowpath(atom
*/
int __sched mutex_lock_interruptible(struct mutex *lock)
{
+ int ret;
+
might_sleep();
- return __mutex_fastpath_lock_retval
+ ret = __mutex_fastpath_lock_retval
(&lock->count, __mutex_lock_interruptible_slowpath);
+ if (!ret)
+ mutex_set_owner(lock);
+
+ return ret;
}
EXPORT_SYMBOL(mutex_lock_interruptible);
int __sched mutex_lock_killable(struct mutex *lock)
{
+ int ret;
+
might_sleep();
- return __mutex_fastpath_lock_retval
+ ret = __mutex_fastpath_lock_retval
(&lock->count, __mutex_lock_killable_slowpath);
+ if (!ret)
+ mutex_set_owner(lock);
+
+ return ret;
}
EXPORT_SYMBOL(mutex_lock_killable);
@@ -352,9 +409,10 @@ static inline int __mutex_trylock_slowpa
prev = atomic_xchg(&lock->count, -1);
if (likely(prev == 1)) {
- debug_mutex_set_owner(lock, current_thread_info());
+ mutex_set_owner(lock);
mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_);
}
+
/* Set it back to 0 if there are no waiters: */
if (likely(list_empty(&lock->wait_list)))
atomic_set(&lock->count, 0);
@@ -380,8 +438,13 @@ static inline int __mutex_trylock_slowpa
*/
int __sched mutex_trylock(struct mutex *lock)
{
- return __mutex_fastpath_trylock(&lock->count,
- __mutex_trylock_slowpath);
+ int ret;
+
+ ret = __mutex_fastpath_trylock(&lock->count, __mutex_trylock_slowpath);
+ if (ret)
+ mutex_set_owner(lock);
+
+ return ret;
}
EXPORT_SYMBOL(mutex_trylock);
Index: linux-2.6/kernel/mutex.h
===================================================================
--- linux-2.6.orig/kernel/mutex.h
+++ linux-2.6/kernel/mutex.h
@@ -16,8 +16,26 @@
#define mutex_remove_waiter(lock, waiter, ti) \
__list_del((waiter)->list.prev, (waiter)->list.next)
-#define debug_mutex_set_owner(lock, new_owner) do { } while (0)
-#define debug_mutex_clear_owner(lock) do { } while (0)
+#ifdef CONFIG_SMP
+static inline void mutex_set_owner(struct mutex *lock)
+{
+ lock->owner = current_thread_info();
+}
+
+static inline void mutex_clear_owner(struct mutex *lock)
+{
+ lock->owner = NULL;
+}
+#else
+static inline void mutex_set_owner(struct mutex *lock)
+{
+}
+
+static inline void mutex_clear_owner(struct mutex *lock)
+{
+}
+#endif
+
#define debug_mutex_wake_waiter(lock, waiter) do { } while (0)
#define debug_mutex_free_waiter(waiter) do { } while (0)
#define debug_mutex_add_waiter(lock, waiter, ti) do { } while (0)
Index: linux-2.6/kernel/sched.c
===================================================================
--- linux-2.6.orig/kernel/sched.c
+++ linux-2.6/kernel/sched.c
@@ -4672,6 +4672,69 @@ need_resched_nonpreemptible:
}
EXPORT_SYMBOL(schedule);
+#ifdef CONFIG_SMP
+/*
+ * Look out! "owner" is an entirely speculative pointer
+ * access and not reliable.
+ */
+int spin_on_owner(struct mutex *lock, struct thread_info *owner)
+{
+ unsigned int cpu;
+ struct rq *rq;
+
+ if (unlikely(!sched_feat(OWNER_SPIN)))
+ return 0;
+
+ preempt_disable();
+#ifdef CONFIG_DEBUG_PAGEALLOC
+ /*
+ * Need to access the cpu field knowing that
+ * DEBUG_PAGEALLOC could have unmapped it if
+ * the mutex owner just released it and exited.
+ */
+ if (probe_kernel_address(&owner->cpu, cpu))
+ goto out;
+#else
+ cpu = owner->cpu;
+#endif
+
+ /*
+ * Even if the access succeeded (likely case),
+ * the cpu field may no longer be valid.
+ */
+ if (cpu >= nr_cpumask_bits)
+ goto out;
+
+ /*
+ * We need to validate that we can do a
+ * get_cpu() and that we have the percpu area.
+ */
+ if (!cpu_online(cpu))
+ goto out;
+
+ rq = cpu_rq(cpu);
+
+ for (;;) {
+ if (lock->owner != owner)
+ break;
+
+ /*
+ * Is that owner really running on that cpu?
+ */
+ if (task_thread_info(rq->curr) != owner)
+ break;
+
+ if (need_resched())
+ break;
+
+ cpu_relax();
+ }
+out:
+ preempt_enable_no_resched();
+ return 1;
+}
+#endif
+
#ifdef CONFIG_PREEMPT
/*
* this is the entry point to schedule() from in-kernel preemption
Index: linux-2.6/include/linux/sched.h
===================================================================
--- linux-2.6.orig/include/linux/sched.h
+++ linux-2.6/include/linux/sched.h
@@ -330,6 +330,7 @@ extern signed long schedule_timeout_inte
extern signed long schedule_timeout_killable(signed long timeout);
extern signed long schedule_timeout_uninterruptible(signed long timeout);
asmlinkage void schedule(void);
+extern int spin_on_owner(struct mutex *lock, struct thread_info *owner);
struct nsproxy;
struct user_namespace;
Index: linux-2.6/kernel/sched_features.h
===================================================================
--- linux-2.6.orig/kernel/sched_features.h
+++ linux-2.6/kernel/sched_features.h
@@ -13,3 +13,4 @@ SCHED_FEAT(LB_WAKEUP_UPDATE, 1)
SCHED_FEAT(ASYM_EFF_LOAD, 1)
SCHED_FEAT(WAKEUP_OVERLAP, 0)
SCHED_FEAT(LAST_BUDDY, 1)
+SCHED_FEAT(OWNER_SPIN, 1)
next prev parent reply other threads:[~2009-01-08 9:58 UTC|newest]
Thread overview: 362+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-31 11:28 Btrfs for mainline Chris Mason
2008-12-31 18:45 ` Andrew Morton
2008-12-31 23:19 ` Chris Mason
2009-01-02 16:37 ` Ryusuke Konishi
2009-01-02 18:06 ` Chris Mason
2009-01-02 19:38 ` Chris Mason
2009-01-03 9:44 ` Ryusuke Konishi
2009-01-05 14:14 ` Chris Mason
2009-01-05 16:43 ` Ryusuke Konishi
2009-01-05 10:32 ` Nick Piggin
2009-01-05 13:21 ` Chris Mason
2009-01-05 14:39 ` generic pagecache to block mapping layer (was Re: Btrfs for mainline) Nick Piggin
2009-01-05 16:37 ` Chris Mason
2009-01-05 17:10 ` Nick Piggin
2009-01-06 17:20 ` Nick Piggin
2009-01-02 19:05 ` Btrfs for mainline Andi Kleen
2009-01-02 19:32 ` Chris Mason
2009-01-02 21:01 ` Andi Kleen
2009-01-02 21:35 ` Chris Mason
2009-01-02 22:26 ` Roland Dreier
2009-01-04 13:28 ` KOSAKI Motohiro
2009-01-04 15:56 ` Ed Tomlinson
2009-01-05 10:07 ` Chris Samuel
2009-01-05 13:18 ` Chris Mason
2009-01-05 16:33 ` J. Bruce Fields
2009-01-06 22:09 ` Jamie Lokier
2009-01-03 19:17 ` Matthew Wilcox
2009-01-03 19:50 ` Christoph Hellwig
2009-01-03 20:17 ` Chris Mason
2009-01-04 21:52 ` Arnd Bergmann
2009-01-05 14:01 ` Chris Mason
2009-01-03 21:12 ` Matthew Wilcox
2009-01-04 18:21 ` Peter Zijlstra
2009-01-04 18:41 ` Matthew Wilcox
2009-01-05 14:47 ` Nick Piggin
2009-01-05 16:23 ` Matthew Wilcox
2009-01-05 16:30 ` Chris Mason
2009-01-07 13:07 ` Ingo Molnar
2009-01-07 13:24 ` Matthew Wilcox
2009-01-07 14:56 ` Ingo Molnar
2009-01-06 11:40 ` [PATCH][RFC]: mutex: adaptive spin Peter Zijlstra
2009-01-06 12:10 ` Ingo Molnar
2009-01-06 12:21 ` Peter Zijlstra
2009-01-06 15:01 ` Matthew Wilcox
2009-01-06 13:10 ` Gregory Haskins
2009-01-06 13:16 ` Ingo Molnar
2009-01-06 13:20 ` Peter Zijlstra
2009-01-06 14:15 ` Gregory Haskins
2009-01-06 21:42 ` Paul E. McKenney
2009-01-06 21:44 ` Peter Zijlstra
2009-01-06 21:50 ` Linus Torvalds
2009-01-06 22:07 ` Peter Zijlstra
2009-01-06 22:22 ` Linus Torvalds
2009-01-06 22:43 ` Peter Zijlstra
2009-01-06 22:56 ` Linus Torvalds
2009-01-06 23:00 ` Linus Torvalds
2009-01-06 23:09 ` Matthew Wilcox
2009-01-07 0:06 ` Linus Torvalds
2009-01-06 23:16 ` Peter Zijlstra
2009-01-07 12:03 ` [PATCH -v4][RFC]: mutex: implement adaptive spinning Peter Zijlstra
2009-01-07 14:50 ` Frédéric Weisbecker
2009-01-07 14:58 ` Peter Zijlstra
2009-01-07 15:22 ` Steven Rostedt
2009-01-07 15:29 ` Steven Rostedt
2009-01-07 15:54 ` Peter Zijlstra
2009-01-07 16:25 ` Linus Torvalds
2009-01-07 16:57 ` [PATCH -v5][RFC]: " Peter Zijlstra
2009-01-07 18:55 ` Linus Torvalds
2009-01-07 20:40 ` Steven Rostedt
2009-01-07 20:55 ` Linus Torvalds
2009-01-07 21:09 ` Matthew Wilcox
2009-01-07 21:24 ` Linus Torvalds
2009-01-07 21:32 ` Ingo Molnar
2009-01-07 21:47 ` Andrew Morton
2009-01-07 21:57 ` Ingo Molnar
2009-01-07 21:39 ` Linus Torvalds
2009-01-07 21:39 ` Andi Kleen
2009-01-07 22:28 ` Gregory Haskins
2009-01-07 22:33 ` Ingo Molnar
2009-01-07 22:51 ` Peter W. Morreale
2009-01-07 23:14 ` Peter W. Morreale
2009-01-07 22:56 ` Gregory Haskins
2009-01-07 23:09 ` Steven Rostedt
2009-01-07 23:32 ` Linus Torvalds
2009-01-07 23:46 ` Steven Rostedt
2009-01-07 23:47 ` Steven Rostedt
2009-01-07 23:52 ` Linus Torvalds
2009-01-08 3:28 ` Gregory Haskins
2009-01-08 7:10 ` Peter Zijlstra
2009-01-07 23:15 ` Linus Torvalds
2009-01-07 23:18 ` Linus Torvalds
2009-01-08 3:27 ` Gregory Haskins
2009-01-08 3:38 ` Steven Rostedt
2009-01-08 4:00 ` Gregory Haskins
2009-01-07 23:23 ` Paul E. McKenney
2009-01-07 21:28 ` Ingo Molnar
2009-01-07 21:51 ` Peter Zijlstra
2009-01-07 21:58 ` Linus Torvalds
2009-01-07 22:06 ` Linus Torvalds
2009-01-07 22:18 ` Peter Zijlstra
2009-01-07 23:10 ` Linus Torvalds
2009-01-08 9:58 ` Peter Zijlstra [this message]
2009-01-08 14:18 ` [PATCH -v6][RFC]: " Ingo Molnar
2009-01-08 14:33 ` Gregory Haskins
2009-01-08 14:46 ` [PATCH -v7][RFC]: " Peter Zijlstra
2009-01-08 15:09 ` Steven Rostedt
2009-01-08 15:23 ` Peter Zijlstra
2009-01-08 15:28 ` Steven Rostedt
2009-01-08 15:30 ` Peter Zijlstra
2009-01-08 15:30 ` Steven Rostedt
2009-01-08 16:11 ` Linus Torvalds
2009-01-08 16:58 ` Linus Torvalds
2009-01-08 17:08 ` Chris Mason
2009-01-08 17:33 ` Steven Rostedt
2009-01-08 17:52 ` Linus Torvalds
2009-01-08 18:03 ` Steven Rostedt
[not found] ` <alpine.DEB.1.10.0901081300370.24688@gandalf.stny.rr.com>
2009-01-08 18:14 ` Steven Rostedt
2009-01-08 19:17 ` Chris Mason
2009-01-08 19:45 ` Steven Rostedt
2009-01-08 18:16 ` Linus Torvalds
2009-01-08 18:27 ` Chris Mason
2009-01-08 19:02 ` Chris Mason
2009-01-08 19:13 ` Linus Torvalds
2009-01-08 19:23 ` Peter Zijlstra
2009-01-09 17:40 ` Jiri Kosina
2009-01-09 9:28 ` Peter Zijlstra
2009-01-10 23:59 ` Jeremy Fitzhardinge
2009-01-08 19:54 ` Linus Torvalds
2009-01-08 20:12 ` Steven Rostedt
2009-01-09 10:47 ` Peter Zijlstra
2009-01-09 15:06 ` Peter Zijlstra
2009-01-09 15:11 ` Chris Mason
2009-01-09 15:59 ` Steven Rostedt
2009-01-09 16:03 ` Peter Zijlstra
2009-01-09 16:34 ` Linus Torvalds
2009-01-09 16:44 ` Steven Rostedt
2009-01-09 18:16 ` Peter Zijlstra
2009-01-09 18:24 ` Linus Torvalds
2009-01-08 18:00 ` Linus Torvalds
2009-01-08 18:33 ` Ingo Molnar
2009-01-08 18:41 ` H. Peter Anvin
2009-01-09 3:46 ` Linus Torvalds
2009-01-09 4:59 ` David Miller
2009-01-09 5:00 ` H. Peter Anvin
2009-01-09 13:00 ` [patch] measurements, numbers about CONFIG_OPTIMIZE_INLINING=y impact Ingo Molnar
2009-01-09 14:03 ` jim owens
2009-01-09 15:35 ` Ingo Molnar
2009-01-09 16:28 ` Linus Torvalds
2009-01-09 19:56 ` H. Peter Anvin
2009-01-10 8:55 ` Chris Samuel
2009-01-09 20:17 ` Nicholas Miell
2009-01-09 20:29 ` Linus Torvalds
2009-01-09 23:28 ` Nicholas Miell
2009-01-10 0:05 ` Linus Torvalds
2009-01-10 0:37 ` Andi Kleen
2009-01-10 0:41 ` Linus Torvalds
2009-01-10 1:08 ` Andi Kleen
2009-01-10 2:12 ` Nicholas Miell
2009-01-10 4:05 ` Linus Torvalds
2009-01-10 6:44 ` Nicholas Miell
2009-01-09 20:29 ` Steven Rostedt
2009-01-09 16:34 ` H. Peter Anvin
2009-01-09 16:44 ` Linus Torvalds
2009-01-09 16:47 ` Dirk Hohndel
2009-01-09 16:46 ` Dirk Hohndel
2009-01-09 16:51 ` H. Peter Anvin
2009-01-09 17:07 ` Steven Rostedt
2009-01-09 17:14 ` Linus Torvalds
2009-01-09 17:32 ` Andi Kleen
2009-01-09 17:20 ` Andi Kleen
2009-01-09 17:11 ` Linus Torvalds
2009-01-09 17:46 ` Andi Kleen
2009-01-09 17:28 ` Matthew Wilcox
2009-01-09 17:47 ` Andi Kleen
2009-01-09 17:39 ` Matthew Wilcox
2009-01-09 17:54 ` Linus Torvalds
2009-01-09 18:07 ` H. Peter Anvin
2009-01-09 18:19 ` Andi Kleen
2009-01-09 18:59 ` Richard Guenther
2009-01-09 19:13 ` H. Peter Anvin
2009-01-09 19:21 ` Andi Kleen
2009-01-09 19:10 ` Richard Guenther
2009-01-09 19:17 ` H. Peter Anvin
2009-01-09 19:40 ` Andi Kleen
2009-01-09 19:32 ` Richard Guenther
2009-01-09 19:09 ` Richard Guenther
2009-01-09 19:44 ` Linus Torvalds
2009-01-09 20:14 ` Richard Guenther
2009-01-09 20:26 ` Linus Torvalds
2009-01-09 20:37 ` Richard Guenther
2009-01-09 21:23 ` Theodore Tso
2009-01-09 21:33 ` Steven Rostedt
2009-01-09 20:58 ` Sam Ravnborg
2009-01-09 17:41 ` Dirk Hohndel
2009-01-09 18:02 ` Andi Kleen
2009-01-09 17:57 ` Linus Torvalds
2009-01-09 18:55 ` Andi Kleen
2009-01-09 19:00 ` Linus Torvalds
2009-01-09 19:35 ` Andi Kleen
2009-01-09 19:29 ` Matthew Wilcox
2009-01-09 19:48 ` Linus Torvalds
2009-01-09 19:52 ` Theodore Tso
2009-01-09 22:07 ` Arjan van de Ven
2009-01-09 22:44 ` Andi Kleen
[not found] ` <20090109224410.GQ26290@one.firstfloor.org>
2009-01-09 22:35 ` H. Peter Anvin
2009-01-09 22:55 ` Arjan van de Ven
2009-01-09 23:32 ` Sam Ravnborg
2009-01-10 5:29 ` Arjan van de Ven
2009-01-10 5:57 ` H. Peter Anvin
2009-01-11 22:45 ` Valdis.Kletnieks
2009-01-09 17:13 ` Christoph Hellwig
2009-01-09 15:25 ` Ingo Molnar
2009-01-08 19:00 ` [PATCH -v7][RFC]: mutex: implement adaptive spinning Andi Kleen
2009-01-09 1:42 ` H. Peter Anvin
2009-01-09 13:37 ` Ingo Molnar
2009-01-09 16:09 ` Linus Torvalds
2009-01-09 16:23 ` H. Peter Anvin
2009-01-09 16:37 ` Linus Torvalds
2009-01-09 20:41 ` Ingo Molnar
2009-01-09 20:56 ` Ingo Molnar
2009-01-09 20:56 ` Linus Torvalds
2009-01-09 21:34 ` Ingo Molnar
2009-01-09 21:41 ` Harvey Harrison
2009-01-09 21:50 ` Linus Torvalds
2009-01-09 21:59 ` Harvey Harrison
2009-01-09 22:09 ` Linus Torvalds
2009-01-09 22:13 ` Harvey Harrison
2009-01-09 22:25 ` Harvey Harrison
2009-01-10 0:53 ` Jamie Lokier
2009-01-10 1:04 ` Linus Torvalds
2009-01-10 1:13 ` Andi Kleen
2009-01-09 23:12 ` Ingo Molnar
2009-01-09 23:24 ` Linus Torvalds
2009-01-10 1:01 ` Ingo Molnar
2009-01-10 1:06 ` Linus Torvalds
2009-01-10 1:20 ` Ingo Molnar
2009-01-10 1:34 ` Linus Torvalds
2009-01-10 1:08 ` Harvey Harrison
2009-01-10 1:30 ` Linus Torvalds
2009-01-10 5:03 ` H. Peter Anvin
2009-01-10 5:28 ` Linus Torvalds
2009-01-10 5:57 ` H. Peter Anvin
2009-01-11 0:54 ` Ingo Molnar
2009-01-12 1:56 ` Jamie Lokier
2009-01-12 8:40 ` Ingo Molnar
2009-01-10 1:18 ` Steven Rostedt
2009-01-10 1:39 ` Linus Torvalds
2009-01-10 1:41 ` Andrew Morton
2009-01-10 3:02 ` Andi Kleen
2009-01-11 12:26 ` David Woodhouse
2009-01-11 18:13 ` Andi Kleen
2009-01-11 19:25 ` Linus Torvalds
2009-01-11 20:14 ` gcc inlining heuristics was " Andi Kleen
2009-01-11 20:15 ` David Woodhouse
2009-01-11 20:34 ` Andi Kleen
2009-01-11 20:51 ` Linus Torvalds
2009-01-11 23:05 ` Linus Torvalds
2009-01-12 0:12 ` Andi Kleen
2009-01-12 0:21 ` Linus Torvalds
2009-01-12 0:52 ` Andi Kleen
2009-01-12 1:20 ` H. Peter Anvin
2009-01-12 18:06 ` Bernd Schmidt
2009-01-12 19:02 ` Linus Torvalds
2009-01-12 19:32 ` Andi Kleen
2009-01-12 19:22 ` H. Peter Anvin
2009-01-12 19:45 ` Linus Torvalds
2009-01-12 23:01 ` Jamie Lokier
2009-01-12 23:19 ` Linus Torvalds
2009-01-12 19:42 ` Linus Torvalds
[not found] ` <alpine.LFD.2.00.0901121128080.6528@localhost.localdomain>
2009-01-12 20:08 ` Linus Torvalds
2009-01-12 22:03 ` Bernd Schmidt
2009-01-13 0:21 ` Linus Torvalds
2009-01-13 1:30 ` Steven Rostedt
2009-01-19 0:13 ` Ingo Molnar
2009-01-19 6:22 ` Nick Piggin
2009-01-19 21:01 ` Linus Torvalds
2009-01-20 0:51 ` Nick Piggin
2009-01-20 12:38 ` Ingo Molnar
2009-01-20 19:49 ` David Woodhouse
2009-01-20 21:05 ` Ingo Molnar
2009-01-20 21:23 ` Linus Torvalds
2009-01-20 22:05 ` Ingo Molnar
2009-01-21 1:22 ` H. Peter Anvin
2009-01-21 8:54 ` Andi Kleen
2009-01-21 8:52 ` Nick Piggin
2009-01-21 9:20 ` Andi Kleen
2009-01-21 9:25 ` Nick Piggin
2009-01-21 9:54 ` Andi Kleen
2009-01-21 10:14 ` Nick Piggin
2009-01-20 4:20 ` Andi Kleen
2009-01-20 17:43 ` Miguel F Mascarenhas Sousa Filipe
2009-01-12 19:55 ` Bernd Schmidt
2009-01-12 20:11 ` Linus Torvalds
2009-01-12 7:59 ` Hard to debug kernel issues (was Re: [PATCH -v7][RFC]: mutex: implement adaptive spinning) Chris Samuel
2009-01-10 6:44 ` [PATCH -v7][RFC]: mutex: implement adaptive spinning H. Peter Anvin
2009-01-09 21:46 ` Linus Torvalds
2009-01-09 21:58 ` Ingo Molnar
2009-01-09 21:15 ` Andi Kleen
2009-01-08 19:59 ` Harvey Harrison
2009-01-09 1:44 ` H. Peter Anvin
2009-01-09 2:24 ` Harvey Harrison
2009-01-09 5:05 ` H. Peter Anvin
2009-01-09 3:35 ` Andi Kleen
2009-01-09 3:42 ` Linus Torvalds
2009-01-09 6:57 ` Andi Kleen
2009-01-09 6:00 ` Andrew Morton
2009-01-09 6:58 ` Andi Kleen
2009-01-09 13:05 ` Chris Mason
2009-01-08 17:23 ` Peter Zijlstra
2009-01-07 22:54 ` [PATCH -v5][RFC]: " Dave Kleikamp
2009-01-07 23:19 ` Linus Torvalds
2009-01-07 23:49 ` Steven Rostedt
2009-01-07 23:57 ` Linus Torvalds
2009-01-08 2:18 ` KAMEZAWA Hiroyuki
2009-01-08 2:33 ` Steven Rostedt
2009-01-08 2:49 ` KAMEZAWA Hiroyuki
2009-01-08 6:52 ` Andi Kleen
2009-01-08 14:24 ` Steven Rostedt
2009-01-08 14:45 ` Andi Kleen
2009-01-07 21:37 ` Andi Kleen
2009-01-07 21:35 ` Andrew Morton
2009-01-07 17:20 ` [PATCH -v4][RFC]: " Chris Mason
2009-01-07 17:50 ` Linus Torvalds
2009-01-07 18:00 ` Chris Mason
2009-01-07 3:57 ` [PATCH][RFC]: mutex: adaptive spin Lai Jiangshan
2009-01-07 6:32 ` Peter Zijlstra
2009-01-07 7:34 ` Lai Jiangshan
2009-01-07 13:35 ` Matthew Wilcox
2009-01-06 22:31 ` Paul E. McKenney
2009-01-06 15:55 ` Linus Torvalds
2009-01-06 16:11 ` Linus Torvalds
2009-01-06 16:28 ` Steven Rostedt
2009-01-06 16:40 ` Linus Torvalds
2009-01-06 16:42 ` Linus Torvalds
2009-01-06 17:02 ` Ingo Molnar
2009-01-06 16:54 ` Ingo Molnar
2009-01-06 16:56 ` Ingo Molnar
2009-01-06 16:59 ` Linus Torvalds
2009-01-06 16:19 ` Chris Mason
2009-01-10 17:52 ` Pavel Machek
2009-01-06 13:29 ` Nick Piggin
2009-01-06 16:23 ` Chris Mason
2009-01-06 17:08 ` Andrew Morton
2009-01-06 17:37 ` Steven Rostedt
2009-01-06 18:02 ` Linus Torvalds
2009-01-06 18:20 ` Steven Rostedt
2009-01-06 18:28 ` Linus Torvalds
2009-01-06 18:25 ` Linus Torvalds
2009-01-06 19:03 ` Steven Rostedt
2009-01-05 14:34 ` Btrfs for mainline Chris Mason
2009-01-04 8:32 ` Gabor MICSKO
2009-01-05 14:35 ` Chris Mason
2009-01-05 15:01 ` Tomasz Torcz
2009-01-05 16:30 ` Chris Mason
2009-01-06 19:41 ` Chris Mason
2009-01-07 9:33 ` David Woodhouse
2009-01-07 18:45 ` Chris Mason
2009-01-08 20:15 ` jim owens
2009-01-11 23:34 ` Andrew Morton
2009-01-12 13:58 ` Chris Mason
2009-01-12 15:14 ` Miguel Figueiredo Mascarenhas Sousa Filipe
2009-01-12 15:17 ` Chris Mason
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=1231408718.11687.400.camel@twins \
--to=peterz@infradead.org \
--cc=SDietrich@novell.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=chris.mason@oracle.com \
--cc=ghaskins@novell.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=matthew@wil.cx \
--cc=mingo@elte.hu \
--cc=npiggin@suse.de \
--cc=paulmck@linux.vnet.ibm.com \
--cc=pmorreale@novell.com \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/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;
as well as URLs for NNTP newsgroup(s).