[Xenomai-git] Philippe Gerum : cobalt/posix: introduce kernel tracepoints (WIP)
Module: xenomai-forge Branch: master Commit: 98ce20f3576fd68d62783512d77667a3ef84d11f URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=98ce20f3576fd68d62783512d77667a3ef84d11f Author: Philippe Gerum Date: Sat Apr 26 15:09:17 2014 +0200 cobalt/posix: introduce kernel tracepoints (WIP) --- kernel/cobalt/posix/nsem.c | 16 +- kernel/cobalt/posix/sem.c | 38 ++- kernel/cobalt/posix/thread.c | 95 -- kernel/cobalt/trace/cobalt-posix.h | 578 4 files changed, 696 insertions(+), 31 deletions(-) diff --git a/kernel/cobalt/posix/nsem.c b/kernel/cobalt/posix/nsem.c index e719560..f771ca5 100644 --- a/kernel/cobalt/posix/nsem.c +++ b/kernel/cobalt/posix/nsem.c @@ -24,13 +24,15 @@ #include #include "internal.h" #include "sem.h" +#include "thread.h" +#include DEFINE_XNLOCK(nsem_lock); struct nsem { struct cobalt_sem *sem; struct cobalt_sem_shadow __user *usem; - unsigned refs; + unsigned int refs; struct xnid id; }; @@ -47,7 +49,7 @@ static struct nsem *nsem_search(struct cobalt_process *cc, xnhandle_t handle) static struct cobalt_sem_shadow __user * nsem_open(struct cobalt_process *cc, struct cobalt_sem_shadow __user *ushadow, - const char *name, int oflags, mode_t mode, unsigned value) + const char *name, int oflags, mode_t mode, unsigned int value) { struct cobalt_sem_shadow shadow; struct cobalt_sem *sem; @@ -142,6 +144,8 @@ nsem_open(struct cobalt_process *cc, struct cobalt_sem_shadow __user *ushadow, xnlock_put_irqrestore(&nsem_lock, s); } + trace_cobalt_psem_open(name, handle, oflags, mode, value); + return u->usem; } @@ -206,8 +210,11 @@ int cobalt_sem_open(struct cobalt_sem_shadow __user *__user *u_addr, return -EINVAL; usm = nsem_open(cc, usm, name, oflags, mode, value); - if (IS_ERR(usm)) + if (IS_ERR(usm)) { + trace_cobalt_psem_open_failed(name, oflags, mode, + value, PTR_ERR(usm)); return PTR_ERR(usm); + } __xn_put_user(usm, u_addr); @@ -224,6 +231,7 @@ int cobalt_sem_close(struct cobalt_sem_shadow __user *usm) return -EPERM; handle = cobalt_get_handle_from_user(&usm->handle); + trace_cobalt_psem_close(handle); return nsem_close(cc, handle); } @@ -241,6 +249,8 @@ int cobalt_sem_unlink(const char __user *u_name) if (len >= sizeof(name)) return -ENAMETOOLONG; + trace_cobalt_psem_unlink(name); + if (name[0] != '/') return -EINVAL; diff --git a/kernel/cobalt/posix/sem.c b/kernel/cobalt/posix/sem.c index 5865b5c..8d6b4ed 100644 --- a/kernel/cobalt/posix/sem.c +++ b/kernel/cobalt/posix/sem.c @@ -37,6 +37,7 @@ #include "thread.h" #include "clock.h" #include "sem.h" +#include #define SEM_NAMED0x8000 @@ -94,12 +95,16 @@ cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm, int ret, sflags; spl_t s; - if ((flags & SEM_PULSE) != 0 && value > 0) - return ERR_PTR(-EINVAL); + if ((flags & SEM_PULSE) != 0 && value > 0) { + ret = -EINVAL; + goto out; + } sem = xnmalloc(sizeof(*sem)); - if (sem == NULL) - return ERR_PTR(-ENOSPC); + if (sem == NULL) { + ret = -ENOSPC; + goto out; + } ksformat(sem->name, sizeof(sem->name), "%s", name); @@ -168,13 +173,17 @@ cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm, sm->datp_offset = -sm->datp_offset; xnlock_put_irqrestore(&nklock, s); + trace_cobalt_psem_init(sem->name, sem->handle, flags, value); + return sem; - err_lock_put: +err_lock_put: xnlock_put_irqrestore(&nklock, s); xnheap_free(&sys_ppd->sem_heap, datp); - err_free_sem: +err_free_sem: xnfree(sem); +out: + trace_cobalt_psem_init_failed(name, flags, value, ret); return ERR_PTR(ret); } @@ -689,6 +698,7 @@ int cobalt_sem_post(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_post(handle); return sem_post(handle); } @@ -698,6 +708,7 @@ int cobalt_sem_wait(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_wait(handle); return sem_wait(handle); } @@ -708,6 +719,7 @@ int cobalt_sem_timedwait(struct cobalt_sem_shadow __user *u_sem, xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_timedwait(handle); return sem_timedwait(handle, u_ts); } @@ -717,6 +729,7 @@ int cobalt_sem_trywait(str
[Xenomai-git] Philippe Gerum : cobalt/posix: introduce kernel tracepoints (WIP)
Module: xenomai-forge Branch: next Commit: 98ce20f3576fd68d62783512d77667a3ef84d11f URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=98ce20f3576fd68d62783512d77667a3ef84d11f Author: Philippe Gerum Date: Sat Apr 26 15:09:17 2014 +0200 cobalt/posix: introduce kernel tracepoints (WIP) --- kernel/cobalt/posix/nsem.c | 16 +- kernel/cobalt/posix/sem.c | 38 ++- kernel/cobalt/posix/thread.c | 95 -- kernel/cobalt/trace/cobalt-posix.h | 578 4 files changed, 696 insertions(+), 31 deletions(-) diff --git a/kernel/cobalt/posix/nsem.c b/kernel/cobalt/posix/nsem.c index e719560..f771ca5 100644 --- a/kernel/cobalt/posix/nsem.c +++ b/kernel/cobalt/posix/nsem.c @@ -24,13 +24,15 @@ #include #include "internal.h" #include "sem.h" +#include "thread.h" +#include DEFINE_XNLOCK(nsem_lock); struct nsem { struct cobalt_sem *sem; struct cobalt_sem_shadow __user *usem; - unsigned refs; + unsigned int refs; struct xnid id; }; @@ -47,7 +49,7 @@ static struct nsem *nsem_search(struct cobalt_process *cc, xnhandle_t handle) static struct cobalt_sem_shadow __user * nsem_open(struct cobalt_process *cc, struct cobalt_sem_shadow __user *ushadow, - const char *name, int oflags, mode_t mode, unsigned value) + const char *name, int oflags, mode_t mode, unsigned int value) { struct cobalt_sem_shadow shadow; struct cobalt_sem *sem; @@ -142,6 +144,8 @@ nsem_open(struct cobalt_process *cc, struct cobalt_sem_shadow __user *ushadow, xnlock_put_irqrestore(&nsem_lock, s); } + trace_cobalt_psem_open(name, handle, oflags, mode, value); + return u->usem; } @@ -206,8 +210,11 @@ int cobalt_sem_open(struct cobalt_sem_shadow __user *__user *u_addr, return -EINVAL; usm = nsem_open(cc, usm, name, oflags, mode, value); - if (IS_ERR(usm)) + if (IS_ERR(usm)) { + trace_cobalt_psem_open_failed(name, oflags, mode, + value, PTR_ERR(usm)); return PTR_ERR(usm); + } __xn_put_user(usm, u_addr); @@ -224,6 +231,7 @@ int cobalt_sem_close(struct cobalt_sem_shadow __user *usm) return -EPERM; handle = cobalt_get_handle_from_user(&usm->handle); + trace_cobalt_psem_close(handle); return nsem_close(cc, handle); } @@ -241,6 +249,8 @@ int cobalt_sem_unlink(const char __user *u_name) if (len >= sizeof(name)) return -ENAMETOOLONG; + trace_cobalt_psem_unlink(name); + if (name[0] != '/') return -EINVAL; diff --git a/kernel/cobalt/posix/sem.c b/kernel/cobalt/posix/sem.c index 5865b5c..8d6b4ed 100644 --- a/kernel/cobalt/posix/sem.c +++ b/kernel/cobalt/posix/sem.c @@ -37,6 +37,7 @@ #include "thread.h" #include "clock.h" #include "sem.h" +#include #define SEM_NAMED0x8000 @@ -94,12 +95,16 @@ cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm, int ret, sflags; spl_t s; - if ((flags & SEM_PULSE) != 0 && value > 0) - return ERR_PTR(-EINVAL); + if ((flags & SEM_PULSE) != 0 && value > 0) { + ret = -EINVAL; + goto out; + } sem = xnmalloc(sizeof(*sem)); - if (sem == NULL) - return ERR_PTR(-ENOSPC); + if (sem == NULL) { + ret = -ENOSPC; + goto out; + } ksformat(sem->name, sizeof(sem->name), "%s", name); @@ -168,13 +173,17 @@ cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm, sm->datp_offset = -sm->datp_offset; xnlock_put_irqrestore(&nklock, s); + trace_cobalt_psem_init(sem->name, sem->handle, flags, value); + return sem; - err_lock_put: +err_lock_put: xnlock_put_irqrestore(&nklock, s); xnheap_free(&sys_ppd->sem_heap, datp); - err_free_sem: +err_free_sem: xnfree(sem); +out: + trace_cobalt_psem_init_failed(name, flags, value, ret); return ERR_PTR(ret); } @@ -689,6 +698,7 @@ int cobalt_sem_post(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_post(handle); return sem_post(handle); } @@ -698,6 +708,7 @@ int cobalt_sem_wait(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_wait(handle); return sem_wait(handle); } @@ -708,6 +719,7 @@ int cobalt_sem_timedwait(struct cobalt_sem_shadow __user *u_sem, xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_timedwait(handle); return sem_timedwait(handle, u_ts); } @@ -717,6 +729,7 @@ int cobalt_sem_trywait(struc
[Xenomai-git] Philippe Gerum : cobalt/posix: introduce kernel tracepoints (WIP)
Module: xenomai-forge Branch: next Commit: 338d69f5578bc6a560fe9de20d1340f6922e12af URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=338d69f5578bc6a560fe9de20d1340f6922e12af Author: Philippe Gerum Date: Sat Apr 26 15:09:17 2014 +0200 cobalt/posix: introduce kernel tracepoints (WIP) --- kernel/cobalt/posix/nsem.c | 16 +- kernel/cobalt/posix/sem.c | 38 ++- kernel/cobalt/posix/thread.c | 95 -- kernel/cobalt/trace/cobalt-posix.h | 578 4 files changed, 696 insertions(+), 31 deletions(-) diff --git a/kernel/cobalt/posix/nsem.c b/kernel/cobalt/posix/nsem.c index e719560..f771ca5 100644 --- a/kernel/cobalt/posix/nsem.c +++ b/kernel/cobalt/posix/nsem.c @@ -24,13 +24,15 @@ #include #include "internal.h" #include "sem.h" +#include "thread.h" +#include DEFINE_XNLOCK(nsem_lock); struct nsem { struct cobalt_sem *sem; struct cobalt_sem_shadow __user *usem; - unsigned refs; + unsigned int refs; struct xnid id; }; @@ -47,7 +49,7 @@ static struct nsem *nsem_search(struct cobalt_process *cc, xnhandle_t handle) static struct cobalt_sem_shadow __user * nsem_open(struct cobalt_process *cc, struct cobalt_sem_shadow __user *ushadow, - const char *name, int oflags, mode_t mode, unsigned value) + const char *name, int oflags, mode_t mode, unsigned int value) { struct cobalt_sem_shadow shadow; struct cobalt_sem *sem; @@ -142,6 +144,8 @@ nsem_open(struct cobalt_process *cc, struct cobalt_sem_shadow __user *ushadow, xnlock_put_irqrestore(&nsem_lock, s); } + trace_cobalt_psem_open(name, handle, oflags, mode, value); + return u->usem; } @@ -206,8 +210,11 @@ int cobalt_sem_open(struct cobalt_sem_shadow __user *__user *u_addr, return -EINVAL; usm = nsem_open(cc, usm, name, oflags, mode, value); - if (IS_ERR(usm)) + if (IS_ERR(usm)) { + trace_cobalt_psem_open_failed(name, oflags, mode, + value, PTR_ERR(usm)); return PTR_ERR(usm); + } __xn_put_user(usm, u_addr); @@ -224,6 +231,7 @@ int cobalt_sem_close(struct cobalt_sem_shadow __user *usm) return -EPERM; handle = cobalt_get_handle_from_user(&usm->handle); + trace_cobalt_psem_close(handle); return nsem_close(cc, handle); } @@ -241,6 +249,8 @@ int cobalt_sem_unlink(const char __user *u_name) if (len >= sizeof(name)) return -ENAMETOOLONG; + trace_cobalt_psem_unlink(name); + if (name[0] != '/') return -EINVAL; diff --git a/kernel/cobalt/posix/sem.c b/kernel/cobalt/posix/sem.c index 5865b5c..8d6b4ed 100644 --- a/kernel/cobalt/posix/sem.c +++ b/kernel/cobalt/posix/sem.c @@ -37,6 +37,7 @@ #include "thread.h" #include "clock.h" #include "sem.h" +#include #define SEM_NAMED0x8000 @@ -94,12 +95,16 @@ cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm, int ret, sflags; spl_t s; - if ((flags & SEM_PULSE) != 0 && value > 0) - return ERR_PTR(-EINVAL); + if ((flags & SEM_PULSE) != 0 && value > 0) { + ret = -EINVAL; + goto out; + } sem = xnmalloc(sizeof(*sem)); - if (sem == NULL) - return ERR_PTR(-ENOSPC); + if (sem == NULL) { + ret = -ENOSPC; + goto out; + } ksformat(sem->name, sizeof(sem->name), "%s", name); @@ -168,13 +173,17 @@ cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm, sm->datp_offset = -sm->datp_offset; xnlock_put_irqrestore(&nklock, s); + trace_cobalt_psem_init(sem->name, sem->handle, flags, value); + return sem; - err_lock_put: +err_lock_put: xnlock_put_irqrestore(&nklock, s); xnheap_free(&sys_ppd->sem_heap, datp); - err_free_sem: +err_free_sem: xnfree(sem); +out: + trace_cobalt_psem_init_failed(name, flags, value, ret); return ERR_PTR(ret); } @@ -689,6 +698,7 @@ int cobalt_sem_post(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_post(handle); return sem_post(handle); } @@ -698,6 +708,7 @@ int cobalt_sem_wait(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_wait(handle); return sem_wait(handle); } @@ -708,6 +719,7 @@ int cobalt_sem_timedwait(struct cobalt_sem_shadow __user *u_sem, xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_timedwait(handle); return sem_timedwait(handle, u_ts); } @@ -717,6 +729,7 @@ int cobalt_sem_trywait(struc
[Xenomai-git] Philippe Gerum : cobalt/posix: introduce kernel tracepoints (WIP)
Module: xenomai-forge Branch: next Commit: d65275b455a94320f43d363a65d2b95311c55c39 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=d65275b455a94320f43d363a65d2b95311c55c39 Author: Philippe Gerum Date: Sat Apr 26 15:09:17 2014 +0200 cobalt/posix: introduce kernel tracepoints (WIP) --- kernel/cobalt/posix/nsem.c | 16 +- kernel/cobalt/posix/sem.c | 38 ++- kernel/cobalt/posix/thread.c | 95 -- kernel/cobalt/trace/cobalt-posix.h | 578 4 files changed, 696 insertions(+), 31 deletions(-) diff --git a/kernel/cobalt/posix/nsem.c b/kernel/cobalt/posix/nsem.c index e719560..f771ca5 100644 --- a/kernel/cobalt/posix/nsem.c +++ b/kernel/cobalt/posix/nsem.c @@ -24,13 +24,15 @@ #include #include "internal.h" #include "sem.h" +#include "thread.h" +#include DEFINE_XNLOCK(nsem_lock); struct nsem { struct cobalt_sem *sem; struct cobalt_sem_shadow __user *usem; - unsigned refs; + unsigned int refs; struct xnid id; }; @@ -47,7 +49,7 @@ static struct nsem *nsem_search(struct cobalt_process *cc, xnhandle_t handle) static struct cobalt_sem_shadow __user * nsem_open(struct cobalt_process *cc, struct cobalt_sem_shadow __user *ushadow, - const char *name, int oflags, mode_t mode, unsigned value) + const char *name, int oflags, mode_t mode, unsigned int value) { struct cobalt_sem_shadow shadow; struct cobalt_sem *sem; @@ -142,6 +144,8 @@ nsem_open(struct cobalt_process *cc, struct cobalt_sem_shadow __user *ushadow, xnlock_put_irqrestore(&nsem_lock, s); } + trace_cobalt_psem_open(name, handle, oflags, mode, value); + return u->usem; } @@ -206,8 +210,11 @@ int cobalt_sem_open(struct cobalt_sem_shadow __user *__user *u_addr, return -EINVAL; usm = nsem_open(cc, usm, name, oflags, mode, value); - if (IS_ERR(usm)) + if (IS_ERR(usm)) { + trace_cobalt_psem_open_failed(name, oflags, mode, + value, PTR_ERR(usm)); return PTR_ERR(usm); + } __xn_put_user(usm, u_addr); @@ -224,6 +231,7 @@ int cobalt_sem_close(struct cobalt_sem_shadow __user *usm) return -EPERM; handle = cobalt_get_handle_from_user(&usm->handle); + trace_cobalt_psem_close(handle); return nsem_close(cc, handle); } @@ -241,6 +249,8 @@ int cobalt_sem_unlink(const char __user *u_name) if (len >= sizeof(name)) return -ENAMETOOLONG; + trace_cobalt_psem_unlink(name); + if (name[0] != '/') return -EINVAL; diff --git a/kernel/cobalt/posix/sem.c b/kernel/cobalt/posix/sem.c index 5865b5c..8d6b4ed 100644 --- a/kernel/cobalt/posix/sem.c +++ b/kernel/cobalt/posix/sem.c @@ -37,6 +37,7 @@ #include "thread.h" #include "clock.h" #include "sem.h" +#include #define SEM_NAMED0x8000 @@ -94,12 +95,16 @@ cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm, int ret, sflags; spl_t s; - if ((flags & SEM_PULSE) != 0 && value > 0) - return ERR_PTR(-EINVAL); + if ((flags & SEM_PULSE) != 0 && value > 0) { + ret = -EINVAL; + goto out; + } sem = xnmalloc(sizeof(*sem)); - if (sem == NULL) - return ERR_PTR(-ENOSPC); + if (sem == NULL) { + ret = -ENOSPC; + goto out; + } ksformat(sem->name, sizeof(sem->name), "%s", name); @@ -168,13 +173,17 @@ cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm, sm->datp_offset = -sm->datp_offset; xnlock_put_irqrestore(&nklock, s); + trace_cobalt_psem_init(sem->name, sem->handle, flags, value); + return sem; - err_lock_put: +err_lock_put: xnlock_put_irqrestore(&nklock, s); xnheap_free(&sys_ppd->sem_heap, datp); - err_free_sem: +err_free_sem: xnfree(sem); +out: + trace_cobalt_psem_init_failed(name, flags, value, ret); return ERR_PTR(ret); } @@ -689,6 +698,7 @@ int cobalt_sem_post(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_post(handle); return sem_post(handle); } @@ -698,6 +708,7 @@ int cobalt_sem_wait(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_wait(handle); return sem_wait(handle); } @@ -708,6 +719,7 @@ int cobalt_sem_timedwait(struct cobalt_sem_shadow __user *u_sem, xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_timedwait(handle); return sem_timedwait(handle, u_ts); } @@ -717,6 +729,7 @@ int cobalt_sem_trywait(struc
[Xenomai-git] Philippe Gerum : cobalt/posix: introduce kernel tracepoints (WIP)
Module: xenomai-forge Branch: next Commit: 0b01c40091127d6a0b033e3a6e590ccd693764dd URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=0b01c40091127d6a0b033e3a6e590ccd693764dd Author: Philippe Gerum Date: Sat Apr 26 15:09:17 2014 +0200 cobalt/posix: introduce kernel tracepoints (WIP) --- kernel/cobalt/posix/sem.c | 38 ++- kernel/cobalt/posix/thread.c | 95 +-- kernel/cobalt/thread.c |4 +- kernel/cobalt/trace/cobalt-posix.h | 492 4 files changed, 599 insertions(+), 30 deletions(-) diff --git a/kernel/cobalt/posix/sem.c b/kernel/cobalt/posix/sem.c index 5865b5c..8d6b4ed 100644 --- a/kernel/cobalt/posix/sem.c +++ b/kernel/cobalt/posix/sem.c @@ -37,6 +37,7 @@ #include "thread.h" #include "clock.h" #include "sem.h" +#include #define SEM_NAMED0x8000 @@ -94,12 +95,16 @@ cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm, int ret, sflags; spl_t s; - if ((flags & SEM_PULSE) != 0 && value > 0) - return ERR_PTR(-EINVAL); + if ((flags & SEM_PULSE) != 0 && value > 0) { + ret = -EINVAL; + goto out; + } sem = xnmalloc(sizeof(*sem)); - if (sem == NULL) - return ERR_PTR(-ENOSPC); + if (sem == NULL) { + ret = -ENOSPC; + goto out; + } ksformat(sem->name, sizeof(sem->name), "%s", name); @@ -168,13 +173,17 @@ cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm, sm->datp_offset = -sm->datp_offset; xnlock_put_irqrestore(&nklock, s); + trace_cobalt_psem_init(sem->name, sem->handle, flags, value); + return sem; - err_lock_put: +err_lock_put: xnlock_put_irqrestore(&nklock, s); xnheap_free(&sys_ppd->sem_heap, datp); - err_free_sem: +err_free_sem: xnfree(sem); +out: + trace_cobalt_psem_init_failed(name, flags, value, ret); return ERR_PTR(ret); } @@ -689,6 +698,7 @@ int cobalt_sem_post(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_post(handle); return sem_post(handle); } @@ -698,6 +708,7 @@ int cobalt_sem_wait(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_wait(handle); return sem_wait(handle); } @@ -708,6 +719,7 @@ int cobalt_sem_timedwait(struct cobalt_sem_shadow __user *u_sem, xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_timedwait(handle); return sem_timedwait(handle, u_ts); } @@ -717,6 +729,7 @@ int cobalt_sem_trywait(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_trywait(handle); return sem_trywait(handle); } @@ -724,13 +737,14 @@ int cobalt_sem_trywait(struct cobalt_sem_shadow __user *u_sem) int cobalt_sem_getvalue(struct cobalt_sem_shadow __user *u_sem, int __user *u_sval) { xnhandle_t handle; - int err, sval; + int ret, sval; handle = cobalt_get_handle_from_user(&u_sem->handle); - err = sem_getvalue(handle, &sval); - if (err < 0) - return err; + ret = sem_getvalue(handle, &sval); + trace_cobalt_psem_getvalue(handle, ret ? -1 : sval); + if (ret) + return ret; return __xn_safe_copy_to_user(u_sval, &sval, sizeof(sval)); } @@ -743,6 +757,8 @@ int cobalt_sem_destroy(struct cobalt_sem_shadow __user *u_sem) if (__xn_safe_copy_from_user(&sm, u_sem, sizeof(sm))) return -EFAULT; + trace_cobalt_psem_destroy(sm.handle); + err = sem_destroy(&sm); if (err < 0) return err; @@ -778,6 +794,7 @@ int cobalt_sem_broadcast_np(struct cobalt_sem_shadow __user *u_sem) int err; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_broadcast(u_sem->handle); xnlock_get_irqsave(&nklock, s); sm = xnregistry_lookup(handle, NULL); @@ -802,6 +819,7 @@ int cobalt_sem_inquire(struct cobalt_sem_shadow __user *u_sem, spl_t s; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_inquire(handle); nrpids = waitsz / sizeof(pid_t); diff --git a/kernel/cobalt/posix/thread.c b/kernel/cobalt/posix/thread.c index 83f58d0..e11e777 100644 --- a/kernel/cobalt/posix/thread.c +++ b/kernel/cobalt/posix/thread.c @@ -40,6 +40,9 @@ #include "signal.h" #include "timer.h" #include "clock.h" +#include "sem.h" +#define CREATE_TRACE_POINTS +#include xnticks_t cobalt_time_slice; @@ -812,18 +815,19 @@ int cobalt_thread_setschedparam_ex(unsigned long pth,
[Xenomai-git] Philippe Gerum : cobalt/posix: introduce kernel tracepoints (WIP)
Module: xenomai-forge Branch: next Commit: fd4a55eee75271b0f642972e079061283459443a URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=fd4a55eee75271b0f642972e079061283459443a Author: Philippe Gerum Date: Sat Apr 26 15:09:17 2014 +0200 cobalt/posix: introduce kernel tracepoints (WIP) --- kernel/cobalt/posix/sem.c | 38 ++- kernel/cobalt/posix/thread.c | 95 +-- kernel/cobalt/thread.c |4 +- kernel/cobalt/trace/cobalt-posix.h | 492 4 files changed, 599 insertions(+), 30 deletions(-) diff --git a/kernel/cobalt/posix/sem.c b/kernel/cobalt/posix/sem.c index 718618c..bc0ccf6 100644 --- a/kernel/cobalt/posix/sem.c +++ b/kernel/cobalt/posix/sem.c @@ -37,6 +37,7 @@ #include "thread.h" #include "clock.h" #include "sem.h" +#include #define SEM_NAMED0x8000 @@ -94,12 +95,16 @@ cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm, int ret, sflags; spl_t s; - if ((flags & SEM_PULSE) != 0 && value > 0) - return ERR_PTR(-EINVAL); + if ((flags & SEM_PULSE) != 0 && value > 0) { + ret = -EINVAL; + goto out; + } sem = xnmalloc(sizeof(*sem)); - if (sem == NULL) - return ERR_PTR(-ENOSPC); + if (sem == NULL) { + ret = -ENOSPC; + goto out; + } ksformat(sem->name, sizeof(sem->name), "%s", name); @@ -168,13 +173,17 @@ cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm, sm->datp_offset = -sm->datp_offset; xnlock_put_irqrestore(&nklock, s); + trace_cobalt_psem_init(sem->name, sem->handle, flags, value); + return sem; - err_lock_put: +err_lock_put: xnlock_put_irqrestore(&nklock, s); xnheap_free(&sys_ppd->sem_heap, datp); - err_free_sem: +err_free_sem: xnfree(sem); +out: + trace_cobalt_psem_init_failed(name, flags, value, ret); return ERR_PTR(ret); } @@ -683,6 +692,7 @@ int cobalt_sem_post(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_post(handle); return sem_post(handle); } @@ -692,6 +702,7 @@ int cobalt_sem_wait(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_wait(handle); return sem_wait(handle); } @@ -702,6 +713,7 @@ int cobalt_sem_timedwait(struct cobalt_sem_shadow __user *u_sem, xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_timedwait(handle); return sem_timedwait(handle, u_ts); } @@ -711,6 +723,7 @@ int cobalt_sem_trywait(struct cobalt_sem_shadow __user *u_sem) xnhandle_t handle; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_trywait(handle); return sem_trywait(handle); } @@ -718,13 +731,14 @@ int cobalt_sem_trywait(struct cobalt_sem_shadow __user *u_sem) int cobalt_sem_getvalue(struct cobalt_sem_shadow __user *u_sem, int __user *u_sval) { xnhandle_t handle; - int err, sval; + int ret, sval; handle = cobalt_get_handle_from_user(&u_sem->handle); - err = sem_getvalue(handle, &sval); - if (err < 0) - return err; + ret = sem_getvalue(handle, &sval); + trace_cobalt_psem_getvalue(handle, ret ? -1 : sval); + if (ret) + return ret; return __xn_safe_copy_to_user(u_sval, &sval, sizeof(sval)); } @@ -737,6 +751,8 @@ int cobalt_sem_destroy(struct cobalt_sem_shadow __user *u_sem) if (__xn_safe_copy_from_user(&sm, u_sem, sizeof(sm))) return -EFAULT; + trace_cobalt_psem_destroy(sm.handle); + err = sem_destroy(&sm); if (err < 0) return err; @@ -772,6 +788,7 @@ int cobalt_sem_broadcast_np(struct cobalt_sem_shadow __user *u_sem) int err; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_broadcast(u_sem->handle); xnlock_get_irqsave(&nklock, s); sm = xnregistry_lookup(handle, NULL); @@ -796,6 +813,7 @@ int cobalt_sem_inquire(struct cobalt_sem_shadow __user *u_sem, spl_t s; handle = cobalt_get_handle_from_user(&u_sem->handle); + trace_cobalt_psem_inquire(handle); nrpids = waitsz / sizeof(pid_t); diff --git a/kernel/cobalt/posix/thread.c b/kernel/cobalt/posix/thread.c index 83f58d0..e11e777 100644 --- a/kernel/cobalt/posix/thread.c +++ b/kernel/cobalt/posix/thread.c @@ -40,6 +40,9 @@ #include "signal.h" #include "timer.h" #include "clock.h" +#include "sem.h" +#define CREATE_TRACE_POINTS +#include xnticks_t cobalt_time_slice; @@ -812,18 +815,19 @@ int cobalt_thread_setschedparam_ex(unsigned long pth,