From a9ab8cb7797d9b2783ce273f022161aea66f52a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5ns=20Ansgariusson?= Date: Sun, 22 Dec 2024 23:48:59 +0100 Subject: [PATCH] feat: enable polling support for k_pipe interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds polling support to the newly rewritten k_pipe interface. Changes include: * Removed ifdef CONFIG_POLL from kernel/poll.c to let both implementations coexist. * Added the needed datastructures to the new k_pipe struct. * k_pipe_write(..) now notifies the poll subsystem that data is available. Signed-off-by: Måns Ansgariusson --- include/zephyr/kernel.h | 5 +++-- kernel/pipe.c | 8 ++++++++ kernel/poll.c | 14 ++------------ 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/include/zephyr/kernel.h b/include/zephyr/kernel.h index 018a8e00f65..6a10628eddd 100644 --- a/include/zephyr/kernel.h +++ b/include/zephyr/kernel.h @@ -5215,6 +5215,8 @@ struct k_pipe { _wait_q_t data; _wait_q_t space; uint8_t flags; + + Z_DECL_POLL_EVENT }; /** @@ -5227,6 +5229,7 @@ struct k_pipe { .space = Z_WAIT_Q_INIT(&obj.space), \ .flags = PIPE_FLAG_OPEN, \ .waiting = 0, \ + Z_POLL_EVENT_OBJ_INIT(obj) \ } /** * INTERNAL_HIDDEN @endcond @@ -6010,9 +6013,7 @@ struct k_poll_event { struct k_fifo *fifo, *typed_K_POLL_TYPE_FIFO_DATA_AVAILABLE; struct k_queue *queue, *typed_K_POLL_TYPE_DATA_AVAILABLE; struct k_msgq *msgq, *typed_K_POLL_TYPE_MSGQ_DATA_AVAILABLE; -#ifdef CONFIG_PIPES struct k_pipe *pipe, *typed_K_POLL_TYPE_PIPE_DATA_AVAILABLE; -#endif }; }; diff --git a/kernel/pipe.c b/kernel/pipe.c index 06f03f963b1..e73f970a988 100644 --- a/kernel/pipe.c +++ b/kernel/pipe.c @@ -76,6 +76,10 @@ void z_impl_k_pipe_init(struct k_pipe *pipe, uint8_t *buffer, size_t buffer_size z_waitq_init(&pipe->data); z_waitq_init(&pipe->space); k_object_init(pipe); + +#ifdef CONFIG_POLL + sys_dlist_init(&pipe->poll_events); +#endif /* CONFIG_POLL */ } int z_impl_k_pipe_write(struct k_pipe *pipe, const uint8_t *data, size_t len, k_timeout_t timeout) @@ -122,6 +126,10 @@ int z_impl_k_pipe_write(struct k_pipe *pipe, const uint8_t *data, size_t len, k_ rc = ring_buf_put(&pipe->buf, &data[written], len - written); if (likely(rc != 0)) { notify_waiter(&pipe->data); +#ifdef CONFIG_POLL + z_handle_obj_poll_events(&pipe->poll_events, + K_POLL_STATE_PIPE_DATA_AVAILABLE); +#endif /* CONFIG_POLL */ } k_spin_unlock(&pipe->lock, key); written += rc; diff --git a/kernel/poll.c b/kernel/poll.c index 502e97537b9..752c9f4690c 100644 --- a/kernel/poll.c +++ b/kernel/poll.c @@ -87,13 +87,9 @@ static inline bool is_condition_met(struct k_poll_event *event, uint32_t *state) return true; } break; -#ifdef CONFIG_PIPES case K_POLL_TYPE_PIPE_DATA_AVAILABLE: - if (k_pipe_read_avail(event->pipe)) { - *state = K_POLL_STATE_PIPE_DATA_AVAILABLE; - return true; - } -#endif /* CONFIG_PIPES */ + *state = K_POLL_STATE_PIPE_DATA_AVAILABLE; + return true; case K_POLL_TYPE_IGNORE: break; default: @@ -154,12 +150,10 @@ static inline void register_event(struct k_poll_event *event, __ASSERT(event->msgq != NULL, "invalid message queue\n"); add_event(&event->msgq->poll_events, event, poller); break; -#ifdef CONFIG_PIPES case K_POLL_TYPE_PIPE_DATA_AVAILABLE: __ASSERT(event->pipe != NULL, "invalid pipe\n"); add_event(&event->pipe->poll_events, event, poller); break; -#endif /* CONFIG_PIPES */ case K_POLL_TYPE_IGNORE: /* nothing to do */ break; @@ -195,12 +189,10 @@ static inline void clear_event_registration(struct k_poll_event *event) __ASSERT(event->msgq != NULL, "invalid message queue\n"); remove_event = true; break; -#ifdef CONFIG_PIPES case K_POLL_TYPE_PIPE_DATA_AVAILABLE: __ASSERT(event->pipe != NULL, "invalid pipe\n"); remove_event = true; break; -#endif /* CONFIG_PIPES */ case K_POLL_TYPE_IGNORE: /* nothing to do */ break; @@ -413,11 +405,9 @@ static inline int z_vrfy_k_poll(struct k_poll_event *events, case K_POLL_TYPE_MSGQ_DATA_AVAILABLE: K_OOPS(K_SYSCALL_OBJ(e->msgq, K_OBJ_MSGQ)); break; -#ifdef CONFIG_PIPES case K_POLL_TYPE_PIPE_DATA_AVAILABLE: K_OOPS(K_SYSCALL_OBJ(e->pipe, K_OBJ_PIPE)); break; -#endif /* CONFIG_PIPES */ default: ret = -EINVAL; goto out_free;