From 7545e8d58211cdb80278b42811c6145be69585b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5ns=20Ansgariusson?= Date: Fri, 6 Dec 2024 17:04:34 +0100 Subject: [PATCH] tracing: kernel: Add support for stopping workqueues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds tracing support for stopping workqueues. Signed-off-by: Måns Ansgariusson --- include/zephyr/tracing/tracing.h | 22 ++++++++++++++++++++ kernel/work.c | 6 ++++++ subsys/tracing/ctf/tracing_ctf.h | 3 +++ subsys/tracing/sysview/tracing_sysview.h | 11 ++++++++++ subsys/tracing/sysview/tracing_sysview_ids.h | 1 + subsys/tracing/test/tracing_test.h | 3 +++ subsys/tracing/user/tracing_user.h | 3 +++ 7 files changed, 49 insertions(+) diff --git a/include/zephyr/tracing/tracing.h b/include/zephyr/tracing/tracing.h index 13cefa7f151..68a453a813f 100644 --- a/include/zephyr/tracing/tracing.h +++ b/include/zephyr/tracing/tracing.h @@ -427,6 +427,28 @@ */ #define sys_port_trace_k_work_queue_start_exit(queue) +/** + * @brief Trace stop of a Work Queue call entry + * @param queue Work Queue structure + * @param timeout Timeout period + */ +#define sys_port_trace_k_work_queue_stop_enter(queue, timeout) + +/** + * @brief Trace stop of a Work Queue call blocking + * @param queue Work Queue structure + * @param timeout Timeout period + */ +#define sys_port_trace_k_work_queue_stop_blocking(queue, timeout) + +/** + * @brief Trace stop of a Work Queue call exit + * @param queue Work Queue structure + * @param timeout Timeout period + * @param ret Return value + */ +#define sys_port_trace_k_work_queue_stop_exit(queue, timeout, ret) + /** * @brief Trace Work Queue drain call entry * @param queue Work Queue structure diff --git a/kernel/work.c b/kernel/work.c index ac5ac3eaaae..3e04033ff1b 100644 --- a/kernel/work.c +++ b/kernel/work.c @@ -822,28 +822,34 @@ int k_work_queue_stop(struct k_work_q *queue, k_timeout_t timeout) { __ASSERT_NO_MSG(queue); + SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_work_queue, stop, queue, timeout); k_spinlock_key_t key = k_spin_lock(&lock); if (!flag_test(&queue->flags, K_WORK_QUEUE_STARTED_BIT)) { k_spin_unlock(&lock, key); + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, -EALREADY); return -EALREADY; } if (!flag_test(&queue->flags, K_WORK_QUEUE_PLUGGED_BIT)) { k_spin_unlock(&lock, key); + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, -EBUSY); return -EBUSY; } flag_set(&queue->flags, K_WORK_QUEUE_STOP_BIT); notify_queue_locked(queue); k_spin_unlock(&lock, key); + SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_work_queue, stop, queue, timeout); if (k_thread_join(&queue->thread, timeout)) { key = k_spin_lock(&lock); flag_clear(&queue->flags, K_WORK_QUEUE_STOP_BIT); k_spin_unlock(&lock, key); + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, -ETIMEDOUT); return -ETIMEDOUT; } + SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, 0); return 0; } diff --git a/subsys/tracing/ctf/tracing_ctf.h b/subsys/tracing/ctf/tracing_ctf.h index 99f11c05913..1330e609dc1 100644 --- a/subsys/tracing/ctf/tracing_ctf.h +++ b/subsys/tracing/ctf/tracing_ctf.h @@ -90,6 +90,9 @@ extern "C" { #define sys_port_trace_k_work_queue_init(queue) #define sys_port_trace_k_work_queue_start_enter(queue) #define sys_port_trace_k_work_queue_start_exit(queue) +#define sys_port_trace_k_work_queue_stop_enter(queue, timeout) +#define sys_port_trace_k_work_queue_stop_blocking(queue, timeout) +#define sys_port_trace_k_work_queue_stop_exit(queue, timeout, ret) #define sys_port_trace_k_work_queue_drain_enter(queue) #define sys_port_trace_k_work_queue_drain_exit(queue, ret) #define sys_port_trace_k_work_queue_unplug_enter(queue) diff --git a/subsys/tracing/sysview/tracing_sysview.h b/subsys/tracing/sysview/tracing_sysview.h index 6fd0ba9f904..91716f2de36 100644 --- a/subsys/tracing/sysview/tracing_sysview.h +++ b/subsys/tracing/sysview/tracing_sysview.h @@ -180,6 +180,17 @@ void sys_trace_thread_info(struct k_thread *thread); #define sys_port_trace_k_work_queue_start_exit(queue) \ SEGGER_SYSVIEW_RecordEndCall(TID_WORK_QUEUE_START) +#define sys_port_trace_k_work_queue_stop_enter(queue, timeout) \ + SEGGER_SYSVIEW_RecordU32x2(TID_WORK_QUEUE_STOP, (uint32_t)(uintptr_t)queue, \ + (uint32_t)timeout.ticks) + +#define sys_port_trace_k_work_queue_stop_blocking(queue, timeout) \ + SEGGER_SYSVIEW_RecordU32x2(TID_WORK_QUEUE_STOP, (uint32_t)(uintptr_t)queue, \ + (uint32_t)timeout.ticks) + +#define sys_port_trace_k_work_queue_stop_exit(queue, timeout, ret) \ + SEGGER_SYSVIEW_RecordEndCallU32(TID_WORK_QUEUE_STOP, (uint32_t)ret) + #define sys_port_trace_k_work_queue_drain_enter(queue) \ SEGGER_SYSVIEW_RecordU32(TID_WORK_QUEUE_DRAIN, (uint32_t)(uintptr_t)queue) diff --git a/subsys/tracing/sysview/tracing_sysview_ids.h b/subsys/tracing/sysview/tracing_sysview_ids.h index d037b172f85..d69c5259c0b 100644 --- a/subsys/tracing/sysview/tracing_sysview_ids.h +++ b/subsys/tracing/sysview/tracing_sysview_ids.h @@ -129,6 +129,7 @@ extern "C" { #define TID_WORK_SUBMIT_TO_QUEUE (100u + TID_OFFSET) #define TID_WORK_QUEUE_UNPLUG (101u + TID_OFFSET) #define TID_WORK_QUEUE_INIT (102u + TID_OFFSET) +#define TID_WORK_QUEUE_STOP (103u + TID_OFFSET) #define TID_FIFO_INIT (110u + TID_OFFSET) #define TID_FIFO_CANCEL_WAIT (111u + TID_OFFSET) diff --git a/subsys/tracing/test/tracing_test.h b/subsys/tracing/test/tracing_test.h index ea15f2f473a..effc731475e 100644 --- a/subsys/tracing/test/tracing_test.h +++ b/subsys/tracing/test/tracing_test.h @@ -81,6 +81,9 @@ #define sys_port_trace_k_work_queue_init(queue) #define sys_port_trace_k_work_queue_start_enter(queue) #define sys_port_trace_k_work_queue_start_exit(queue) +#define sys_port_trace_k_work_queue_stop_enter(queue, timeout) +#define sys_port_trace_k_work_queue_stop_blocking(queue, timeout) +#define sys_port_trace_k_work_queue_stop_exit(queue, timeout, ret) #define sys_port_trace_k_work_queue_drain_enter(queue) #define sys_port_trace_k_work_queue_drain_exit(queue, ret) #define sys_port_trace_k_work_queue_unplug_enter(queue) diff --git a/subsys/tracing/user/tracing_user.h b/subsys/tracing/user/tracing_user.h index 28208095537..f1f4440dac6 100644 --- a/subsys/tracing/user/tracing_user.h +++ b/subsys/tracing/user/tracing_user.h @@ -155,6 +155,9 @@ void sys_trace_gpio_fire_callback_user(const struct device *port, struct gpio_ca #define sys_port_trace_k_work_queue_init(queue) #define sys_port_trace_k_work_queue_start_enter(queue) #define sys_port_trace_k_work_queue_start_exit(queue) +#define sys_port_trace_k_work_queue_stop_enter(queue, timeout) +#define sys_port_trace_k_work_queue_stop_blocking(queue, timeout) +#define sys_port_trace_k_work_queue_stop_exit(queue, timeout, ret) #define sys_port_trace_k_work_queue_drain_enter(queue) #define sys_port_trace_k_work_queue_drain_exit(queue, ret) #define sys_port_trace_k_work_queue_unplug_enter(queue)