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:
parent
82a9bc4589
commit
7545e8d582
7 changed files with 49 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue