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)
|
#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
|
* @brief Trace Work Queue drain call entry
|
||||||
* @param queue Work Queue structure
|
* @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);
|
__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);
|
k_spinlock_key_t key = k_spin_lock(&lock);
|
||||||
|
|
||||||
if (!flag_test(&queue->flags, K_WORK_QUEUE_STARTED_BIT)) {
|
if (!flag_test(&queue->flags, K_WORK_QUEUE_STARTED_BIT)) {
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, -EALREADY);
|
||||||
return -EALREADY;
|
return -EALREADY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!flag_test(&queue->flags, K_WORK_QUEUE_PLUGGED_BIT)) {
|
if (!flag_test(&queue->flags, K_WORK_QUEUE_PLUGGED_BIT)) {
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, -EBUSY);
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
flag_set(&queue->flags, K_WORK_QUEUE_STOP_BIT);
|
flag_set(&queue->flags, K_WORK_QUEUE_STOP_BIT);
|
||||||
notify_queue_locked(queue);
|
notify_queue_locked(queue);
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_work_queue, stop, queue, timeout);
|
||||||
if (k_thread_join(&queue->thread, timeout)) {
|
if (k_thread_join(&queue->thread, timeout)) {
|
||||||
key = k_spin_lock(&lock);
|
key = k_spin_lock(&lock);
|
||||||
flag_clear(&queue->flags, K_WORK_QUEUE_STOP_BIT);
|
flag_clear(&queue->flags, K_WORK_QUEUE_STOP_BIT);
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, -ETIMEDOUT);
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_queue, stop, queue, timeout, 0);
|
||||||
return 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_init(queue)
|
||||||
#define sys_port_trace_k_work_queue_start_enter(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_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_enter(queue)
|
||||||
#define sys_port_trace_k_work_queue_drain_exit(queue, ret)
|
#define sys_port_trace_k_work_queue_drain_exit(queue, ret)
|
||||||
#define sys_port_trace_k_work_queue_unplug_enter(queue)
|
#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) \
|
#define sys_port_trace_k_work_queue_start_exit(queue) \
|
||||||
SEGGER_SYSVIEW_RecordEndCall(TID_WORK_QUEUE_START)
|
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) \
|
#define sys_port_trace_k_work_queue_drain_enter(queue) \
|
||||||
SEGGER_SYSVIEW_RecordU32(TID_WORK_QUEUE_DRAIN, (uint32_t)(uintptr_t)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_SUBMIT_TO_QUEUE (100u + TID_OFFSET)
|
||||||
#define TID_WORK_QUEUE_UNPLUG (101u + TID_OFFSET)
|
#define TID_WORK_QUEUE_UNPLUG (101u + TID_OFFSET)
|
||||||
#define TID_WORK_QUEUE_INIT (102u + 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_INIT (110u + TID_OFFSET)
|
||||||
#define TID_FIFO_CANCEL_WAIT (111u + 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_init(queue)
|
||||||
#define sys_port_trace_k_work_queue_start_enter(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_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_enter(queue)
|
||||||
#define sys_port_trace_k_work_queue_drain_exit(queue, ret)
|
#define sys_port_trace_k_work_queue_drain_exit(queue, ret)
|
||||||
#define sys_port_trace_k_work_queue_unplug_enter(queue)
|
#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_init(queue)
|
||||||
#define sys_port_trace_k_work_queue_start_enter(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_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_enter(queue)
|
||||||
#define sys_port_trace_k_work_queue_drain_exit(queue, ret)
|
#define sys_port_trace_k_work_queue_drain_exit(queue, ret)
|
||||||
#define sys_port_trace_k_work_queue_unplug_enter(queue)
|
#define sys_port_trace_k_work_queue_unplug_enter(queue)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue