On Sat, Sep 12, 2020 at 10:11 AM Kent Gibson <warthog618@xxxxxxxxx> wrote: > > Only read the requested number of events from the kernel rather than > reading up to 16 and quietly discarding any surplus. > > The previous behavour is particularly bad for reading single events as > userspace must read the events as quickly as they arrive, effectively > negating the presence of the kernel event kfifo. > > Fixes: 44921ecc9a00 (core: provide functions for reading multiple > line events at once) > > Signed-off-by: Kent Gibson <warthog618@xxxxxxxxx> > --- > lib/core.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/lib/core.c b/lib/core.c > index ad76051..b964272 100644 > --- a/lib/core.c > +++ b/lib/core.c > @@ -1090,7 +1090,10 @@ int gpiod_line_event_read_fd_multiple(int fd, struct gpiod_line_event *events, > > memset(evdata, 0, sizeof(evdata)); > > - rd = read(fd, evdata, sizeof(evdata)); > + if (num_events > 16) > + num_events = 16; > + > + rd = read(fd, evdata, num_events * sizeof(*evdata)); > if (rd < 0) { > return -1; > } else if ((unsigned int)rd < sizeof(*evdata)) { > -- > 2.28.0 > Wow this is a bad one, thanks for catching this! Will apply shortly and backport it to stable branches too. Thanks! Bartosz