Skip to content

Commit 7545e8d

Browse files
Mattemagikernkartben
authored andcommitted
tracing: kernel: Add support for stopping workqueues
Adds tracing support for stopping workqueues. Signed-off-by: Måns Ansgariusson <[email protected]>
1 parent 82a9bc4 commit 7545e8d

File tree

7 files changed

+49
-0
lines changed

7 files changed

+49
-0
lines changed

include/zephyr/tracing/tracing.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,28 @@
427427
*/
428428
#define sys_port_trace_k_work_queue_start_exit(queue)
429429

430+
/**
431+
* @brief Trace stop of a Work Queue call entry
432+
* @param queue Work Queue structure
433+
* @param timeout Timeout period
434+
*/
435+
#define sys_port_trace_k_work_queue_stop_enter(queue, timeout)
436+
437+
/**
438+
* @brief Trace stop of a Work Queue call blocking
439+
* @param queue Work Queue structure
440+
* @param timeout Timeout period
441+
*/
442+
#define sys_port_trace_k_work_queue_stop_blocking(queue, timeout)
443+
444+
/**
445+
* @brief Trace stop of a Work Queue call exit
446+
* @param queue Work Queue structure
447+
* @param timeout Timeout period
448+
* @param ret Return value
449+
*/
450+
#define sys_port_trace_k_work_queue_stop_exit(queue, timeout, ret)
451+
430452
/**
431453
* @brief Trace Work Queue drain call entry
432454
* @param queue Work Queue structure

kernel/work.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,28 +822,34 @@ int k_work_queue_stop(struct k_work_q *queue, k_timeout_t timeout)
822822
{
823823
__ASSERT_NO_MSG(queue);
824824

825+
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_work_queue, stop, queue, timeout);
825826
k_spinlock_key_t key = k_spin_lock(&lock);
826827

827828
if (!flag_test(&queue->flags, K_WORK_QUEUE_STARTED_BIT)) {
828829
k_spin_unlock(&lock, key);
830+
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, -EALREADY);
829831
return -EALREADY;
830832
}
831833

832834
if (!flag_test(&queue->flags, K_WORK_QUEUE_PLUGGED_BIT)) {
833835
k_spin_unlock(&lock, key);
836+
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, -EBUSY);
834837
return -EBUSY;
835838
}
836839

837840
flag_set(&queue->flags, K_WORK_QUEUE_STOP_BIT);
838841
notify_queue_locked(queue);
839842
k_spin_unlock(&lock, key);
843+
SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_work_queue, stop, queue, timeout);
840844
if (k_thread_join(&queue->thread, timeout)) {
841845
key = k_spin_lock(&lock);
842846
flag_clear(&queue->flags, K_WORK_QUEUE_STOP_BIT);
843847
k_spin_unlock(&lock, key);
848+
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, -ETIMEDOUT);
844849
return -ETIMEDOUT;
845850
}
846851

852+
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, 0);
847853
return 0;
848854
}
849855

subsys/tracing/ctf/tracing_ctf.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ extern "C" {
9090
#define sys_port_trace_k_work_queue_init(queue)
9191
#define sys_port_trace_k_work_queue_start_enter(queue)
9292
#define sys_port_trace_k_work_queue_start_exit(queue)
93+
#define sys_port_trace_k_work_queue_stop_enter(queue, timeout)
94+
#define sys_port_trace_k_work_queue_stop_blocking(queue, timeout)
95+
#define sys_port_trace_k_work_queue_stop_exit(queue, timeout, ret)
9396
#define sys_port_trace_k_work_queue_drain_enter(queue)
9497
#define sys_port_trace_k_work_queue_drain_exit(queue, ret)
9598
#define sys_port_trace_k_work_queue_unplug_enter(queue)

subsys/tracing/sysview/tracing_sysview.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,17 @@ void sys_trace_thread_info(struct k_thread *thread);
180180
#define sys_port_trace_k_work_queue_start_exit(queue) \
181181
SEGGER_SYSVIEW_RecordEndCall(TID_WORK_QUEUE_START)
182182

183+
#define sys_port_trace_k_work_queue_stop_enter(queue, timeout) \
184+
SEGGER_SYSVIEW_RecordU32x2(TID_WORK_QUEUE_STOP, (uint32_t)(uintptr_t)queue, \
185+
(uint32_t)timeout.ticks)
186+
187+
#define sys_port_trace_k_work_queue_stop_blocking(queue, timeout) \
188+
SEGGER_SYSVIEW_RecordU32x2(TID_WORK_QUEUE_STOP, (uint32_t)(uintptr_t)queue, \
189+
(uint32_t)timeout.ticks)
190+
191+
#define sys_port_trace_k_work_queue_stop_exit(queue, timeout, ret) \
192+
SEGGER_SYSVIEW_RecordEndCallU32(TID_WORK_QUEUE_STOP, (uint32_t)ret)
193+
183194
#define sys_port_trace_k_work_queue_drain_enter(queue) \
184195
SEGGER_SYSVIEW_RecordU32(TID_WORK_QUEUE_DRAIN, (uint32_t)(uintptr_t)queue)
185196

subsys/tracing/sysview/tracing_sysview_ids.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ extern "C" {
129129
#define TID_WORK_SUBMIT_TO_QUEUE (100u + TID_OFFSET)
130130
#define TID_WORK_QUEUE_UNPLUG (101u + TID_OFFSET)
131131
#define TID_WORK_QUEUE_INIT (102u + TID_OFFSET)
132+
#define TID_WORK_QUEUE_STOP (103u + TID_OFFSET)
132133

133134
#define TID_FIFO_INIT (110u + TID_OFFSET)
134135
#define TID_FIFO_CANCEL_WAIT (111u + TID_OFFSET)

subsys/tracing/test/tracing_test.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@
8181
#define sys_port_trace_k_work_queue_init(queue)
8282
#define sys_port_trace_k_work_queue_start_enter(queue)
8383
#define sys_port_trace_k_work_queue_start_exit(queue)
84+
#define sys_port_trace_k_work_queue_stop_enter(queue, timeout)
85+
#define sys_port_trace_k_work_queue_stop_blocking(queue, timeout)
86+
#define sys_port_trace_k_work_queue_stop_exit(queue, timeout, ret)
8487
#define sys_port_trace_k_work_queue_drain_enter(queue)
8588
#define sys_port_trace_k_work_queue_drain_exit(queue, ret)
8689
#define sys_port_trace_k_work_queue_unplug_enter(queue)

subsys/tracing/user/tracing_user.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,9 @@ void sys_trace_gpio_fire_callback_user(const struct device *port, struct gpio_ca
155155
#define sys_port_trace_k_work_queue_init(queue)
156156
#define sys_port_trace_k_work_queue_start_enter(queue)
157157
#define sys_port_trace_k_work_queue_start_exit(queue)
158+
#define sys_port_trace_k_work_queue_stop_enter(queue, timeout)
159+
#define sys_port_trace_k_work_queue_stop_blocking(queue, timeout)
160+
#define sys_port_trace_k_work_queue_stop_exit(queue, timeout, ret)
158161
#define sys_port_trace_k_work_queue_drain_enter(queue)
159162
#define sys_port_trace_k_work_queue_drain_exit(queue, ret)
160163
#define sys_port_trace_k_work_queue_unplug_enter(queue)

0 commit comments

Comments
 (0)