From ed6148a841d358a4d92fab75d2fba2ef17cdd867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B6rn=20Leksell?= Date: Fri, 26 Mar 2021 10:28:23 +0100 Subject: [PATCH] Tracing: Mutex tracing hooks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add mutex trace hooks, default mutex trace hooks, and trace hook documentation. Signed-off-by: Torbjörn Leksell --- include/tracing/tracing.h | 72 +++++++++++++++++++++++++++++---------- kernel/mutex.c | 32 +++++++++++------ 2 files changed, 76 insertions(+), 28 deletions(-) diff --git a/include/tracing/tracing.h b/include/tracing/tracing.h index 0381ebc5ba0..896c54cdf6d 100644 --- a/include/tracing/tracing.h +++ b/include/tracing/tracing.h @@ -131,24 +131,6 @@ * @brief Called when the cpu enters the idle state */ #define sys_trace_idle() - -/** - * @brief Trace initialisation of a Mutex - * @param mutex Mutex object - */ -#define sys_trace_mutex_init(mutex) - -/** - * @brief Trace locking a Mutex - * @param mutex Mutex object - */ -#define sys_trace_mutex_lock(mutex) - -/** - * @brief Trace unlocking a Mutex - * @param mutex Mutex object - */ -#define sys_trace_mutex_unlock(mutex) /** * @} */ @@ -220,6 +202,60 @@ */ /* end of sem_tracing_apis */ + + +/** + * @brief Mutex Tracing APIs + * @defgroup mutex_tracing_apis Mutex Tracing APIs + * @ingroup tracing_apis + * @{ + */ + +/** + * @brief Trace initialization of Mutex + * @param mutex Mutex object + * @param ret Return value + */ +#define sys_port_trace_k_mutex_init(mutex, ret) + +/** + * @brief Trace Mutex lock attempt start + * @param mutex Mutex object + * @param timeout Timeout period + */ +#define sys_port_trace_k_mutex_lock_enter(mutex, timeout) + +/** + * @brief Trace Mutex lock attempt blocking + * @param mutex Mutex object + * @param timeout Timeout period + */ +#define sys_port_trace_k_mutex_lock_blocking(mutex, timeout) + +/** + * @brief Trace Mutex lock attempt outcome + * @param mutex Mutex object + * @param timeout Timeout period + * @param ret Return value + */ +#define sys_port_trace_k_mutex_lock_exit(mutex, timeout, ret) + +/** + * @brief Trace Mutex unlock entry + * @param mutex Mutex object + */ +#define sys_port_trace_k_mutex_unlock_enter(mutex) + +/** + * @brief Trace Mutex unlock exit + */ +#define sys_port_trace_k_mutex_unlock_exit(mutex, ret) + +/** + * @} + */ /* end of mutex_tracing_apis */ + + /** * @} */ diff --git a/kernel/mutex.c b/kernel/mutex.c index dd39013e347..7340df8da69 100644 --- a/kernel/mutex.c +++ b/kernel/mutex.c @@ -73,13 +73,12 @@ int z_impl_k_mutex_init(struct k_mutex *mutex) mutex->owner = NULL; mutex->lock_count = 0U; - sys_trace_mutex_init(mutex); - z_waitq_init(&mutex->wait_q); SYS_TRACING_OBJ_INIT(k_mutex, mutex); z_object_init(mutex); - sys_trace_end_call(SYS_TRACE_ID_MUTEX_INIT); + + SYS_PORT_TRACING_OBJ_INIT(k_mutex, mutex, 0); return 0; } @@ -124,7 +123,8 @@ int z_impl_k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout) __ASSERT(!arch_is_in_isr(), "mutexes cannot be used inside ISRs"); - sys_trace_mutex_lock(mutex); + SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_mutex, lock, mutex, timeout); + key = k_spin_lock(&lock); if (likely((mutex->lock_count == 0U) || (mutex->owner == _current))) { @@ -141,17 +141,22 @@ int z_impl_k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout) mutex->owner_orig_prio); k_spin_unlock(&lock, key); - sys_trace_end_call(SYS_TRACE_ID_MUTEX_LOCK); + + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, lock, mutex, timeout, 0); return 0; } if (unlikely(K_TIMEOUT_EQ(timeout, K_NO_WAIT))) { k_spin_unlock(&lock, key); - sys_trace_end_call(SYS_TRACE_ID_MUTEX_LOCK); + + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, lock, mutex, timeout, -EBUSY); + return -EBUSY; } + SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_mutex, lock, mutex, timeout); + new_prio = new_prio_for_inheritance(_current->base.prio, mutex->owner->base.prio); @@ -169,7 +174,7 @@ int z_impl_k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout) got_mutex ? 'y' : 'n'); if (got_mutex == 0) { - sys_trace_end_call(SYS_TRACE_ID_MUTEX_LOCK); + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, lock, mutex, timeout, 0); return 0; } @@ -195,7 +200,8 @@ int z_impl_k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout) k_spin_unlock(&lock, key); } - sys_trace_end_call(SYS_TRACE_ID_MUTEX_LOCK); + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, lock, mutex, timeout, -EAGAIN); + return -EAGAIN; } @@ -215,13 +221,19 @@ int z_impl_k_mutex_unlock(struct k_mutex *mutex) __ASSERT(!arch_is_in_isr(), "mutexes cannot be used inside ISRs"); + SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_mutex, unlock, mutex); + CHECKIF(mutex->owner == NULL) { + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, unlock, mutex, -EINVAL); + return -EINVAL; } /* * The current thread does not own the mutex. */ CHECKIF(mutex->owner != _current) { + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, unlock, mutex, -EPERM); + return -EPERM; } @@ -233,7 +245,6 @@ int z_impl_k_mutex_unlock(struct k_mutex *mutex) */ __ASSERT_NO_MSG(mutex->lock_count > 0U); - sys_trace_mutex_unlock(mutex); z_sched_lock(); LOG_DBG("mutex %p lock_count: %d", mutex, mutex->lock_count); @@ -277,7 +288,8 @@ int z_impl_k_mutex_unlock(struct k_mutex *mutex) k_mutex_unlock_return: k_sched_unlock(); - sys_trace_end_call(SYS_TRACE_ID_MUTEX_UNLOCK); + + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_mutex, unlock, mutex, 0); return 0; }