Module: xenomai-forge
Branch: next
Commit: 53ca78558179d672b433d3d96fa33a9b03b32ec8
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=53ca78558179d672b433d3d96fa33a9b03b32ec8

Author: Philippe Gerum <r...@xenomai.org>
Date:   Mon May 19 11:20:33 2014 +0200

cobalt/posix/cond: introduce tracepoints

---

 kernel/cobalt/posix/Makefile       |    2 +-
 kernel/cobalt/posix/cond.c         |   22 +++++----
 kernel/cobalt/trace/cobalt-posix.h |   89 ++++++++++++++++++++++++++++++------
 3 files changed, 89 insertions(+), 24 deletions(-)

diff --git a/kernel/cobalt/posix/Makefile b/kernel/cobalt/posix/Makefile
index 9d77f72..b23baa5 100644
--- a/kernel/cobalt/posix/Makefile
+++ b/kernel/cobalt/posix/Makefile
@@ -19,4 +19,4 @@ posix-y :=            \
        timer.o         \
        timerfd.o
 
-ccflags-y := -Iarch/$(SRCARCH)/xenomai/include -Iinclude/xenomai
+ccflags-y := -Iarch/$(SRCARCH)/xenomai/include -Iinclude/xenomai -Ikernel
diff --git a/kernel/cobalt/posix/cond.c b/kernel/cobalt/posix/cond.c
index 73f3971..5c3fd24 100644
--- a/kernel/cobalt/posix/cond.c
+++ b/kernel/cobalt/posix/cond.c
@@ -52,6 +52,7 @@
 #include "mutex.h"
 #include "cond.h"
 #include "clock.h"
+#include <trace/events/cobalt-posix.h>
 
 static inline void
 cond_destroy_internal(xnhandle_t handle, struct cobalt_kqueues *q)
