epoll: edge-triggered descriptors lost their edges on more than one CPU
EPOLLET reported a descriptor again only after a scan had seen it not ready. Xorg watches its clients edge-triggered; when it read part of a client's requests and more arrived before its next scan, the socket never looked not-ready, so it was never reported again -- X waiting on the client, the client waiting on X. One CPU almost never hit it; on a 16-thread laptop the desktop froze within seconds: Window Maker's menu stuck, xterm never mapped, text gone, and Caps Lock dead because X owns the LED. Now a still-ready descriptor is reported again whenever anything has signalled readiness since its last report (poll_generation()), which may be spurious, as EPOLLET permits, and is never missed. Reproduced and verified with QEMU at -smp 8: the root menu works and xterm runs cmatrix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S1giNvrHTrPMPw7V6x1kQ4
This commit is contained in:
parent
54b25708c3
commit
4743df8c4a
3 changed files with 25 additions and 2 deletions
|
|
@ -735,6 +735,7 @@ int net_detach(struct device *);
|
|||
int net_attach_late(struct device *);
|
||||
int net_eth_poll(void);
|
||||
void net_eth_link_check(void);
|
||||
uint poll_generation(void);
|
||||
int net_eth_count(void);
|
||||
void net_eth_counts(int i, uint64 *rx, uint64 *tx);
|
||||
struct netif *net_eth_netif(int i);
|
||||
|
|
|
|||
Loading…
Reference in a new issue