From nobody Mon Feb 9 08:55:15 2026 Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0B7A8224236 for ; Sat, 22 Mar 2025 20:36:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742675783; cv=none; b=NVwsh/4hxkO+KJvMga5uxDW1hUc0Ll6iH8OnicsS0dDC2aZwUMNKtkhKgoOJqk5gvtp73AMslw4p8lTe3pM6ZrLpV9YUUnAg7pupcYDmEoSW2CEaEnh1Vw9ZHLZLrR5bh7OrArLjpHB6p3S6J0h8ksnggRoYYqp0s/x4uZggLMk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742675783; c=relaxed/simple; bh=i6xeSXKUD7T3dNvSuBVDs/MYVZ+onNQyMhRjHKGsRNE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nHy0/W7/ndUb4U3ERZIDfywmonnLfe+O83AiSgTWI0aaVjekWyLXU8vv1l2mpeRpcwXvFjulxhrmm1zdpWarFghruqiKXwgC8SvYE27HcDb+cV4zD8s8a7yu71mTk3dyNINtMoz57oc//gOjSyD9DBZHBv2kvf57Nwc/IClJlDM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=fastly.com; spf=pass smtp.mailfrom=fastly.com; dkim=pass (1024-bit key) header.d=fastly.com header.i=@fastly.com header.b=eHtxYJps; arc=none smtp.client-ip=209.85.216.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=fastly.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fastly.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=fastly.com header.i=@fastly.com header.b="eHtxYJps" Received: by mail-pj1-f54.google.com with SMTP id 98e67ed59e1d1-3018e2d042bso3864861a91.2 for ; Sat, 22 Mar 2025 13:36:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastly.com; s=google; t=1742675781; x=1743280581; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qtu2ODMuJN1daFcUihlu1rzkpuFzY3nQ3BRzwub0CsU=; b=eHtxYJpsDA09nLlviHfRr451dQTZ77wxCpn1+pb3kMF0RMTIrRr1iFYPNkPylWLWsN CzO396L6SPHq/vaoEpd+BS9GjZMcIbnhDIe459RP6Vflqj4KAHYmwDUlaB/4fi8PhTV9 kcYw5mXIW8+bRnQAdoFfU2yzTN06Ysi0v/Dzs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742675781; x=1743280581; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qtu2ODMuJN1daFcUihlu1rzkpuFzY3nQ3BRzwub0CsU=; b=SwllAb2bq4ROzFuvEzXiPx95/3GJXbzZySfGYouHlJDpwYmo39nvzuVv4D1VFL8XbU xZz/yxLNN8aTHlfs8Pq0rtZy2LUKQEN2Kz605lXhY2SgGdMQT+RhqZNCVm6Ui887sihm U2nzkbPbyp02Y30VmumDIIuJQ8Yhl9pKksyQdk6HYU87v25mP/aVr653yo4aeT6GtCns fhPi9g+eOQHA502X5JaTO5H/V0gm0nhZa1rmO/MaFqNoe/pFx8cAl2R2agmoMjPAwOgW u8zkJToskjp0QUK+OgpFhRg9z7BmRQkEpB1x5SPE66q1aE6bPQLKisrwx3TgOhf5eIb6 JC2A== X-Forwarded-Encrypted: i=1; AJvYcCVVa0ecyKGBRN+HmkcK1H5Bp9zWkK4GcmGTEtoiesKo8QRdz9tu7r3KD6deV12VaDUn8rbdfh2RjD9mEgM=@vger.kernel.org X-Gm-Message-State: AOJu0YzHUpeWQJu2OhRupo4qS2ZHouph+6M9Enr/MhU8VHV6+okIxVU4 x7Ylbv+6CXbg0qX4sDj+56pMMmepEOIAs+No3k8mNLn8QBasugKDlUF65QywrDM= X-Gm-Gg: ASbGncvgkah5N56HREzJle8yVc+qFtgcWY7+NfU3yMBYa+FGyx5ccQnZJhgeIcXF6r+ KqNZ6dwiOnMgXHuJR0hDJGr2f7h1VR5mdNbuJ4UVbzuL0TakUMu+4keqeQPZY9QjelDIezQPTiO s1RQS4QVv98ZymCL2VWxU8RwwAKIbwXow+pKDev+e36Py7vTfxp1awjMFNv3j4dWU084s3sPt+t /qjKqurXJUzaxH49akJBTTEgmpaWIFMxuAOs1rhMURx0HuSeIxKrV6udKkRR3FmJUQSuwU4tfEm VvU5ShiLu122YJL5mYPMEbkMfiwr6JonM/8sBrxM5VAYh2YVe+b3 X-Google-Smtp-Source: AGHT+IESi0AKU2RsgzC9hdeNWUniwi/w2iinEQxLs5wBA3sRrJswAKj8kq5JE5jmf3oyEm3CD4afpw== X-Received: by 2002:a17:90b:4fc6:b0:2fe:8a84:e033 with SMTP id 98e67ed59e1d1-3030fe6a292mr11636714a91.2.1742675781177; Sat, 22 Mar 2025 13:36:21 -0700 (PDT) Received: from localhost.localdomain ([2620:11a:c019:0:65e:3115:2f58:c5fd]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-301bf61a579sm8711798a91.32.2025.03.22.13.36.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 22 Mar 2025 13:36:20 -0700 (PDT) From: Joe Damato To: linux-fsdevel@vger.kernel.org Cc: netdev@vger.kernel.org, brauner@kernel.org, asml.silence@gmail.com, hch@infradead.org, axboe@kernel.dk, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, Joe Damato , Alexander Viro , Jan Kara , linux-kernel@vger.kernel.org (open list) Subject: [PATCH vfs/for-next 1/3] pipe: Move pipe wakeup helpers out of splice Date: Sat, 22 Mar 2025 20:35:44 +0000 Message-ID: <20250322203558.206411-2-jdamato@fastly.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250322203558.206411-1-jdamato@fastly.com> References: <20250322203558.206411-1-jdamato@fastly.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 Content-Type: text/plain; charset="utf-8" Splice code has helpers to wakeup pipe readers and writers. Move these helpers out of splice, rename them from "wakeup_pipe_*" to "pipe_wakeup_*" and update call sites in splice. Signed-off-by: Joe Damato Reviewed-by: Jens Axboe --- fs/pipe.c | 16 ++++++++++++++++ fs/splice.c | 34 +++++++++------------------------- include/linux/pipe_fs_i.h | 4 ++++ 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/fs/pipe.c b/fs/pipe.c index 12b22c2723b7..1f496896184b 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -1070,6 +1070,22 @@ void pipe_wait_writable(struct pipe_inode_info *pipe) pipe_lock(pipe); } =20 +void pipe_wakeup_readers(struct pipe_inode_info *pipe) +{ + smp_mb(); + if (waitqueue_active(&pipe->rd_wait)) + wake_up_interruptible(&pipe->rd_wait); + kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); +} + +void pipe_wakeup_writers(struct pipe_inode_info *pipe) +{ + smp_mb(); + if (waitqueue_active(&pipe->wr_wait)) + wake_up_interruptible(&pipe->wr_wait); + kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); +} + /* * This depends on both the wait (here) and the wakeup (wake_up_partner) * holding the pipe lock, so "*cnt" is stable and we know a wakeup cannot diff --git a/fs/splice.c b/fs/splice.c index 2898fa1e9e63..dcd594a8fc06 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -175,14 +175,6 @@ static const struct pipe_buf_operations user_page_pipe= _buf_ops =3D { .get =3D generic_pipe_buf_get, }; =20 -static void wakeup_pipe_readers(struct pipe_inode_info *pipe) -{ - smp_mb(); - if (waitqueue_active(&pipe->rd_wait)) - wake_up_interruptible(&pipe->rd_wait); - kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); -} - /** * splice_to_pipe - fill passed data into a pipe * @pipe: pipe to fill @@ -414,14 +406,6 @@ const struct pipe_buf_operations nosteal_pipe_buf_ops = =3D { }; EXPORT_SYMBOL(nosteal_pipe_buf_ops); =20 -static void wakeup_pipe_writers(struct pipe_inode_info *pipe) -{ - smp_mb(); - if (waitqueue_active(&pipe->wr_wait)) - wake_up_interruptible(&pipe->wr_wait); - kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); -} - /** * splice_from_pipe_feed - feed available data from a pipe to a file * @pipe: pipe to splice from @@ -541,7 +525,7 @@ static int splice_from_pipe_next(struct pipe_inode_info= *pipe, struct splice_des return -ERESTARTSYS; =20 if (sd->need_wakeup) { - wakeup_pipe_writers(pipe); + pipe_wakeup_writers(pipe); sd->need_wakeup =3D false; } =20 @@ -582,7 +566,7 @@ static void splice_from_pipe_begin(struct splice_desc *= sd) static void splice_from_pipe_end(struct pipe_inode_info *pipe, struct spli= ce_desc *sd) { if (sd->need_wakeup) - wakeup_pipe_writers(pipe); + pipe_wakeup_writers(pipe); } =20 /** @@ -837,7 +821,7 @@ ssize_t splice_to_socket(struct pipe_inode_info *pipe, = struct file *out, goto out; =20 if (need_wakeup) { - wakeup_pipe_writers(pipe); + pipe_wakeup_writers(pipe); need_wakeup =3D false; } =20 @@ -917,7 +901,7 @@ ssize_t splice_to_socket(struct pipe_inode_info *pipe, = struct file *out, out: pipe_unlock(pipe); if (need_wakeup) - wakeup_pipe_writers(pipe); + pipe_wakeup_writers(pipe); return spliced ?: ret; } #endif @@ -1295,7 +1279,7 @@ ssize_t splice_file_to_pipe(struct file *in, ret =3D do_splice_read(in, offset, opipe, len, flags); pipe_unlock(opipe); if (ret > 0) - wakeup_pipe_readers(opipe); + pipe_wakeup_readers(opipe); return ret; } =20 @@ -1558,7 +1542,7 @@ static ssize_t vmsplice_to_pipe(struct file *file, st= ruct iov_iter *iter, ret =3D iter_to_pipe(iter, pipe, buf_flag); pipe_unlock(pipe); if (ret > 0) { - wakeup_pipe_readers(pipe); + pipe_wakeup_readers(pipe); fsnotify_modify(file); } return ret; @@ -1844,10 +1828,10 @@ static int splice_pipe_to_pipe(struct pipe_inode_in= fo *ipipe, * If we put data in the output pipe, wakeup any potential readers. */ if (ret > 0) - wakeup_pipe_readers(opipe); + pipe_wakeup_readers(opipe); =20 if (input_wakeup) - wakeup_pipe_writers(ipipe); + pipe_wakeup_writers(ipipe); =20 return ret; } @@ -1935,7 +1919,7 @@ static ssize_t link_pipe(struct pipe_inode_info *ipip= e, * If we put data in the output pipe, wakeup any potential readers. */ if (ret > 0) - wakeup_pipe_readers(opipe); + pipe_wakeup_readers(opipe); =20 return ret; } diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h index 8ff23bf5a819..de850ef085cb 100644 --- a/include/linux/pipe_fs_i.h +++ b/include/linux/pipe_fs_i.h @@ -267,6 +267,10 @@ void pipe_double_lock(struct pipe_inode_info *, struct= pipe_inode_info *); void pipe_wait_readable(struct pipe_inode_info *); void pipe_wait_writable(struct pipe_inode_info *); =20 +/* Wake up pipe readers/writers */ +void pipe_wakeup_readers(struct pipe_inode_info *pipe); +void pipe_wakeup_writers(struct pipe_inode_info *pipe); + struct pipe_inode_info *alloc_pipe_info(void); void free_pipe_info(struct pipe_inode_info *); =20 --=20 2.43.0 From nobody Mon Feb 9 08:55:15 2026 Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 233C4235C1B for ; Sat, 22 Mar 2025 20:36:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742675786; cv=none; b=ltjRskDwY1caT94fiG+JQGNpxR4pzyOWhKu+qnADG+c1LgXeRDWb6p0QMGr5aQp8gJj8QHqoyIavVa6+4xtwy6nktlKHjpV3kOx2TcTa3OgGvzj/zuknq3X77VpV2PW7uB5WYmlqOiZ/OJ9iiTcJqWCCu/CgUk2tk6OXtFTJjgQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742675786; c=relaxed/simple; bh=qbvFSXXlRxEZRsSQ1rGR/kY5wbhIub0fjCD9kgQy4iY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OXPMWWZ/JrXkVOEH6QfUz9y6MC14INXLJUEXsXgIaZylrOnLBzOXQ8oHOrsc92spyPuXuHB7Tjz5bREZNw0HbAIuLMrJ4kprIYOWwHFqePHg6kqeiSE/cSu4oG2rSkag6ot9N/L+CgMnRIIIiUzxh7Xzl3fPMX0XRSLAOg8V5PY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=fastly.com; spf=pass smtp.mailfrom=fastly.com; dkim=pass (1024-bit key) header.d=fastly.com header.i=@fastly.com header.b=Z6Kltw/i; arc=none smtp.client-ip=209.85.216.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=fastly.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fastly.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=fastly.com header.i=@fastly.com header.b="Z6Kltw/i" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-301918a4e3bso5775199a91.3 for ; Sat, 22 Mar 2025 13:36:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastly.com; s=google; t=1742675784; x=1743280584; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+I4oPHJF+38GJ8m5lCV4gA9QS6Q49rkDipJxmeTXcI0=; b=Z6Kltw/i6kaKIXCk8l+lP+ERWp+RLs19yqq5uJcRofu3ZFcKi254gfhq9BSY0lqNLn 2w+w1sIZTdIDzSYaedhAoYze91xY2lnAAyCfxA2Kco0lYFxr0qzNfLvtuaEOdLxfQIJ+ P0k7JbkJxKxoGS16hhZjpYGGGTAufdPLqL5q4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742675784; x=1743280584; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+I4oPHJF+38GJ8m5lCV4gA9QS6Q49rkDipJxmeTXcI0=; b=ui/L5rHWONq0bniaelVsa4sd9Z/MW9dwpSe+I1xBVoWQN2TNGEL+NT8QTaUg15B/4j yhBRqKIPY9VuBiRXUrHQeWtjWUMY5/OA4qLxh5H4b5Bw8y7nt0e5PpwUi+4ujMQq1REV zS2dNzoUGx4ppub1NbYUhg00jFX+iOjn/TyOhejqvcD4RT24wwedPvS+5qPWWN7rvYw0 niINNgkdbFxOVwMQGGz/ZCVJl3n65LmLiL7i0rIL/uSbIkle0fRtfkJzHU7oMSKCIgj7 yfm6IKxtMUg64C+W/RBePKmqIFrXjj3DTJGnUGhVKbABut06rFInFf5AdUyRb+7LwFaH vXhQ== X-Forwarded-Encrypted: i=1; AJvYcCWaOKIm/P1o04zwj+RERScA43Es4M18zy+CXJ0Yb9WWqTszoTm73kdCn3/psw+HGWvzTiw6dfSTegFgjOU=@vger.kernel.org X-Gm-Message-State: AOJu0YwVn2i4d/NBGmVKFxw1kDCNb3y6bylKA9ibH49/iSco+vhKEmqf 6/rl3gOPsKQRi5gat9kYDuU4CgjCxluAQIrOFiOjvGlUVlAFELEHDKbsCUsmTN0= X-Gm-Gg: ASbGncujQWG145YPPuJJ1ytkokWPBA99lJDrIwcWtUtx6B6+ZxKHpYhpk0CArVGqsXO 1uPMHs6ulwK4ItgGUKw9Y+6unnxWMKZDrIbB+nmkK4ZDcGazsCm/KD49XaqYntRwy8ncLygESy0 R6pm0rATGt5S2cYarboURopwbLnfJ1D2VjUKDSulEb35maX8yEqhbTvk8vwwCFBwcjuX8hIT+r0 V8HIcRG1mE1XcnuwEhrumKk8xJstHpsuJB9nKzyhWaa/Xxy2r2Ap2Tvnjts3AQMKUa3zr9DIcH8 4RnE1NSWFjUOPhx152FQdjLCxabhPLix/XxWi9DbLh7w/eeqMF3h X-Google-Smtp-Source: AGHT+IHyoOis/rjHSFfuKccf8c+BZff1uWR7a/+owtf4wmyADvnt9ZNo6zx7hov+57H8z5QaPiwUUQ== X-Received: by 2002:a17:90a:d008:b0:2ff:693a:7590 with SMTP id 98e67ed59e1d1-3030ff08de9mr15396057a91.33.1742675784460; Sat, 22 Mar 2025 13:36:24 -0700 (PDT) Received: from localhost.localdomain ([2620:11a:c019:0:65e:3115:2f58:c5fd]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-301bf61a579sm8711798a91.32.2025.03.22.13.36.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 22 Mar 2025 13:36:24 -0700 (PDT) From: Joe Damato To: linux-fsdevel@vger.kernel.org Cc: netdev@vger.kernel.org, brauner@kernel.org, asml.silence@gmail.com, hch@infradead.org, axboe@kernel.dk, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, Joe Damato , Alexander Viro , Jan Kara , "David S. Miller" , linux-kernel@vger.kernel.org (open list) Subject: [PATCH vfs/for-next 2/3] splice: Move splice_to_socket to net/socket.c Date: Sat, 22 Mar 2025 20:35:45 +0000 Message-ID: <20250322203558.206411-3-jdamato@fastly.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250322203558.206411-1-jdamato@fastly.com> References: <20250322203558.206411-1-jdamato@fastly.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 Content-Type: text/plain; charset="utf-8" Eliminate the #ifdef CONFIG_NET from fs/splice.c and move the splice_to_socket helper to net/socket.c, where the other splice socket helpers live (like sock_splice_read and sock_splice_eof). Signed-off-by: Joe Damato Acked-by: Jakub Kicinski --- fs/splice.c | 140 ----------------------------------------- include/linux/splice.h | 3 - net/socket.c | 140 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 143 deletions(-) diff --git a/fs/splice.c b/fs/splice.c index dcd594a8fc06..40b96387a515 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -766,146 +766,6 @@ iter_file_splice_write(struct pipe_inode_info *pipe, = struct file *out, =20 EXPORT_SYMBOL(iter_file_splice_write); =20 -#ifdef CONFIG_NET -/** - * splice_to_socket - splice data from a pipe to a socket - * @pipe: pipe to splice from - * @out: socket to write to - * @ppos: position in @out - * @len: number of bytes to splice - * @flags: splice modifier flags - * - * Description: - * Will send @len bytes from the pipe to a network socket. No data copy= ing - * is involved. - * - */ -ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file *out, - loff_t *ppos, size_t len, unsigned int flags) -{ - struct socket *sock =3D sock_from_file(out); - struct bio_vec bvec[16]; - struct msghdr msg =3D {}; - ssize_t ret =3D 0; - size_t spliced =3D 0; - bool need_wakeup =3D false; - - pipe_lock(pipe); - - while (len > 0) { - unsigned int head, tail, mask, bc =3D 0; - size_t remain =3D len; - - /* - * Check for signal early to make process killable when there - * are always buffers available - */ - ret =3D -ERESTARTSYS; - if (signal_pending(current)) - break; - - while (pipe_empty(pipe->head, pipe->tail)) { - ret =3D 0; - if (!pipe->writers) - goto out; - - if (spliced) - goto out; - - ret =3D -EAGAIN; - if (flags & SPLICE_F_NONBLOCK) - goto out; - - ret =3D -ERESTARTSYS; - if (signal_pending(current)) - goto out; - - if (need_wakeup) { - pipe_wakeup_writers(pipe); - need_wakeup =3D false; - } - - pipe_wait_readable(pipe); - } - - head =3D pipe->head; - tail =3D pipe->tail; - mask =3D pipe->ring_size - 1; - - while (!pipe_empty(head, tail)) { - struct pipe_buffer *buf =3D &pipe->bufs[tail & mask]; - size_t seg; - - if (!buf->len) { - tail++; - continue; - } - - seg =3D min_t(size_t, remain, buf->len); - - ret =3D pipe_buf_confirm(pipe, buf); - if (unlikely(ret)) { - if (ret =3D=3D -ENODATA) - ret =3D 0; - break; - } - - bvec_set_page(&bvec[bc++], buf->page, seg, buf->offset); - remain -=3D seg; - if (remain =3D=3D 0 || bc >=3D ARRAY_SIZE(bvec)) - break; - tail++; - } - - if (!bc) - break; - - msg.msg_flags =3D MSG_SPLICE_PAGES; - if (flags & SPLICE_F_MORE) - msg.msg_flags |=3D MSG_MORE; - if (remain && pipe_occupancy(pipe->head, tail) > 0) - msg.msg_flags |=3D MSG_MORE; - if (out->f_flags & O_NONBLOCK) - msg.msg_flags |=3D MSG_DONTWAIT; - - iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, bvec, bc, - len - remain); - ret =3D sock_sendmsg(sock, &msg); - if (ret <=3D 0) - break; - - spliced +=3D ret; - len -=3D ret; - tail =3D pipe->tail; - while (ret > 0) { - struct pipe_buffer *buf =3D &pipe->bufs[tail & mask]; - size_t seg =3D min_t(size_t, ret, buf->len); - - buf->offset +=3D seg; - buf->len -=3D seg; - ret -=3D seg; - - if (!buf->len) { - pipe_buf_release(pipe, buf); - tail++; - } - } - - if (tail !=3D pipe->tail) { - pipe->tail =3D tail; - if (pipe->files) - need_wakeup =3D true; - } - } - -out: - pipe_unlock(pipe); - if (need_wakeup) - pipe_wakeup_writers(pipe); - return spliced ?: ret; -} -#endif - static int warn_unsupported(struct file *file, const char *op) { pr_debug_ratelimited( diff --git a/include/linux/splice.h b/include/linux/splice.h index 9dec4861d09f..54c47776469d 100644 --- a/include/linux/splice.h +++ b/include/linux/splice.h @@ -97,9 +97,6 @@ static inline long splice_copy_file_range(struct file *in= , loff_t pos_in, =20 ssize_t do_tee(struct file *in, struct file *out, size_t len, unsigned int flags); -ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file *out, - loff_t *ppos, size_t len, unsigned int flags); - /* * for dynamic pipe sizing */ diff --git a/net/socket.c b/net/socket.c index 9a117248f18f..2640b42cf320 100644 --- a/net/socket.c +++ b/net/socket.c @@ -132,6 +132,8 @@ static ssize_t sock_splice_read(struct file *file, loff= _t *ppos, struct pipe_inode_info *pipe, size_t len, unsigned int flags); static void sock_splice_eof(struct file *file); +static ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file = *out, + loff_t *ppos, size_t len, unsigned int flags); =20 #ifdef CONFIG_PROC_FS static void sock_show_fdinfo(struct seq_file *m, struct file *f) @@ -3719,3 +3721,141 @@ u32 kernel_sock_ip_overhead(struct sock *sk) } } EXPORT_SYMBOL(kernel_sock_ip_overhead); + +/** + * splice_to_socket - splice data from a pipe to a socket + * @pipe: pipe to splice from + * @out: socket to write to + * @ppos: position in @out + * @len: number of bytes to splice + * @flags: splice modifier flags + * + * Description: + * Will send @len bytes from the pipe to a network socket. No data copy= ing + * is involved. + * + */ +static ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file = *out, + loff_t *ppos, size_t len, unsigned int flags) +{ + struct socket *sock =3D sock_from_file(out); + struct bio_vec bvec[16]; + struct msghdr msg =3D {}; + ssize_t ret =3D 0; + size_t spliced =3D 0; + bool need_wakeup =3D false; + + pipe_lock(pipe); + + while (len > 0) { + unsigned int head, tail, mask, bc =3D 0; + size_t remain =3D len; + + /* + * Check for signal early to make process killable when there + * are always buffers available + */ + ret =3D -ERESTARTSYS; + if (signal_pending(current)) + break; + + while (pipe_empty(pipe->head, pipe->tail)) { + ret =3D 0; + if (!pipe->writers) + goto out; + + if (spliced) + goto out; + + ret =3D -EAGAIN; + if (flags & SPLICE_F_NONBLOCK) + goto out; + + ret =3D -ERESTARTSYS; + if (signal_pending(current)) + goto out; + + if (need_wakeup) { + pipe_wakeup_writers(pipe); + need_wakeup =3D false; + } + + pipe_wait_readable(pipe); + } + + head =3D pipe->head; + tail =3D pipe->tail; + mask =3D pipe->ring_size - 1; + + while (!pipe_empty(head, tail)) { + struct pipe_buffer *buf =3D &pipe->bufs[tail & mask]; + size_t seg; + + if (!buf->len) { + tail++; + continue; + } + + seg =3D min_t(size_t, remain, buf->len); + + ret =3D pipe_buf_confirm(pipe, buf); + if (unlikely(ret)) { + if (ret =3D=3D -ENODATA) + ret =3D 0; + break; + } + + bvec_set_page(&bvec[bc++], buf->page, seg, buf->offset); + remain -=3D seg; + if (remain =3D=3D 0 || bc >=3D ARRAY_SIZE(bvec)) + break; + tail++; + } + + if (!bc) + break; + + msg.msg_flags =3D MSG_SPLICE_PAGES; + if (flags & SPLICE_F_MORE) + msg.msg_flags |=3D MSG_MORE; + if (remain && pipe_occupancy(pipe->head, tail) > 0) + msg.msg_flags |=3D MSG_MORE; + if (out->f_flags & O_NONBLOCK) + msg.msg_flags |=3D MSG_DONTWAIT; + + iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, bvec, bc, + len - remain); + ret =3D sock_sendmsg(sock, &msg); + if (ret <=3D 0) + break; + + spliced +=3D ret; + len -=3D ret; + tail =3D pipe->tail; + while (ret > 0) { + struct pipe_buffer *buf =3D &pipe->bufs[tail & mask]; + size_t seg =3D min_t(size_t, ret, buf->len); + + buf->offset +=3D seg; + buf->len -=3D seg; + ret -=3D seg; + + if (!buf->len) { + pipe_buf_release(pipe, buf); + tail++; + } + } + + if (tail !=3D pipe->tail) { + pipe->tail =3D tail; + if (pipe->files) + need_wakeup =3D true; + } + } + +out: + pipe_unlock(pipe); + if (need_wakeup) + pipe_wakeup_writers(pipe); + return spliced ?: ret; +} --=20 2.43.0 From nobody Mon Feb 9 08:55:15 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C2E42236437 for ; Sat, 22 Mar 2025 20:36:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742675788; cv=none; b=U4kuWR5KvSSXIVcvanUe/LEgQ2p393OkyFZuT6UfQr/ce1Vt99UmlFoVsEVdsu4UGX2/HW51MejrgNednok/EKQHN7TZPx9kRpSOvh4kH1YDuC0fkkh6Hkiu+SD4qs8t31fGJ7Vnb/+seqIZJJTY4I1Cjk28wBVAC4bCwz4G0+c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742675788; c=relaxed/simple; bh=c3/J2vBhFHgcYU8/R+B3kO6gEpk4hnzkVfVtuyfH1MY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L7fzSEX7eHpvl24YISKARa6B7kfKHIxNfSsXDaXjJ9ntoBm6PJL5RhFIVWSZ/c3ZNG9JaBdi5+D+uf4SFvT5h60o4J8CQhHNme3X+jtxJ6+jgeR/zPpjwwbmyYRypO6+CK0O1MoN2XX9cs8yek7W+mBuPgAIiMrVJYYMbGml9Nc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=fastly.com; spf=pass smtp.mailfrom=fastly.com; dkim=pass (1024-bit key) header.d=fastly.com header.i=@fastly.com header.b=vYtlnrts; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=fastly.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fastly.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=fastly.com header.i=@fastly.com header.b="vYtlnrts" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-223f4c06e9fso49800155ad.1 for ; Sat, 22 Mar 2025 13:36:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastly.com; s=google; t=1742675786; x=1743280586; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dz/LHTTUvobHGyp+oeRaoigsjw3nQSx8Yss6Q7WiTEA=; b=vYtlnrtsa70XvUxSH/BwDpwL7WlkEe4pR4Dqcd+CuXXifqtEe04UCyrmSCgFn2MBiE 0xvx0EEJLPsYvBsDDvJ7p2DFfbSC2vsUr0PMxehVIEQbrS0mCf9+ohJ+0kHvjJU/VoKP CSZemS9GPjNvXN1utqyDLFd32AA3/U3MqFj2w= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742675786; x=1743280586; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dz/LHTTUvobHGyp+oeRaoigsjw3nQSx8Yss6Q7WiTEA=; b=vlo8nb7jCrDZ4Dye44CYoRptqOtNZNuUBAS/93kQc8isRO9LFBDk6oIN7NxnNI3bOy erYCu72FFkbO//i5upv267IH97pp0r1J7yiYUKw9a5/Y0oaKiv0bHkmpnCBUwn3HlNun QhjCJ8/esnXgJXfZV0AySGn/EjPmcmlLzaMsN6U/yhYcMzZnHytl6ThqMni7dJKt5q3O NP7ZeCXaLUlk/NdsN/Tmxe3yMY9d5B/06cHUqZLaV+47Kr+zRh+VR2Cdt/W7QExHj0t5 l1fTlyPSyyHCqi3eAunaLZFv3MqQwsuPA+fgVadeLiaYPfbNZoLuMyI6fJBA+m9y3u/e Wdmg== X-Forwarded-Encrypted: i=1; AJvYcCVz6UoFyeDStHt6GHLeQl14VSbjqdJ7tnfxi9ei0wYiQfYGWftw4lMNq+DzdYew+dq5Xz5xXT+dIxC3v+A=@vger.kernel.org X-Gm-Message-State: AOJu0YxD3ltimrUyHgBXkFhosRJMucogLoJi9e4k4EqcfgKtzJxPGl23 oJJnPlhfPtXlEdB58XCLjRrlCjOcVjWI8hakw8GcwAff2NbVipP5ftQlaulMlts= X-Gm-Gg: ASbGncuq2M1CqukUoZVE5f+/bkM8EuKvruWvjQTrCBqOjioiEEN8OZYAsaUJ2lXuTve mCMi040ujIIAx18PeASnSXGzMGlxpaDFn47N9HNY+J23kdDybFokK+9G5uj35YTd9ncj3IjFTcy 4Ie8PTEI/ytX9H49sqRrZBdGs1C6qGU6UJxnziVA6kG1L6BS6tavlQN8RPvB84FOarse+h+fvg9 yZYSr7rZuEgU5PDUP5esxPUiijt/JmWe1P222Re07olDtDKCfXUABtTA4YJKMjeQ7O4KDKGNw0u 11mT58jnH3RWIEb0lYgj74bikdjhk0rf8BQYNG/y/Yss20UIhKwieHZ516jCsKI= X-Google-Smtp-Source: AGHT+IFlOF9+hHiNwkeX6ca8/2vV/UbK7oUM8j14EpRf1krcAZwqEjvIIPVQftAfXDqYfTgS2nWJkA== X-Received: by 2002:a17:902:d9d0:b0:21f:6d63:6f4f with SMTP id d9443c01a7336-2265e67fa37mr149203865ad.2.1742675785993; Sat, 22 Mar 2025 13:36:25 -0700 (PDT) Received: from localhost.localdomain ([2620:11a:c019:0:65e:3115:2f58:c5fd]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-301bf61a579sm8711798a91.32.2025.03.22.13.36.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 22 Mar 2025 13:36:25 -0700 (PDT) From: Joe Damato To: linux-fsdevel@vger.kernel.org Cc: netdev@vger.kernel.org, brauner@kernel.org, asml.silence@gmail.com, hch@infradead.org, axboe@kernel.dk, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, Joe Damato , "David S. Miller" , linux-kernel@vger.kernel.org (open list) Subject: [PATCH vfs/for-next 3/3] net: splice_to_socket: RCT declaration cleanup Date: Sat, 22 Mar 2025 20:35:46 +0000 Message-ID: <20250322203558.206411-4-jdamato@fastly.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250322203558.206411-1-jdamato@fastly.com> References: <20250322203558.206411-1-jdamato@fastly.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 Content-Type: text/plain; charset="utf-8" Make declarations reverse x-mas tree style now that splice_to_socket lives in net/. Signed-off-by: Joe Damato --- net/socket.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/socket.c b/net/socket.c index 2640b42cf320..b54df75af1a1 100644 --- a/net/socket.c +++ b/net/socket.c @@ -3739,11 +3739,11 @@ static ssize_t splice_to_socket(struct pipe_inode_i= nfo *pipe, struct file *out, loff_t *ppos, size_t len, unsigned int flags) { struct socket *sock =3D sock_from_file(out); + bool need_wakeup =3D false; struct bio_vec bvec[16]; struct msghdr msg =3D {}; - ssize_t ret =3D 0; size_t spliced =3D 0; - bool need_wakeup =3D false; + ssize_t ret =3D 0; =20 pipe_lock(pipe); =20 --=20 2.43.0