@@ -112,9 +113,6 @@ pthread_cond_init(struct cobalt_cond_shadow *cnd, const 
pthread_condattr_t *attr
        struct xnsys_ppd *sys_ppd;
        spl_t s;
 
-       if (attr == NULL)
-               attr = &cobalt_default_cond_attr;
-
        cond = xnmalloc(sizeof(*cond));
        if (cond == NULL)
                return -ENOMEM;
@@ -360,8 +358,9 @@ unlock_and_return:
 int cobalt_cond_init(struct cobalt_cond_shadow __user *u_cnd,
                     const pthread_condattr_t __user *u_attr)
 {
-       pthread_condattr_t locattr, *attr;
+       const pthread_condattr_t *attr;
        struct cobalt_cond_shadow cnd;
+       pthread_condattr_t locattr;
        int err;
 
        if (__xn_safe_copy_from_user(&cnd, u_cnd, sizeof(cnd)))
@@ -374,9 +373,10 @@ int cobalt_cond_init(struct cobalt_cond_shadow __user 
*u_cnd,
 
                attr = &locattr;
        } else
-               attr = NULL;
+               attr = &cobalt_default_cond_attr;
+
+       trace_cobalt_cond_init(u_cnd, attr);
 
-       /* Always use default attribute. */
        err = pthread_cond_init(&cnd, attr);
        if (err < 0)
                return err;
@@ -392,6 +392,8 @@ int cobalt_cond_destroy(struct cobalt_cond_shadow __user 
*u_cnd)
        if (__xn_safe_copy_from_user(&cnd, u_cnd, sizeof(cnd)))
                return -EFAULT;
 
+       trace_cobalt_cond_destroy(u_cnd);
+
        err = pthread_cond_destroy(&cnd);
        if (err < 0)
                return err;
@@ -432,14 +434,18 @@ int cobalt_cond_wait_prologue(struct cobalt_cond_shadow 
__user *u_cnd,
 
        if (timed) {
                err = __xn_safe_copy_from_user(&ts, u_ts, sizeof(ts))?-EFAULT:0;
-               if (!err)
+               if (!err) {
+                       trace_cobalt_cond_timedwait(u_cnd, u_mx, &ts);
                        err = cobalt_cond_timedwait_prologue(cur,
                                                             cnd, mx, timed,
                                                             ts2ns(&ts) + 1);
-       } else
+               }
+       } else {
+               trace_cobalt_cond_wait(u_cnd, u_mx);
                err = cobalt_cond_timedwait_prologue(cur, cnd,
                                                     mx, timed,
                                                     XN_INFINITE);
+       }
 
        switch(err) {
        case 0:
diff --git a/kernel/cobalt/trace/cobalt-posix.h 
b/kernel/cobalt/trace/cobalt-posix.h
index 66dc7b0..f9d2082 100644
--- a/kernel/cobalt/trace/cobalt-posix.h
+++ b/kernel/cobalt/trace/cobalt-posix.h
@@ -5,6 +5,7 @@
 #define _TRACE_COBALT_POSIX_H
 
 #include <linux/tracepoint.h>
+#include <xenomai/posix/cond.h>
 
 #define __timespec_fields(__name)                              \
        __field(__kernel_time_t, tv_sec_##__name)               \
@@ -70,21 +71,6 @@
        __ret;                                                          \
 })
 
-DECLARE_EVENT_CLASS(cobalt_posix_timespec,
-       TP_PROTO(struct timespec *ts),
-       TP_ARGS(ts),
-
-       TP_STRUCT__entry(
-               __timespec_fields(ts)
-       ),
-
-       TP_fast_assign(
-               __assign_timespec(ts, ts);
-       ),
-
-       TP_printk("time=(%ld.%09ld)", __timespec_args(ts))
-);
-
 DECLARE_EVENT_CLASS(cobalt_posix_schedparam,
        TP_PROTO(unsigned long pth, int policy,
                 struct sched_param_ex *param_ex),
@@ -658,6 +644,79 @@ DEFINE_EVENT(cobalt_clock_ident, cobalt_clock_deregister,
        TP_ARGS(name, clk_id)
 );
 
+#define cobalt_print_clock(__clk_id)                                   \
+       __print_symbolic(__clk_id,                                      \
+                        {CLOCK_MONOTONIC, "CLOCK_MONOTONIC"},          \
+                        {CLOCK_MONOTONIC_RAW, "CLOCK_MONOTONIC_RAW"},  \
+                        {CLOCK_REALTIME, "CLOCK_REALTIME"})
+
+TRACE_EVENT(cobalt_cond_init,
+       TP_PROTO(const struct cobalt_cond_shadow __user *u_cnd,
+                const pthread_condattr_t *attr),
+       TP_ARGS(u_cnd, attr),
+       TP_STRUCT__entry(
+               __field(const struct cobalt_cond_shadow __user *, u_cnd)
+               __field(clockid_t, clk_id)
+               __field(int, pshared)
+       ),
+       TP_fast_assign(
+               __entry->u_cnd = u_cnd;
+               __entry->clk_id = attr->clock;
+               __entry->pshared = attr->pshared;
+       ),
+       TP_printk("cond=%p attr={ .clock=%s, .pshared=%d }",
+                 __entry->u_cnd,
+                 cobalt_print_clock(__entry->clk_id),
+                 __entry->pshared)
+);
+
+TRACE_EVENT(cobalt_cond_destroy,
+       TP_PROTO(const struct cobalt_cond_shadow __user *u_cnd),
+       TP_ARGS(u_cnd),
+       TP_STRUCT__entry(
+               __field(const struct cobalt_cond_shadow __user *, u_cnd)
+       ),
+       TP_fast_assign(
+               __entry->u_cnd = u_cnd;
+       ),
+       TP_printk("cond=%p", __entry->u_cnd)
+);
+
+TRACE_EVENT(cobalt_cond_timedwait,
+       TP_PROTO(const struct cobalt_cond_shadow __user *u_cnd,
+                const struct cobalt_mutex_shadow __user *u_mx,
+                const struct timespec *timeout),
+       TP_ARGS(u_cnd, u_mx, timeout),
+       TP_STRUCT__entry(
+               __field(const struct cobalt_cond_shadow __user *, u_cnd)
+               __field(const struct cobalt_mutex_shadow __user *, u_mx)
+               __timespec_fields(timeout)
+       ),
+       TP_fast_assign(
+               __entry->u_cnd = u_cnd;
+               __entry->u_mx = u_mx;
+               __assign_timespec(timeout, timeout);
+       ),
+       TP_printk("cond=%p, mutex=%p, timeout=(%ld.%09ld)",
+                 __entry->u_cnd, __entry->u_mx, __timespec_args(timeout))
+);
+
+TRACE_EVENT(cobalt_cond_wait,
+       TP_PROTO(const struct cobalt_cond_shadow __user *u_cnd,
+                const struct cobalt_mutex_shadow __user *u_mx),
+       TP_ARGS(u_cnd, u_mx),
+       TP_STRUCT__entry(
+               __field(const struct cobalt_cond_shadow __user *, u_cnd)
+               __field(const struct cobalt_mutex_shadow __user *, u_mx)
+       ),
+       TP_fast_assign(
+               __entry->u_cnd = u_cnd;
+               __entry->u_mx = u_mx;
+       ),
+       TP_printk("cond=%p, mutex=%p",
+                 __entry->u_cnd, __entry->u_mx)
+);
+
 #endif /* _TRACE_COBALT_POSIX_H */
 
 /* This part must be outside protection */


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to