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 -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
|
||||
*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue