sctp: Do not wake readers in __sctp_write_space()
authorPetr Malat <oss@malat.biz>
Fri, 16 May 2025 08:17:28 +0000 (10:17 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 21 May 2025 01:10:40 +0000 (18:10 -0700)
Function __sctp_write_space() doesn't set poll key, which leads to
ep_poll_callback() waking up all waiters, not only these waiting
for the socket being writable. Set the key properly using
wake_up_interruptible_poll(), which is preferred over the sync
variant, as writers are not woken up before at least half of the
queue is available. Also, TCP does the same.

Signed-off-by: Petr Malat <oss@malat.biz>
Acked-by: Xin Long <lucien.xin@gmail.com>
Link: https://patch.msgid.link/20250516081727.1361451-1-oss@malat.biz
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/sctp/socket.c

index 85a9dfeff4d6a5508ce77720b34180bc971ce396..90b75d4ec32981fc1bb5e3b1c06105074f413355 100644 (file)
@@ -9100,7 +9100,8 @@ static void __sctp_write_space(struct sctp_association *asoc)
                wq = rcu_dereference(sk->sk_wq);
                if (wq) {
                        if (waitqueue_active(&wq->wait))
-                               wake_up_interruptible(&wq->wait);
+                               wake_up_interruptible_poll(&wq->wait, EPOLLOUT |
+                                               EPOLLWRNORM | EPOLLWRBAND);
 
                        /* Note that we try to include the Async I/O support
                         * here by modeling from the current TCP/UDP code.