diff --git a/include/kernel.h b/include/kernel.h index bbda4560371..f38cfa80154 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -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 * diff --git a/include/tracing/tracing.h b/include/tracing/tracing.h index f9ebf15277b..a9b581d3315 100644 --- a/include/tracing/tracing.h +++ b/include/tracing/tracing.h @@ -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 diff --git a/kernel/poll.c b/kernel/poll.c index f260ffef180..055dbc012fe 100644 --- a/kernel/poll.c +++ b/kernel/poll.c @@ -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 #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; }