Tracing: Poll API and Work Poll tracing
Add Poll API and Work Poll tracing, default hooks, and documentation. Signed-off-by: Torbjörn Leksell <torbjorn.leksell@percepio.com> Signed-off-by: Anas Nashif <anas.nashif@intel.com>
This commit is contained in:
parent
3a66d6c695
commit
cae9a905d4
3 changed files with 208 additions and 12 deletions
|
@ -4119,14 +4119,10 @@ extern int k_work_poll_submit_to_queue(struct k_work_q *work_q,
|
||||||
* @retval -EINVAL Work item is being processed or has completed its work.
|
* @retval -EINVAL Work item is being processed or has completed its work.
|
||||||
* @retval -EADDRINUSE Work item is pending on a different workqueue.
|
* @retval -EADDRINUSE Work item is pending on a different workqueue.
|
||||||
*/
|
*/
|
||||||
static inline int k_work_poll_submit(struct k_work_poll *work,
|
extern int k_work_poll_submit(struct k_work_poll *work,
|
||||||
struct k_poll_event *events,
|
struct k_poll_event *events,
|
||||||
int num_events,
|
int num_events,
|
||||||
k_timeout_t timeout)
|
k_timeout_t timeout);
|
||||||
{
|
|
||||||
return k_work_poll_submit_to_queue(&k_sys_work_q, work,
|
|
||||||
events, num_events, timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Cancel a triggered work item.
|
* @brief Cancel a triggered work item.
|
||||||
|
@ -5401,11 +5397,6 @@ __syscall void k_poll_signal_init(struct k_poll_signal *sig);
|
||||||
*/
|
*/
|
||||||
__syscall void k_poll_signal_reset(struct k_poll_signal *sig);
|
__syscall void k_poll_signal_reset(struct k_poll_signal *sig);
|
||||||
|
|
||||||
static inline void z_impl_k_poll_signal_reset(struct k_poll_signal *sig)
|
|
||||||
{
|
|
||||||
sig->signaled = 0U;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Fetch the signaled state and result value of a poll signal
|
* @brief Fetch the signaled state and result value of a poll signal
|
||||||
*
|
*
|
||||||
|
|
|
@ -314,6 +314,143 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Work Poll Tracing APIs
|
||||||
|
* @defgroup work_poll_tracing_apis Work Poll Tracing APIs
|
||||||
|
* @ingroup tracing_apis
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace initialisation of a Work Poll structure enter
|
||||||
|
* @param work Work structure
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_work_poll_init_enter(work)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace initialisation of a Work Poll structure exit
|
||||||
|
* @param work Work structure
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_work_poll_init_exit(work)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace work poll submit to queue enter
|
||||||
|
* @param work_q Work queue
|
||||||
|
* @param work Work structure
|
||||||
|
* @param timeout Timeout period
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_work_poll_submit_to_queue_enter(work_q, work, timeout)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace work poll submit to queue blocking
|
||||||
|
* @param work_q Work queue
|
||||||
|
* @param work Work structure
|
||||||
|
* @param timeout Timeout period
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_work_poll_submit_to_queue_blocking(work_q, work, timeout)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace work poll submit to queue exit
|
||||||
|
* @param work_q Work queue
|
||||||
|
* @param work Work structure
|
||||||
|
* @param timeout Timeout period
|
||||||
|
* @param ret Return value
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_work_poll_submit_to_queue_exit(work_q, work, timeout, ret)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace work poll submit to system queue enter
|
||||||
|
* @param work Work structure
|
||||||
|
* @param timeout Timeout period
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_work_poll_submit_enter(work, timeout)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace work poll submit to system queue exit
|
||||||
|
* @param work Work structure
|
||||||
|
* @param timeout Timeout period
|
||||||
|
* @param ret Return value
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_work_poll_submit_exit(work, timeout, ret)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace work poll cancel enter
|
||||||
|
* @param work Work structure
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_work_poll_cancel_enter(work)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace work poll cancel exit
|
||||||
|
* @param work Work structure
|
||||||
|
* @param ret Return value
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_work_poll_cancel_exit(work, ret)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/ /* end of work_poll_tracing_apis */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Poll Tracing APIs
|
||||||
|
* @defgroup poll_tracing_apis Poll Tracing APIs
|
||||||
|
* @ingroup tracing_apis
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace initialisation of a Poll Event
|
||||||
|
* @param event Poll Event
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_poll_api_event_init(event)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Polling call start
|
||||||
|
* @param events Poll Events
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_poll_api_poll_enter(events)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Polling call outcome
|
||||||
|
* @param events Poll Events
|
||||||
|
* @param ret Return value
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_poll_api_poll_exit(events, ret)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace initialisation of a Poll Signal
|
||||||
|
* @param signal Poll Signal
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_poll_api_signal_init(signal)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace resetting of Poll Signal
|
||||||
|
* @param signal Poll Signal
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_poll_api_signal_reset(signal)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace checking of Poll Signal
|
||||||
|
* @param signal Poll Signal
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_poll_api_signal_check(signal)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace raising of Poll Signal
|
||||||
|
* @param signal Poll Signal
|
||||||
|
* @param ret Return value
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_poll_api_signal_raise(signal, ret)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/ /* end of poll_tracing_apis */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Semaphore Tracing APIs
|
* @brief Semaphore Tracing APIs
|
||||||
* @defgroup sem_tracing_apis Semaphore Tracing APIs
|
* @defgroup sem_tracing_apis Semaphore Tracing APIs
|
||||||
|
|
|
@ -54,6 +54,8 @@ void k_poll_event_init(struct k_poll_event *event, uint32_t type,
|
||||||
event->mode = mode;
|
event->mode = mode;
|
||||||
event->unused = 0U;
|
event->unused = 0U;
|
||||||
event->obj = obj;
|
event->obj = obj;
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC(k_poll_api, event_init, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* must be called with interrupts locked */
|
/* must be called with interrupts locked */
|
||||||
|
@ -277,6 +279,8 @@ int z_impl_k_poll(struct k_poll_event *events, int num_events,
|
||||||
__ASSERT(events != NULL, "NULL events\n");
|
__ASSERT(events != NULL, "NULL events\n");
|
||||||
__ASSERT(num_events >= 0, "<0 events\n");
|
__ASSERT(num_events >= 0, "<0 events\n");
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC_ENTER(k_poll_api, poll, events);
|
||||||
|
|
||||||
events_registered = register_events(events, num_events, poller,
|
events_registered = register_events(events, num_events, poller,
|
||||||
K_TIMEOUT_EQ(timeout, K_NO_WAIT));
|
K_TIMEOUT_EQ(timeout, K_NO_WAIT));
|
||||||
|
|
||||||
|
@ -290,6 +294,9 @@ int z_impl_k_poll(struct k_poll_event *events, int num_events,
|
||||||
if (!poller->is_polling) {
|
if (!poller->is_polling) {
|
||||||
clear_event_registrations(events, events_registered, key);
|
clear_event_registrations(events, events_registered, key);
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC_EXIT(k_poll_api, poll, events, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,6 +304,9 @@ int z_impl_k_poll(struct k_poll_event *events, int num_events,
|
||||||
|
|
||||||
if (K_TIMEOUT_EQ(timeout, K_NO_WAIT)) {
|
if (K_TIMEOUT_EQ(timeout, K_NO_WAIT)) {
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC_EXIT(k_poll_api, poll, events, -EAGAIN);
|
||||||
|
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -317,6 +327,8 @@ int z_impl_k_poll(struct k_poll_event *events, int num_events,
|
||||||
clear_event_registrations(events, events_registered, key);
|
clear_event_registrations(events, events_registered, key);
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC_EXIT(k_poll_api, poll, events, swap_rc);
|
||||||
|
|
||||||
return swap_rc;
|
return swap_rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -440,8 +452,10 @@ void z_impl_k_poll_signal_init(struct k_poll_signal *sig)
|
||||||
{
|
{
|
||||||
sys_dlist_init(&sig->poll_events);
|
sys_dlist_init(&sig->poll_events);
|
||||||
sig->signaled = 0U;
|
sig->signaled = 0U;
|
||||||
/* sig->result is left unitialized */
|
/* signal->result is left unitialized */
|
||||||
z_object_init(sig);
|
z_object_init(sig);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC(k_poll_api, signal_init, sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_USERSPACE
|
#ifdef CONFIG_USERSPACE
|
||||||
|
@ -453,11 +467,20 @@ static inline void z_vrfy_k_poll_signal_init(struct k_poll_signal *sig)
|
||||||
#include <syscalls/k_poll_signal_init_mrsh.c>
|
#include <syscalls/k_poll_signal_init_mrsh.c>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void z_impl_k_poll_signal_reset(struct k_poll_signal *sig)
|
||||||
|
{
|
||||||
|
sig->signaled = 0U;
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC(k_poll_api, signal_reset, sig);
|
||||||
|
}
|
||||||
|
|
||||||
void z_impl_k_poll_signal_check(struct k_poll_signal *sig,
|
void z_impl_k_poll_signal_check(struct k_poll_signal *sig,
|
||||||
unsigned int *signaled, int *result)
|
unsigned int *signaled, int *result)
|
||||||
{
|
{
|
||||||
*signaled = sig->signaled;
|
*signaled = sig->signaled;
|
||||||
*result = sig->result;
|
*result = sig->result;
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC(k_poll_api, signal_check, sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_USERSPACE
|
#ifdef CONFIG_USERSPACE
|
||||||
|
@ -483,11 +506,16 @@ int z_impl_k_poll_signal_raise(struct k_poll_signal *sig, int result)
|
||||||
poll_event = (struct k_poll_event *)sys_dlist_get(&sig->poll_events);
|
poll_event = (struct k_poll_event *)sys_dlist_get(&sig->poll_events);
|
||||||
if (poll_event == NULL) {
|
if (poll_event == NULL) {
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC(k_poll_api, signal_raise, sig, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rc = signal_poll_event(poll_event, K_POLL_STATE_SIGNALED);
|
int rc = signal_poll_event(poll_event, K_POLL_STATE_SIGNALED);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC(k_poll_api, signal_raise, sig, rc);
|
||||||
|
|
||||||
z_reschedule(&lock, key);
|
z_reschedule(&lock, key);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -593,10 +621,14 @@ static int triggered_work_cancel(struct k_work_poll *work,
|
||||||
void k_work_poll_init(struct k_work_poll *work,
|
void k_work_poll_init(struct k_work_poll *work,
|
||||||
k_work_handler_t handler)
|
k_work_handler_t handler)
|
||||||
{
|
{
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_work_poll, init, work);
|
||||||
|
|
||||||
*work = (struct k_work_poll) {};
|
*work = (struct k_work_poll) {};
|
||||||
k_work_init(&work->work, triggered_work_handler);
|
k_work_init(&work->work, triggered_work_handler);
|
||||||
work->real_handler = handler;
|
work->real_handler = handler;
|
||||||
z_init_timeout(&work->timeout);
|
z_init_timeout(&work->timeout);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_work_poll, init, work);
|
||||||
}
|
}
|
||||||
|
|
||||||
int k_work_poll_submit_to_queue(struct k_work_q *work_q,
|
int k_work_poll_submit_to_queue(struct k_work_q *work_q,
|
||||||
|
@ -613,6 +645,8 @@ int k_work_poll_submit_to_queue(struct k_work_q *work_q,
|
||||||
__ASSERT(events != NULL, "NULL events\n");
|
__ASSERT(events != NULL, "NULL events\n");
|
||||||
__ASSERT(num_events > 0, "zero events\n");
|
__ASSERT(num_events > 0, "zero events\n");
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC_ENTER(k_work_poll, submit_to_queue, work_q, work, timeout);
|
||||||
|
|
||||||
/* Take overship of the work if it is possible. */
|
/* Take overship of the work if it is possible. */
|
||||||
key = k_spin_lock(&lock);
|
key = k_spin_lock(&lock);
|
||||||
if (work->workq != NULL) {
|
if (work->workq != NULL) {
|
||||||
|
@ -622,10 +656,18 @@ int k_work_poll_submit_to_queue(struct k_work_q *work_q,
|
||||||
retval = triggered_work_cancel(work, key);
|
retval = triggered_work_cancel(work, key);
|
||||||
if (retval < 0) {
|
if (retval < 0) {
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC_EXIT(k_work_poll, submit_to_queue, work_q,
|
||||||
|
work, timeout, retval);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC_EXIT(k_work_poll, submit_to_queue, work_q,
|
||||||
|
work, timeout, -EADDRINUSE);
|
||||||
|
|
||||||
return -EADDRINUSE;
|
return -EADDRINUSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -666,6 +708,9 @@ int k_work_poll_submit_to_queue(struct k_work_q *work_q,
|
||||||
/* From now, any event will result in submitted work. */
|
/* From now, any event will result in submitted work. */
|
||||||
work->poller.mode = MODE_TRIGGERED;
|
work->poller.mode = MODE_TRIGGERED;
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC_EXIT(k_work_poll, submit_to_queue, work_q, work, timeout, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -694,16 +739,37 @@ int k_work_poll_submit_to_queue(struct k_work_q *work_q,
|
||||||
/* Submit work. */
|
/* Submit work. */
|
||||||
k_work_submit_to_queue(work_q, &work->work);
|
k_work_submit_to_queue(work_q, &work->work);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC_EXIT(k_work_poll, submit_to_queue, work_q, work, timeout, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int k_work_poll_submit(struct k_work_poll *work,
|
||||||
|
struct k_poll_event *events,
|
||||||
|
int num_events,
|
||||||
|
k_timeout_t timeout)
|
||||||
|
{
|
||||||
|
SYS_PORT_TRACING_FUNC_ENTER(k_work_poll, submit, work, timeout);
|
||||||
|
|
||||||
|
int ret = k_work_poll_submit_to_queue(&k_sys_work_q, work,
|
||||||
|
events, num_events, timeout);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC_EXIT(k_work_poll, submit, work, timeout, ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int k_work_poll_cancel(struct k_work_poll *work)
|
int k_work_poll_cancel(struct k_work_poll *work)
|
||||||
{
|
{
|
||||||
k_spinlock_key_t key;
|
k_spinlock_key_t key;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC_ENTER(k_work_poll, cancel, work);
|
||||||
|
|
||||||
/* Check if the work was submitted. */
|
/* Check if the work was submitted. */
|
||||||
if (work == NULL || work->workq == NULL) {
|
if (work == NULL || work->workq == NULL) {
|
||||||
|
SYS_PORT_TRACING_FUNC_EXIT(k_work_poll, cancel, work, -EINVAL);
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -711,5 +777,7 @@ int k_work_poll_cancel(struct k_work_poll *work)
|
||||||
retval = triggered_work_cancel(work, key);
|
retval = triggered_work_cancel(work, key);
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_FUNC_EXIT(k_work_poll, cancel, work, retval);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue