[patch for 2.6.26 7/7] LTTng instrumentation - lib

Mathieu Desnoyers
2008-03-27T13:33:00Z

[-- Attachment #1: lttng-instrumentation-lib.patch --]
[-- Type: text/plain, Size: 3059 bytes --]

(Originally : Add Markers into Semaphore Primitives)

This patch adds several markers around semaphore primitives.
Along with a tracing application this patch can be useful for measuring
kernel semaphore usage and contention.

Added markers :

sem_down
sem_down_intr
sem_down_intr_fail
sem_down_intr_resume
sem_down_intr_sched
sem_down_resume
sem_down_sched
sem_up

Signed-off-by: Mike Mason <mmlnx@us.ibm.com>
Signed-off-by: David Wilder <dwilder@us.ibm.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
---
lib/semaphore-sleepers.c | 9 +++++++++
1 file changed, 9 insertions(+)

Index: linux-2.6-lttng/lib/semaphore-sleepers.c
===================================================================
--- linux-2.6-lttng.orig/lib/semaphore-sleepers.c 2008-03-27 08:08:37.000000000 -0400
+++ linux-2.6-lttng/lib/semaphore-sleepers.c 2008-03-27 08:08:56.000000000 -0400
@@ -15,6 +15,7 @@
#include <linux/sched.h>
#include <linux/err.h>
#include <linux/init.h>
+#include <linux/marker.h>
#include <asm/semaphore.h>

/*
@@ -50,6 +51,7 @@

void __up(struct semaphore *sem)
{
+ trace_mark(sem_up, "%p", sem);
wake_up(&sem->wait);
}

@@ -59,6 +61,7 @@ void __sched __down(struct semaphore *se
DECLARE_WAITQUEUE(wait, tsk);
unsigned long flags;

+ trace_mark(sem_down, "%p", sem);
tsk->state = TASK_UNINTERRUPTIBLE;
spin_lock_irqsave(&sem->wait.lock, flags);
add_wait_queue_exclusive_locked(&sem->wait, &wait);
@@ -73,12 +76,14 @@ void __sched __down(struct semaphore *se
* the wait_queue_head.
*/
if (!atomic_add_negative(sleepers - 1, &sem->count)) {
+ trace_mark(sem_down_resume, "%p", sem);
sem->sleepers = 0;
break;
}
sem->sleepers = 1; /* us - see -1 above */
spin_unlock_irqrestore(&sem->wait.lock, flags);

+ trace_mark(sem_down_sched, "%p", sem);
schedule();

spin_lock_irqsave(&sem->wait.lock, flags);
@@ -97,6 +102,7 @@ int __sched __down_interruptible(struct
DECLARE_WAITQUEUE(wait, tsk);
unsigned long flags;

+ trace_mark(sem_down_intr, "%p", sem);
tsk->state = TASK_INTERRUPTIBLE;
spin_lock_irqsave(&sem->wait.lock, flags);
add_wait_queue_exclusive_locked(&sem->wait, &wait);
@@ -113,6 +119,7 @@ int __sched __down_interruptible(struct
* and exit.
*/
if (signal_pending(current)) {
+ trace_mark(sem_down_intr_fail, "%p", sem);
retval = -EINTR;
sem->sleepers = 0;
atomic_add(sleepers, &sem->count);
@@ -126,12 +133,14 @@ int __sched __down_interruptible(struct
* still hoping to get the semaphore.
*/
if (!atomic_add_negative(sleepers - 1, &sem->count)) {
+ trace_mark(sem_down_intr_resume, "%p", sem);
sem->sleepers = 0;
break;
}
sem->sleepers = 1; /* us - see -1 above */
spin_unlock_irqrestore(&sem->wait.lock, flags);

+ trace_mark(sem_down_intr_sched, "%p", sem);
schedule();

spin_lock_irqsave(&sem->wait.lock, flags);

--
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68