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