* [lttng-dev] [PATCH lttng-tools v4 4/8] Adapt poll layer behaviour to match the epoll layer [not found] ` <20190401175925.8512-5-ylamarre@efficios.com> @ 2019-04-24 21:02 ` Jérémie Galarneau 0 siblings, 0 replies; 2+ messages in thread From: Jérémie Galarneau @ 2019-04-24 21:02 UTC (permalink / raw) On Mon, Apr 01, 2019 at 01:59:21PM -0400, Yannick Lamarre wrote: > Signed-off-by: Yannick Lamarre <ylamarre at efficios.com> > --- > src/common/compat/compat-poll.c | 30 ++++++++++++++++++++---------- > 1 file changed, 20 insertions(+), 10 deletions(-) > > diff --git a/src/common/compat/compat-poll.c b/src/common/compat/compat-poll.c > index b45b39dc..be655728 100644 > --- a/src/common/compat/compat-poll.c > +++ b/src/common/compat/compat-poll.c > @@ -1,5 +1,6 @@ > /* > * Copyright (C) 2011 - David Goulet <david.goulet at polymtl.ca> > + * Copyright (C) 2019 - Yannick Lamarre <ylamarre at efficios.com> > * > * This program is free software; you can redistribute it and/or modify > * it under the terms of the GNU General Public License, version 2 only, > @@ -204,10 +205,10 @@ int compat_poll_mod(struct lttng_poll_event *events, int fd, > uint32_t req_events) > { > int i; > - bool fd_found = false; > struct compat_poll_event_array *current; > > - if (events == NULL || events->current.events == NULL || fd < 0) { > + if (events == NULL || events->current.nb_fd == 0 || > + events->current.events == NULL || fd < 0) { > ERR("Bad compat poll mod arguments"); > goto error; > } > @@ -216,16 +217,16 @@ int compat_poll_mod(struct lttng_poll_event *events, int fd, > > for (i = 0; i < current->nb_fd; i++) { > if (current->events[i].fd == fd) { > - fd_found = true; > current->events[i].events = req_events; > events->need_update = 1; > break; > } > } > > - if (!fd_found) { > - goto error; > - } > + /* Remove space after '/*' Thanks! J?r?mie > + * The epoll flavor doesn't flag modifying a non-included FD as an > + * error. > + */ > > return 0; > > @@ -238,11 +239,12 @@ error: > */ > int compat_poll_del(struct lttng_poll_event *events, int fd) > { > - int new_size, i, count = 0, ret; > + int i, count = 0, ret; > + uint32_t new_size; > struct compat_poll_event_array *current; > > - if (events == NULL || events->current.events == NULL || fd < 0) { > - ERR("Wrong arguments for poll del"); > + if (events == NULL || events->current.nb_fd == 0 || > + events->current.events == NULL || fd < 0) { > goto error; > } > > @@ -257,13 +259,20 @@ int compat_poll_del(struct lttng_poll_event *events, int fd) > count++; > } > } > + > + /* The fd was not in our set, return no error as with epoll. */ > + if (current->nb_fd == count) { > + goto end; > + } > + > /* No fd duplicate should be ever added into array. */ > assert(current->nb_fd - 1 == count); > current->nb_fd = count; > > /* Resize array if needed. */ > new_size = 1U << utils_get_count_order_u32(current->nb_fd); > - if (new_size != current->alloc_size && new_size >= current->init_size) { > + if (new_size != current->alloc_size && new_size >= current->init_size > + && current->nb_fd != 0) { > ret = resize_poll_event(current, new_size); > if (ret < 0) { > goto error; > @@ -272,6 +281,7 @@ int compat_poll_del(struct lttng_poll_event *events, int fd) > > events->need_update = 1; > > +end: > return 0; > > error: > -- > 2.11.0 > ^ permalink raw reply [flat|nested] 2+ messages in thread
[parent not found: <20190401175925.8512-7-ylamarre@efficios.com>]
* [lttng-dev] [PATCH lttng-tools v4 6/8] Change lttng_poll_wait behaviour of compat-poll to match compat-epoll [not found] ` <20190401175925.8512-7-ylamarre@efficios.com> @ 2019-04-24 21:08 ` Jérémie Galarneau 0 siblings, 0 replies; 2+ messages in thread From: Jérémie Galarneau @ 2019-04-24 21:08 UTC (permalink / raw) On Mon, Apr 01, 2019 at 01:59:23PM -0400, Yannick Lamarre wrote: > This removes the need to verify for idle file descriptors and mitigates > risks of bug due to behaviour mismatch. > > Signed-off-by: Yannick Lamarre <ylamarre at efficios.com> > --- > > The assert in the for loop is removed. > > src/common/compat/compat-poll.c | 37 +++++++++++++++++++++++++++++++++---- > 1 file changed, 33 insertions(+), 4 deletions(-) > > diff --git a/src/common/compat/compat-poll.c b/src/common/compat/compat-poll.c > index be655728..5b752a28 100644 > --- a/src/common/compat/compat-poll.c > +++ b/src/common/compat/compat-poll.c > @@ -293,7 +293,8 @@ error: > */ > int compat_poll_wait(struct lttng_poll_event *events, int timeout) > { > - int ret; > + int ret, active_fd_count; > + int idle_pfd_index = 0; > > if (events == NULL || events->current.events == NULL) { > ERR("poll wait arguments error"); > @@ -325,11 +326,39 @@ int compat_poll_wait(struct lttng_poll_event *events, int timeout) > goto error; > } > > + active_fd_count = ret; > + > /* > - * poll() should always iterate on all FDs since we handle the pollset in > - * user space and after poll returns, we have to try every fd for a match. > + * Swap all active pollfd structs to the beginning of the > + * array to emulate compat-epoll behaviour. This algorithm takes > + * advantage of poll's returned value and the burst nature of active > + * events on the file descriptors. The while loop guarantees that > + * idle_pfd will always point to an idle fd. > */ > - return events->wait.nb_fd; > + if (active_fd_count == events->wait.nb_fd) { > + goto end; > + } > + while (idle_pfd_index < active_fd_count && > + events->wait.events[idle_pfd_index].revents != 0) { > + idle_pfd_index++; > + } > + > + for (int i = idle_pfd_index + 1; idle_pfd_index < active_fd_count; > + i++) { Declare 'i' at the beginning of the function. Thanks! J?r?mie > + struct pollfd swap_pfd; > + struct pollfd *idle_pfd = &events->wait.events[idle_pfd_index]; > + struct pollfd *current_pfd = &events->wait.events[i]; > + > + if (ipfd->revents != 0) { > + swap_pfd = *current_pfd; > + *current_pfd = *idle_pfd; > + *idle_pfd = swap_pfd; > + idle_pfd_index++; > + } > + } > + > +end: > + return ret; > > error: > return -1; > -- > 2.11.0 > ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-04-24 21:08 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20190401175925.8512-1-ylamarre@efficios.com>
[not found] ` <20190401175925.8512-5-ylamarre@efficios.com>
2019-04-24 21:02 ` [lttng-dev] [PATCH lttng-tools v4 4/8] Adapt poll layer behaviour to match the epoll layer Jérémie Galarneau
[not found] ` <20190401175925.8512-7-ylamarre@efficios.com>
2019-04-24 21:08 ` [lttng-dev] [PATCH lttng-tools v4 6/8] Change lttng_poll_wait behaviour of compat-poll to match compat-epoll Jérémie Galarneau
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox