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 -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,
int num_events,
k_timeout_t timeout)
{
return k_work_poll_submit_to_queue(&k_sys_work_q, work,
events, num_events, timeout);
}
k_timeout_t timeout);
/**
* @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);
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
*

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
* @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->unused = 0U;
event->obj = obj;
SYS_PORT_TRACING_FUNC(k_poll_api, event_init, event);
}
/* 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(num_events >= 0, "<0 events\n");
SYS_PORT_TRACING_FUNC_ENTER(k_poll_api, poll, events);
events_registered = register_events(events, num_events, poller,
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) {
clear_event_registrations(events, events_registered, key);
k_spin_unlock(&lock, key);
SYS_PORT_TRACING_FUNC_EXIT(k_poll_api, poll, events, 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)) {
k_spin_unlock(&lock, key);
SYS_PORT_TRACING_FUNC_EXIT(k_poll_api, poll, events, -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);
k_spin_unlock(&lock, key);
SYS_PORT_TRACING_FUNC_EXIT(k_poll_api, poll, events, 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);
sig->signaled = 0U;
/* sig->result is left unitialized */
/* signal->result is left unitialized */
z_object_init(sig);
SYS_PORT_TRACING_FUNC(k_poll_api, signal_init, sig);
}
#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>
#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,
unsigned int *signaled, int *result)
{
*signaled = sig->signaled;
*result = sig->result;
SYS_PORT_TRACING_FUNC(k_poll_api, signal_check, sig);
}
#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);
if (poll_event == NULL) {
k_spin_unlock(&lock, key);
SYS_PORT_TRACING_FUNC(k_poll_api, signal_raise, sig, 0);
return 0;
}
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);
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,
k_work_handler_t handler)
{
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_work_poll, init, work);
*work = (struct k_work_poll) {};
k_work_init(&work->work, triggered_work_handler);
work->real_handler = handler;
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,
@ -613,6 +645,8 @@ int k_work_poll_submit_to_queue(struct k_work_q *work_q,
__ASSERT(events != NULL, "NULL 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. */
key = k_spin_lock(&lock);
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);
if (retval < 0) {
k_spin_unlock(&lock, key);
SYS_PORT_TRACING_FUNC_EXIT(k_work_poll, submit_to_queue, work_q,
work, timeout, retval);
return retval;
}
} else {
k_spin_unlock(&lock, key);
SYS_PORT_TRACING_FUNC_EXIT(k_work_poll, submit_to_queue, work_q,
work, timeout, -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. */
work->poller.mode = MODE_TRIGGERED;
k_spin_unlock(&lock, key);
SYS_PORT_TRACING_FUNC_EXIT(k_work_poll, submit_to_queue, work_q, work, timeout, 0);
return 0;
}
@ -694,16 +739,37 @@ int k_work_poll_submit_to_queue(struct k_work_q *work_q,
/* Submit 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;
}
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)
{
k_spinlock_key_t key;
int retval;
SYS_PORT_TRACING_FUNC_ENTER(k_work_poll, cancel, work);
/* Check if the work was submitted. */
if (work == NULL || work->workq == NULL) {
SYS_PORT_TRACING_FUNC_EXIT(k_work_poll, cancel, work, -EINVAL);
return -EINVAL;
}
@ -711,5 +777,7 @@ int k_work_poll_cancel(struct k_work_poll *work)
retval = triggered_work_cancel(work, key);
k_spin_unlock(&lock, key);
SYS_PORT_TRACING_FUNC_EXIT(k_work_poll, cancel, work, retval);
return retval;
}