tracing: kernel: Add support for stopping workqueues

Adds tracing support for stopping workqueues.

Signed-off-by: Måns Ansgariusson <Mansgariusson@gmail.com>
This commit is contained in:
Måns Ansgariusson 2024-12-06 17:04:34 +01:00 committed by Benjamin Cabé
commit 7545e8d582
7 changed files with 49 additions and 0 deletions

View file

@ -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

View file

@ -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;
}

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)