From nobody Sat Jul 25 20:46:42 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DF481360EE8; Tue, 14 Jul 2026 01:40:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783993255; cv=none; b=IPq6RfdVyo9MiEkoYAyhaeh7hcOqMUm56nFXomNOUF2QoF0UE5x/fayzZytow9ArxKPUoziow0OdTqpvcg4Ngs4DKHXHe1ARYFW74M8ASz/IiU3LMYuu0JapcRfAAtwcdhwIE41FNDXSYmvYbVZDq5pUWftMpQ85uQ8IkfLg1Q4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783993255; c=relaxed/simple; bh=l6bvERbMlY3ENpErQmgpGYUwGdpBsN5ID1iHYaT/gpA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iicaqRCM7u0u7ITSDFrVF2230bENyk1Q53EYdh5ufX0ScQRnKsWOuhSCpOSbeRshtVu4yLeDMx3wGqr/d5S6Y2SxyclzGmK9/M9Z048bEOIGQRpJLj9K4m8nPJjJvkXkueQRsBTseJlPzq/BAi008jsyPTmOpLfnpHO4MucXDUE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=hZjMGnvN; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="hZjMGnvN" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66E0CKbx3892631; Tue, 14 Jul 2026 01:40:38 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=2HwqGz5K8dsONnjlX fGFSI1z6mJQtd/EhSeHyWKpGbg=; b=hZjMGnvNlhRRVOjZYbVHIfw8VWiFJO6k2 zjeYNlex1j7AsEbiR6CkwvgKPg3D+kDIgnC75SnYrbjYn9GE9xqpTa8uEWyZRe4a 6+DYTzx5BJI/Lbr2A48CRQ5ncX+bPF2zGrwXNvFXMBhNTVtmj/eWgt+g1Rn8Jp5m zk4UVdBuAPjK1y5JXFLtfBxRmyA/gTBNTngXy4lkXAa8DqBxF1cabqUlnPCrO1UU WbFu1XE8+akF4RlJrrpFiSjJDAmPKla4dhyV6xyX4pY3KEAsMHdJqT0bskFnbvR+ C3w1xgH0azKk4+zs5xFb5MohjeTF+51shusaeeUVg663WMNywOMQg== Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fbf2a36wt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 14 Jul 2026 01:40:37 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 66E1YcKv027329; Tue, 14 Jul 2026 01:40:36 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4fc15jrcre-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 14 Jul 2026 01:40:36 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (smtpav07.fra02v.mail.ibm.com [10.20.54.106]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 66E1eWte61538642 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 14 Jul 2026 01:40:32 GMT Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6DC3020043; Tue, 14 Jul 2026 01:40:32 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 30D4320040; Tue, 14 Jul 2026 01:40:24 +0000 (GMT) Received: from sapthagiri.in.ibm.com (unknown [9.39.30.210]) by smtpav07.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 14 Jul 2026 01:40:23 +0000 (GMT) From: Srikar Dronamraju To: LKML , netdev@vger.kernel.org, David S Miller Cc: Ingo Molnar , Peter Zijlstra , Dietmar Eggemann , Dust Li , D Wythe , Eric Dumazet , Jakub Kicinski , Jon Maloy , Kuniyuki Iwashima , linux-sctp@vger.kernel.org, Mahanta Jambigi , Marcelo Ricardo Leitner , Paolo Abeni , Sidraya Jayagond , Simon Horman , Tony Lu , Wen Gu , Wenjia Zhang , Willem de Bruijn , Xin Long , Shrikanth Hegde , Vincent Guittot , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , K Prateek Nayak , Srikar Dronamraju Subject: [PATCH 1/2] net/socket: Record preference for synchronous wakeups Date: Tue, 14 Jul 2026 07:09:42 +0530 Message-ID: <20260714013940.4068189-5-srikar@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260714013940.4068189-4-srikar@linux.ibm.com> References: <20260714013940.4068189-4-srikar@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Info: AW1haW4tMjYwNzE0MDAxMCBTYWx0ZWRfX2xwLfpTsRk+w 8PBt1xpxiqGMTctHmElcH0ZMNSA0pMejN4wW1T1ucyycEwZ3KtW7fOfG6RZH5MY02JPA8MddiVB XY4WPP+/NTNA1Vu/iJsPUwrnwZun6KM= X-Proofpoint-GUID: 3CG71h_FKbaXbMLI9sZJP_JA8nadajtz X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzE0MDAxMCBTYWx0ZWRfX8E84TxvaQGmo tiJfHEPLFKzfYSo/qjGM/8mRkginXbsyHTIZg/RMJq7ZTCkDWPWhmtaOh/Fu3/sPWAQ6ZDXmSwM +A2VYtZx0KOe9lMdPQLEUx0lGz5x2p/ALPClVIXjfnWUS01X6tuLE9DPCXVdihtl/naLtAq7WjU z4VRFqMB9vPBMwBYjySp5MMfyUIyIanNqh50T6uihAWUkeqBzrcKzIcJsB8IDXbm13qbj54D8Xn 2BEhGjYWE7W0ChP/sBAUeT+h05EiTXS01RSArXycUysWxDMpZso1CDurE+f1qBAJ4FUOYfPJPbU ej3oAx6LpTZpNDY90zdtFGh1VwYyWQf6NNI7KLjktII4BLFXGP/V6sCcOMmAbKMdLwWAjnHtlGS LDm2QQ4MfLVNFWS+eMc0t3cRhaVtWzq8oQhD0tFoV0Gf+wFSQUlV9hPHEy+j2kNPJyx1ql+GlQx SVUPwAHGoDqgeT1Po7Q== X-Proofpoint-ORIG-GUID: 5lJU2OG1f1bKDrsZmJWFzqgjNi1Gtcai X-Authority-Analysis: v=2.4 cv=PvajqQM3 c=1 sm=1 tr=0 ts=6a559395 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=RAioF0-LDSMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=rxtpb416KjLQLQcnxosA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-13_06,2026-07-10_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 bulkscore=0 impostorscore=0 adultscore=0 clxscore=1011 lowpriorityscore=0 spamscore=0 suspectscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607140010 Content-Type: text/plain; charset="utf-8" Scheduler differentiates between affine and non-affine wakeups by the way of sync flags. Scheduler prefers to pull the tasks towards the waker if the sync flag is set. In some cases, socket APIs are blindly requesting sync wakeups. This may cause load-balance issues and non-optimal performance. Record whether the most recent blocking socket operation could benefit from synchronous wakeups. Subsequent readiness notifications use this hint to determine whether WF_SYNC should be propagated. The flag is advisory and affects only wakeup placement decisions. Signed-off-by: Srikar Dronamraju --- include/net/sock.h | 1 + net/socket.c | 56 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/include/net/sock.h b/include/net/sock.h index 51185222aac2..acc6b1976dc4 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1022,6 +1022,7 @@ enum sock_flags { SOCK_RCVMARK, /* Receive SO_MARK ancillary data with packet */ SOCK_RCVPRIORITY, /* Receive SO_PRIORITY ancillary data with packet */ SOCK_TIMESTAMPING_ANY, /* Copy of sk_tsflags & TSFLAGS_ANY */ + SOCK_SYNC_WAKEUP, /* Prefer synchronous socket wakeups */ }; =20 #define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTA= MPING_RX_SOFTWARE)) diff --git a/net/socket.c b/net/socket.c index 63c69a0fa74e..0bcb57ae490e 100644 --- a/net/socket.c +++ b/net/socket.c @@ -1198,15 +1198,27 @@ static void sock_splice_eof(struct file *file) ops->splice_eof(sock); } =20 +static inline void sock_update_sync_wakeup(struct sock *sk, bool nonblock) +{ + if (unlikely(!sk)) + return; + + if (nonblock) { + if (sock_flag(sk, SOCK_SYNC_WAKEUP)) + sock_reset_flag(sk, SOCK_SYNC_WAKEUP); + } else { + if (!sock_flag(sk, SOCK_SYNC_WAKEUP)) + sock_set_flag(sk, SOCK_SYNC_WAKEUP); + } +} + static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to) { struct file *file =3D iocb->ki_filp; struct socket *sock =3D file->private_data; struct msghdr msg =3D {.msg_iter =3D *to}; ssize_t res; - - if (file->f_flags & O_NONBLOCK || (iocb->ki_flags & IOCB_NOWAIT)) - msg.msg_flags =3D MSG_DONTWAIT; + bool nonblock; =20 if (iocb->ki_pos !=3D 0) return -ESPIPE; @@ -1214,6 +1226,11 @@ static ssize_t sock_read_iter(struct kiocb *iocb, st= ruct iov_iter *to) if (!iov_iter_count(to)) /* Match SYS5 behaviour */ return 0; =20 + nonblock =3D (file->f_flags & O_NONBLOCK) || (iocb->ki_flags & IOCB_NOWAI= T); + if (nonblock) + msg.msg_flags =3D MSG_DONTWAIT; + + sock_update_sync_wakeup(sock->sk, nonblock); res =3D sock_recvmsg(sock, &msg, msg.msg_flags); *to =3D msg.msg_iter; return res; @@ -1225,13 +1242,17 @@ static ssize_t sock_write_iter(struct kiocb *iocb, = struct iov_iter *from) struct socket *sock =3D file->private_data; struct msghdr msg =3D {.msg_iter =3D *from}; ssize_t res; + bool nonblock; =20 if (iocb->ki_pos !=3D 0) return -ESPIPE; =20 - if (file->f_flags & O_NONBLOCK || (iocb->ki_flags & IOCB_NOWAIT)) + nonblock =3D (file->f_flags & O_NONBLOCK) || (iocb->ki_flags & IOCB_NOWAI= T); + if (nonblock) msg.msg_flags =3D MSG_DONTWAIT; =20 + sock_update_sync_wakeup(sock->sk, nonblock); + if (sock->type =3D=3D SOCK_SEQPACKET) msg.msg_flags |=3D MSG_EOR; =20 @@ -2221,6 +2242,7 @@ int __sys_sendto(int fd, void __user *buff, size_t le= n, unsigned int flags, struct sockaddr_storage address; int err; struct msghdr msg; + bool nonblock; =20 err =3D import_ubuf(ITER_SOURCE, buff, len, &msg.msg_iter); if (unlikely(err)) @@ -2246,8 +2268,11 @@ int __sys_sendto(int fd, void __user *buff, size_t l= en, unsigned int flags, msg.msg_namelen =3D addr_len; } flags &=3D ~MSG_INTERNAL_SENDMSG_FLAGS; - if (sock->file->f_flags & O_NONBLOCK) + nonblock =3D (sock->file->f_flags & O_NONBLOCK); + if (nonblock) flags |=3D MSG_DONTWAIT; + + sock_update_sync_wakeup(sock->sk, nonblock); msg.msg_flags =3D flags; return __sock_sendmsg(sock, &msg); } @@ -2284,6 +2309,7 @@ int __sys_recvfrom(int fd, void __user *ubuf, size_t = size, unsigned int flags, }; struct socket *sock; int err, err2; + bool nonblock; =20 err =3D import_ubuf(ITER_DEST, ubuf, size, &msg.msg_iter); if (unlikely(err)) @@ -2297,8 +2323,11 @@ int __sys_recvfrom(int fd, void __user *ubuf, size_t= size, unsigned int flags, if (unlikely(!sock)) return -ENOTSOCK; =20 - if (sock->file->f_flags & O_NONBLOCK) + nonblock =3D (sock->file->f_flags & O_NONBLOCK); + if (nonblock) flags |=3D MSG_DONTWAIT; + + sock_update_sync_wakeup(sock->sk, nonblock); err =3D sock_recvmsg(sock, &msg, flags); =20 if (err >=3D 0 && addr !=3D NULL) { @@ -2634,6 +2663,7 @@ static int ____sys_sendmsg(struct socket *sock, struc= t msghdr *msg_sys, unsigned char *ctl_buf =3D ctl; int ctl_len; ssize_t err; + bool nonblock; =20 err =3D -ENOBUFS; =20 @@ -2666,8 +2696,12 @@ static int ____sys_sendmsg(struct socket *sock, stru= ct msghdr *msg_sys, flags &=3D ~MSG_INTERNAL_SENDMSG_FLAGS; msg_sys->msg_flags =3D flags; =20 - if (sock->file->f_flags & O_NONBLOCK) + nonblock =3D (sock->file->f_flags & O_NONBLOCK); + if (nonblock) msg_sys->msg_flags |=3D MSG_DONTWAIT; + + sock_update_sync_wakeup(sock->sk, nonblock); + /* * If this is sendmmsg() and current destination address is same as * previously succeeded address, omit asking LSM's decision. @@ -2887,6 +2921,7 @@ static int ____sys_recvmsg(struct socket *sock, struc= t msghdr *msg_sys, unsigned long cmsg_ptr; int len; ssize_t err; + bool nonblock; =20 msg_sys->msg_name =3D &addr; cmsg_ptr =3D (unsigned long)msg_sys->msg_control; @@ -2895,9 +2930,12 @@ static int ____sys_recvmsg(struct socket *sock, stru= ct msghdr *msg_sys, /* We assume all kernel code knows the size of sockaddr_storage */ msg_sys->msg_namelen =3D 0; =20 - if (sock->file->f_flags & O_NONBLOCK) + nonblock =3D (sock->file->f_flags & O_NONBLOCK); + if (nonblock) flags |=3D MSG_DONTWAIT; =20 + sock_update_sync_wakeup(sock->sk, nonblock); + if (unlikely(nosec)) err =3D sock_recvmsg_nosec(sock, msg_sys, flags); else @@ -3056,6 +3094,8 @@ static int do_recvmmsg(int fd, struct mmsghdr __user = *mmsg, if (flags & MSG_WAITFORONE) flags |=3D MSG_DONTWAIT; =20 + sock_update_sync_wakeup(sock->sk, flags & MSG_WAITFORONE); + if (timeout) { ktime_get_ts64(&timeout64); *timeout =3D timespec64_sub(end_time, timeout64); --=20 2.52.0 From nobody Sat Jul 25 20:46:42 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0DDBC304972; Tue, 14 Jul 2026 01:41:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783993265; cv=none; b=U0XcLGB3mh+oq18CSuRkJIH2Gou9mVnLq7ryqesR/ugxbKS+KmI9bz1JG31p1Hu+rdpc/FBOwAWpJE5k3rRaAWyw1cv/XIUhsHDqV4LkcoFXkVOB0ez/4lHlsBiQe2i/AV22X2AEYIiqfnEvFwqRQIqjng6wjNKTlALWZAAxan8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783993265; c=relaxed/simple; bh=mrmOnBPX+/83ewbidMnCH8jF8o9o30h9dv3WC3R685A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DneoaAHjzyBIK++CdPeak1px2yK556NCpuj+w772hf3ZY7qL6SEYRyK3SzD6Xe4AjYMyxEmnQSUPlmJe0OD3Yt9pyGBOlJGLRn4vLCr4dGT2X2nKadZRHdYKfTk1z6069vQxapDBNLCkNEax0MYMjSDWSFdd0fwriBH7wAhIY9w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=ZZgEUw9x; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="ZZgEUw9x" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66E0C9ro2070439; Tue, 14 Jul 2026 01:40:46 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=FiLFfUTXRiuzfTTpV 4bzgYu8rHhky63Q1CvzyN+MV7s=; b=ZZgEUw9xtzgjYqqbjyklYV4GKqIB3ADX7 C/cn1z5bsJ0SUFAnlvQbARQI/lCGTN1SUQ8BTmFp2Ntdlx8b1xXX6hS7CM4BDncS ZoogfhYs58JFusw622Be1vt9D68GQkZCD/nKqU126H/DDxc8Cr2qLIHgArR3eQve deRAgBibXSi4kQcdB38axJfGM41/JJQqeauuPNpkLhKuqlXB1G4A7umCPEiw8h4e BDF/ykSc4WZ3/ka9h4Jx4/tATIyNI0VGKmEtrT7oEL0fthaveDCe+BS/4n2lUlif mKS9EelipwbnHvYqpKxxNRZgM09EcDfBJ0XydWZS0qlRwQQ48c/JQ== Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fcv3345pf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 14 Jul 2026 01:40:45 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 66E1Z1Jx003043; Tue, 14 Jul 2026 01:40:44 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4fc05q0k7y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 14 Jul 2026 01:40:44 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (smtpav07.fra02v.mail.ibm.com [10.20.54.106]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 66E1ef1242467600 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 14 Jul 2026 01:40:41 GMT Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2489520043; Tue, 14 Jul 2026 01:40:41 +0000 (GMT) Received: from smtpav07.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E99FA20040; Tue, 14 Jul 2026 01:40:32 +0000 (GMT) Received: from sapthagiri.in.ibm.com (unknown [9.39.30.210]) by smtpav07.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 14 Jul 2026 01:40:32 +0000 (GMT) From: Srikar Dronamraju To: LKML , netdev@vger.kernel.org, David S Miller Cc: Ingo Molnar , Peter Zijlstra , Dietmar Eggemann , Dust Li , D Wythe , Eric Dumazet , Jakub Kicinski , Jon Maloy , Kuniyuki Iwashima , linux-sctp@vger.kernel.org, Mahanta Jambigi , Marcelo Ricardo Leitner , Paolo Abeni , Sidraya Jayagond , Simon Horman , Tony Lu , Wen Gu , Wenjia Zhang , Willem de Bruijn , Xin Long , Shrikanth Hegde , Vincent Guittot , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , K Prateek Nayak , Srikar Dronamraju Subject: [PATCH 2/2] net/sock: Propagate WF_SYNC only when requested Date: Tue, 14 Jul 2026 07:09:43 +0530 Message-ID: <20260714013940.4068189-6-srikar@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260714013940.4068189-4-srikar@linux.ibm.com> References: <20260714013940.4068189-4-srikar@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Info: AW1haW4tMjYwNzE0MDAxMCBTYWx0ZWRfX8hagMd7GaB00 wUXsMXaWOhnFvqJKA5b5bhdmhxxdcfV6R7QvzwhsrjIu3x/f/sSsNsu1z9IAGRP8XVLO50NNuPb Q3WOuOirmo6RHzruASRtI9cXlF8dKf8= X-Authority-Analysis: v=2.4 cv=Mp1iLWae c=1 sm=1 tr=0 ts=6a55939e cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=RAioF0-LDSMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VnNF1IyMAAAA:8 a=Rvf68rD1d7SEEqb_LvEA:9 X-Proofpoint-GUID: TDULG0YunRxJsHlituCLTfHoopCPv2fo X-Proofpoint-ORIG-GUID: rB9sLpci97OBbF2jFt8x0fWeeYOR6yP1 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzE0MDAxMCBTYWx0ZWRfX4XGGJAnsQkO4 H4GySG1yXoNCcsYpN8XxE8JTYyCoC4+rrNYufJUEpgUjEEiXB/jd/gRrvyCMOz9korOQnTakvCG ix4Q+lLLkPlI2U2Inb+Kmpu/iG8Nef0HnwDzVaOoU8t/6CqCodYB31SE02OcwhK8HPaxBgLbxBD E4KVHkONYD+3YnTR/3Vw/kEzCHuFU9oyglUT3wy2TKrFTC9i9g6V6/szsq2Df0S2Ge52lIMaDrK kB3Xcqz60N6ABXcpgCcDUM5ykdqSm8+z5zrE2ula1T5JcarVP1egfnL+th1DtBaJlDym1hCXHpd dinRAFQNVkvo2wvc6Ig6N3eGDWYj9vEwFpXhU2EjWX456zdsBF8S1xbnMVBEZJUcbNtz3qoJB4t rbFZPOjefz33l8MXT6wAvvm5IvJOUPUTbkLdqkLx0aYjnom4RILG+WtY7D1YFd4CYjQNL1ro2Qs xikjDtK63vJEfNHjKQQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-13_06,2026-07-10_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 bulkscore=0 spamscore=0 malwarescore=0 lowpriorityscore=0 impostorscore=0 priorityscore=1501 suspectscore=0 clxscore=1011 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607140010 Content-Type: text/plain; charset="utf-8" Use SOCK_SYNC_WAKEUP to select between synchronous and asynchronous wakeup wakeup APIs. This avoids propagating WF_SYNC when no blocking waiter is expected. All wakeup locations in networking code that currently issue synchronous poll-style wakeups unconditionally are updated. Signed-off-by: Srikar Dronamraju --- net/core/sock.c | 31 ++++++++++++++++++++++++------- net/sctp/socket.c | 10 ++++++++-- net/smc/af_smc.c | 4 ++-- net/smc/smc_rx.c | 10 ++++++++-- net/tipc/socket.c | 22 +++++++++++++++++----- net/unix/af_unix.c | 26 ++++++++++++++++++-------- 6 files changed, 77 insertions(+), 26 deletions(-) diff --git a/net/core/sock.c b/net/core/sock.c index 8a59bfaa8096..a214e883b14b 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -3652,9 +3652,15 @@ void sock_def_readable(struct sock *sk) =20 rcu_read_lock(); wq =3D rcu_dereference(sk->sk_wq); - if (skwq_has_sleeper(wq)) - wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | EPOLLPRI | + if (skwq_has_sleeper(wq)) { + if (sock_flag(sk, SOCK_SYNC_WAKEUP)) { + wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | EPOLLPRI | + EPOLLRDNORM | EPOLLRDBAND); + } else { + wake_up_interruptible_poll(&wq->wait, EPOLLIN | EPOLLPRI | EPOLLRDNORM | EPOLLRDBAND); + } + } sk_wake_async_rcu(sk, SOCK_WAKE_WAITD, POLL_IN); rcu_read_unlock(); } @@ -3670,9 +3676,15 @@ static void sock_def_write_space(struct sock *sk) */ if (sock_writeable(sk)) { wq =3D rcu_dereference(sk->sk_wq); - if (skwq_has_sleeper(wq)) - wake_up_interruptible_sync_poll(&wq->wait, EPOLLOUT | + if (skwq_has_sleeper(wq)) { + if (sock_flag(sk, SOCK_SYNC_WAKEUP)) { + wake_up_interruptible_sync_poll(&wq->wait, EPOLLOUT | + EPOLLWRNORM | EPOLLWRBAND); + } else { + wake_up_interruptible_poll(&wq->wait, EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND); + } + } =20 /* Should agree with poll, otherwise some programs break */ sk_wake_async_rcu(sk, SOCK_WAKE_SPACE, POLL_OUT); @@ -3695,10 +3707,15 @@ static void sock_def_write_space_wfree(struct sock = *sk, int wmem_alloc) =20 /* rely on refcount_sub from sock_wfree() */ smp_mb__after_atomic(); - if (wq && waitqueue_active(&wq->wait)) - wake_up_interruptible_sync_poll(&wq->wait, EPOLLOUT | + if (wq && waitqueue_active(&wq->wait)) { + if (sock_flag(sk, SOCK_SYNC_WAKEUP)) { + wake_up_interruptible_sync_poll(&wq->wait, EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND); - + } else { + wake_up_interruptible_poll(&wq->wait, EPOLLOUT | + EPOLLWRNORM | EPOLLWRBAND); + } + } /* Should agree with poll, otherwise some programs break */ sk_wake_async_rcu(sk, SOCK_WAKE_SPACE, POLL_OUT); } diff --git a/net/sctp/socket.c b/net/sctp/socket.c index c7b9e325ec1c..9cb3432f065a 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -9348,9 +9348,15 @@ void sctp_data_ready(struct sock *sk) =20 rcu_read_lock(); wq =3D rcu_dereference(sk->sk_wq); - if (skwq_has_sleeper(wq)) - wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | + if (skwq_has_sleeper(wq)) { + if (sock_flag(sk, SOCK_SYNC_WAKEUP)) { + wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | + EPOLLRDNORM | EPOLLRDBAND); + } else { + wake_up_interruptible_poll(&wq->wait, EPOLLIN | EPOLLRDNORM | EPOLLRDBAND); + } + } sk_wake_async_rcu(sk, SOCK_WAKE_WAITD, POLL_IN); rcu_read_unlock(); } diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index b5db69073e20..1a6ea2e30769 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c @@ -819,10 +819,10 @@ static void smc_fback_wakeup_waitqueue(struct smc_soc= k *smc, void *key) wake_up_interruptible_all(&wq->wait); } else { flags =3D key_to_poll(key); - if (flags & (EPOLLIN | EPOLLOUT)) + if (flags & (EPOLLIN | EPOLLOUT) && sock_flag(&smc->sk, SOCK_SYNC_WAKEUP= )) /* sk_data_ready or sk_write_space */ wake_up_interruptible_sync_poll(&wq->wait, flags); - else if (flags & EPOLLERR) + else /* sk_error_report */ wake_up_interruptible_poll(&wq->wait, flags); } diff --git a/net/smc/smc_rx.c b/net/smc/smc_rx.c index c1d9b923938d..4e288a2364d2 100644 --- a/net/smc/smc_rx.c +++ b/net/smc/smc_rx.c @@ -39,9 +39,15 @@ static void smc_rx_wake_up(struct sock *sk) /* called already in smc_listen_work() */ rcu_read_lock(); wq =3D rcu_dereference(sk->sk_wq); - if (skwq_has_sleeper(wq)) - wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | EPOLLPRI | + if (skwq_has_sleeper(wq)) { + if (sock_flag(sk, SOCK_SYNC_WAKEUP)) { + wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | EPOLLPRI | EPOLLRDNORM | EPOLLRDBAND); + } else { + wake_up_interruptible_poll(&wq->wait, EPOLLIN | EPOLLPRI | + EPOLLRDNORM | EPOLLRDBAND); + } + } sk_wake_async_rcu(sk, SOCK_WAKE_WAITD, POLL_IN); if ((sk->sk_shutdown =3D=3D SHUTDOWN_MASK) || (sk->sk_state =3D=3D SMC_CLOSED)) diff --git a/net/tipc/socket.c b/net/tipc/socket.c index e564341e0216..9fa83a89882c 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -2116,9 +2116,15 @@ static void tipc_write_space(struct sock *sk) =20 rcu_read_lock(); wq =3D rcu_dereference(sk->sk_wq); - if (skwq_has_sleeper(wq)) - wake_up_interruptible_sync_poll(&wq->wait, EPOLLOUT | + if (skwq_has_sleeper(wq)) { + if (sock_flag(sk, SOCK_SYNC_WAKEUP)) { + wake_up_interruptible_sync_poll(&wq->wait, EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND); + } else { + wake_up_interruptible_poll(&wq->wait, EPOLLOUT | + EPOLLWRNORM | EPOLLWRBAND); + } + } rcu_read_unlock(); } =20 @@ -2134,9 +2140,15 @@ static void tipc_data_ready(struct sock *sk) =20 rcu_read_lock(); wq =3D rcu_dereference(sk->sk_wq); - if (skwq_has_sleeper(wq)) - wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | - EPOLLRDNORM | EPOLLRDBAND); + if (skwq_has_sleeper(wq)) { + if (sock_flag(sk, SOCK_SYNC_WAKEUP)) { + wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | + EPOLLRDNORM | EPOLLRDBAND); + } else { + wake_up_interruptible_poll(&wq->wait, EPOLLIN | + EPOLLRDNORM | EPOLLRDBAND); + } + } rcu_read_unlock(); } =20 diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index f7a9d55eee8a..15ebcc2d9d58 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -601,9 +601,15 @@ static void unix_write_space(struct sock *sk) rcu_read_lock(); if (unix_writable(sk, READ_ONCE(sk->sk_state))) { wq =3D rcu_dereference(sk->sk_wq); - if (skwq_has_sleeper(wq)) - wake_up_interruptible_sync_poll(&wq->wait, - EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND); + if (skwq_has_sleeper(wq)) { + if (sock_flag(sk, SOCK_SYNC_WAKEUP)) { + wake_up_interruptible_sync_poll(&wq->wait, + EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND); + } else { + wake_up_interruptible_poll(&wq->wait, + EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND); + } + } sk_wake_async_rcu(sk, SOCK_WAKE_SPACE, POLL_OUT); } rcu_read_unlock(); @@ -2603,11 +2609,15 @@ int __unix_dgram_recvmsg(struct sock *sk, struct ms= ghdr *msg, size_t size, goto out; } =20 - if (wq_has_sleeper(&u->peer_wait)) - wake_up_interruptible_sync_poll(&u->peer_wait, - EPOLLOUT | EPOLLWRNORM | - EPOLLWRBAND); - + if (wq_has_sleeper(&u->peer_wait)) { + if (sock_flag(sk, SOCK_SYNC_WAKEUP)) { + wake_up_interruptible_sync_poll(&u->peer_wait, + EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND); + } else { + wake_up_interruptible_poll(&u->peer_wait, + EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND); + } + } if (msg->msg_name) { unix_copy_addr(msg, skb->sk); =20 --=20 2.52.0