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:
Torbjörn Leksell 2021-03-26 14:20:05 +01:00 committed by Anas Nashif
commit cae9a905d4
3 changed files with 208 additions and 12 deletions

View file

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

View file

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

View file

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