Bug 205339 - epoll can fail to report a socket readable after enabling SO_OOBINLINE
Summary: epoll can fail to report a socket readable after enabling SO_OOBINLINE
Status: NEW
Alias: None
Product: Networking
Classification: Unclassified
Component: Other (show other bugs)
Hardware: All Linux
: P1 low
Assignee: Stephen Hemminger
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-10-28 02:55 UTC by Nathaniel J. Smith
Modified: 2019-10-28 02:55 UTC (History)
0 users

See Also:
Kernel Version: 5.0
Subsystem:
Regression: No
Bisected commit-id:


Attachments
reproducer (2.10 KB, text/plain)
2019-10-28 02:55 UTC, Nathaniel J. Smith
Details

Description Nathaniel J. Smith 2019-10-28 02:55:44 UTC
Created attachment 285671 [details]
reproducer

Consider the following sequence of events:

1. OOB data arrives on a socket.
2. The socket is registered with epoll with EPOLLIN
3. The socket has SO_OOBINLINE toggled from False → True

In this case, the socket is now readable, and select() reports that it's readable, but epoll does *not* report that it's readable.

This is a pretty minor issue, but it seems like an unambiguous bug so I figured I'd report it.

Weirdly, this doesn't appear to be a general problem with SO_OOBINLINE+epoll. For example, this very similar sequence works correctly:

1. The socket is registered with epoll with EPOLLIN
2. OOB data arrives on the socket.
3. The socket has SO_OOBINLINE toggled from False → True

After step 2, epoll reports the socket as not readable, and then after step 3 it reports it as readable, as you'd expect.

In the attached reproducer script, "scenario 4" is the buggy one, and "scenario 3" is the very similar non-buggy one. Output on Ubuntu 19.04, kernel 5.0.0-32-generic, x86-64:

-- Scenario 1: no data --
select() says: sock is NOT readable
epoll says: sock is NOT readable
reality: NOT readable

-- Scenario 2: OOB data arrives --
select() says: sock is NOT readable
epoll says: sock is NOT readable
reality: NOT readable

-- Scenario 3: register -> OOB data arrives -> toggle SO_OOBINLINE=True --
select() says: sock is readable
epoll says: sock is readable
reality: read succeeded

-- Scenario 4: OOB data arrives -> register -> toggle SO_OOBINLINE=True --
select() says: sock is readable
epoll says: sock is NOT readable
reality: read succeeded

Note You need to log in before you can comment on or make changes to this bug.