[systemd-devel] [PATCH] core/socket: we only want one event on standard sockets

Lennart Poettering lennart at poettering.net
Mon Nov 25 20:35:11 PST 2013


On Fri, 22.11.13 18:56, Shawn Landden (shawn at churchofgit.com) wrote:

> With EPOLLONESHOT we are guaranteed to only recieve one event
> until we reload with socket_enter_listening(s), otherwise
> multiple events can be generated upon receipt of multiple chunks of
> data.

Not following here. What precisely does this fix, can you elaborate?

We currently turn off the poll for the socket fds as soon as we queued
the service socket, so that we don't get woken up anymore. What would
EPOLLET do good here?

> 
> We also only want wake-ups when external events happen, i.e.
> edge-triggered wakeups.
> ---
>  src/core/socket.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/src/core/socket.c b/src/core/socket.c
> index 5fa4a5a..2f860a4 100644
> --- a/src/core/socket.c
> +++ b/src/core/socket.c
> @@ -1119,7 +1119,9 @@ static int socket_watch_fds(Socket *s) {
>                  if (p->event_source)
>                          r = sd_event_source_set_enabled(p->event_source, SD_EVENT_ON);
>                  else
> -                        r = sd_event_add_io(UNIT(s)->manager->event, p->fd, EPOLLIN, socket_dispatch_io, p, &p->event_source);
> +                        r = sd_event_add_io(UNIT(s)->manager->event, p->fd,
> +                                        EPOLLIN|EPOLLET|((s->accept || s->distribute) ? 0 : EPOLLONESHOT),
> +                                        socket_dispatch_io, p, &p->event_source);
>  
>                  if (r < 0) {
>                          log_warning_unit(UNIT(s)->id, "Failed to watch listening fds: %s", strerror(-r));


Lennart

-- 
Lennart Poettering, Red Hat


More information about the systemd-devel mailing list