public inbox for stable@vger.kernel.org
 help / color / mirror / Atom feed
* [merged mm-nonmm-stable] fs-sendfile-handles-o_nonblock-of-out_fd.patch removed from -mm tree
@ 2022-05-13 19:23 Andrew Morton
  2022-07-07 23:13 ` Andrei Vagin
  0 siblings, 1 reply; 3+ messages in thread
From: Andrew Morton @ 2022-05-13 19:23 UTC (permalink / raw)
  To: mm-commits, viro, stable, avagin, akpm


The quilt patch titled
     Subject: fs: sendfile handles O_NONBLOCK of out_fd
has been removed from the -mm tree.  Its filename was
     fs-sendfile-handles-o_nonblock-of-out_fd.patch

This patch was dropped because it was merged into the mm-nonmm-stable branch\nof git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm

------------------------------------------------------
From: Andrei Vagin <avagin@gmail.com>
Subject: fs: sendfile handles O_NONBLOCK of out_fd

sendfile has to return EAGAIN if out_fd is nonblocking and the write into
it would block.

Here is a small reproducer for the problem:

#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/sendfile.h>


#define FILE_SIZE (1UL << 30)
int main(int argc, char **argv) {
        int p[2], fd;

        if (pipe2(p, O_NONBLOCK))
                return 1;

        fd = open(argv[1], O_RDWR | O_TMPFILE, 0666);
        if (fd < 0)
                return 1;
        ftruncate(fd, FILE_SIZE);

        if (sendfile(p[1], fd, 0, FILE_SIZE) == -1) {
                fprintf(stderr, "FAIL\n");
        }
        if (sendfile(p[1], fd, 0, FILE_SIZE) != -1 || errno != EAGAIN) {
                fprintf(stderr, "FAIL\n");
        }
        return 0;
}

It worked before b964bf53e540, it is stuck after b964bf53e540, and it
works again with this fix.

This regression occurred because do_splice_direct() calls pipe_write
that handles O_NONBLOCK.  Here is a trace log from the reproducer:

 1)               |  __x64_sys_sendfile64() {
 1)               |    do_sendfile() {
 1)               |      __fdget()
 1)               |      rw_verify_area()
 1)               |      __fdget()
 1)               |      rw_verify_area()
 1)               |      do_splice_direct() {
 1)               |        rw_verify_area()
 1)               |        splice_direct_to_actor() {
 1)               |          do_splice_to() {
 1)               |            rw_verify_area()
 1)               |            generic_file_splice_read()
 1) + 74.153 us   |          }
 1)               |          direct_splice_actor() {
 1)               |            iter_file_splice_write() {
 1)               |              __kmalloc()
 1)   0.148 us    |              pipe_lock();
 1)   0.153 us    |              splice_from_pipe_next.part.0();
 1)   0.162 us    |              page_cache_pipe_buf_confirm();
... 16 times
 1)   0.159 us    |              page_cache_pipe_buf_confirm();
 1)               |              vfs_iter_write() {
 1)               |                do_iter_write() {
 1)               |                  rw_verify_area()
 1)               |                  do_iter_readv_writev() {
 1)               |                    pipe_write() {
 1)               |                      mutex_lock()
 1)   0.153 us    |                      mutex_unlock();
 1)   1.368 us    |                    }
 1)   1.686 us    |                  }
 1)   5.798 us    |                }
 1)   6.084 us    |              }
 1)   0.174 us    |              kfree();
 1)   0.152 us    |              pipe_unlock();
 1) + 14.461 us   |            }
 1) + 14.783 us   |          }
 1)   0.164 us    |          page_cache_pipe_buf_release();
... 16 times
 1)   0.161 us    |          page_cache_pipe_buf_release();
 1)               |          touch_atime()
 1) + 95.854 us   |        }
 1) + 99.784 us   |      }
 1) ! 107.393 us  |    }
 1) ! 107.699 us  |  }

Link: https://lkml.kernel.org/r/20220415005015.525191-1-avagin@gmail.com
Fixes: b964bf53e540 ("teach sendfile(2) to handle send-to-pipe directly")
Signed-off-by: Andrei Vagin <avagin@gmail.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 fs/read_write.c |    3 +++
 1 file changed, 3 insertions(+)

--- a/fs/read_write.c~fs-sendfile-handles-o_nonblock-of-out_fd
+++ a/fs/read_write.c
@@ -1247,6 +1247,9 @@ static ssize_t do_sendfile(int out_fd, i
 					  count, fl);
 		file_end_write(out.file);
 	} else {
+		if (out.file->f_flags & O_NONBLOCK)
+			fl |= SPLICE_F_NONBLOCK;
+
 		retval = splice_file_to_pipe(in.file, opipe, &pos, count, fl);
 	}
 
_

Patches currently in -mm which might be from avagin@gmail.com are



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [merged mm-nonmm-stable] fs-sendfile-handles-o_nonblock-of-out_fd.patch removed from -mm tree
  2022-05-13 19:23 [merged mm-nonmm-stable] fs-sendfile-handles-o_nonblock-of-out_fd.patch removed from -mm tree Andrew Morton
@ 2022-07-07 23:13 ` Andrei Vagin
  2022-07-08  0:25   ` Andrew Morton
  0 siblings, 1 reply; 3+ messages in thread
From: Andrei Vagin @ 2022-07-07 23:13 UTC (permalink / raw)
  To: Andrew Morton; +Cc: mm-commits, Alexander Viro, stable

On Fri, May 13, 2022 at 12:23 PM Andrew Morton
<akpm@linux-foundation.org> wrote:
>
>
> The quilt patch titled
>      Subject: fs: sendfile handles O_NONBLOCK of out_fd
> has been removed from the -mm tree.  Its filename was
>      fs-sendfile-handles-o_nonblock-of-out_fd.patch
>
> This patch was dropped because it was merged into the mm-nonmm-stable branch\nof git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm

Andrew, sorry for bothering you. I can't find this patch in mm-nonmm-stable
and it has not been merged to the Linus' tree. Do I miss something?

>
> ------------------------------------------------------
> From: Andrei Vagin <avagin@gmail.com>
> Subject: fs: sendfile handles O_NONBLOCK of out_fd
>
> sendfile has to return EAGAIN if out_fd is nonblocking and the write into
> it would block.
>
> Here is a small reproducer for the problem:
>
> #define _GNU_SOURCE /* See feature_test_macros(7) */
> #include <fcntl.h>
> #include <stdio.h>
> #include <unistd.h>
> #include <errno.h>
> #include <sys/stat.h>
> #include <sys/types.h>
> #include <sys/sendfile.h>
>
>
> #define FILE_SIZE (1UL << 30)
> int main(int argc, char **argv) {
>         int p[2], fd;
>
>         if (pipe2(p, O_NONBLOCK))
>                 return 1;
>
>         fd = open(argv[1], O_RDWR | O_TMPFILE, 0666);
>         if (fd < 0)
>                 return 1;
>         ftruncate(fd, FILE_SIZE);
>
>         if (sendfile(p[1], fd, 0, FILE_SIZE) == -1) {
>                 fprintf(stderr, "FAIL\n");
>         }
>         if (sendfile(p[1], fd, 0, FILE_SIZE) != -1 || errno != EAGAIN) {
>                 fprintf(stderr, "FAIL\n");
>         }
>         return 0;
> }
>
> It worked before b964bf53e540, it is stuck after b964bf53e540, and it
> works again with this fix.
>
> This regression occurred because do_splice_direct() calls pipe_write
> that handles O_NONBLOCK.  Here is a trace log from the reproducer:
>
>  1)               |  __x64_sys_sendfile64() {
>  1)               |    do_sendfile() {
>  1)               |      __fdget()
>  1)               |      rw_verify_area()
>  1)               |      __fdget()
>  1)               |      rw_verify_area()
>  1)               |      do_splice_direct() {
>  1)               |        rw_verify_area()
>  1)               |        splice_direct_to_actor() {
>  1)               |          do_splice_to() {
>  1)               |            rw_verify_area()
>  1)               |            generic_file_splice_read()
>  1) + 74.153 us   |          }
>  1)               |          direct_splice_actor() {
>  1)               |            iter_file_splice_write() {
>  1)               |              __kmalloc()
>  1)   0.148 us    |              pipe_lock();
>  1)   0.153 us    |              splice_from_pipe_next.part.0();
>  1)   0.162 us    |              page_cache_pipe_buf_confirm();
> ... 16 times
>  1)   0.159 us    |              page_cache_pipe_buf_confirm();
>  1)               |              vfs_iter_write() {
>  1)               |                do_iter_write() {
>  1)               |                  rw_verify_area()
>  1)               |                  do_iter_readv_writev() {
>  1)               |                    pipe_write() {
>  1)               |                      mutex_lock()
>  1)   0.153 us    |                      mutex_unlock();
>  1)   1.368 us    |                    }
>  1)   1.686 us    |                  }
>  1)   5.798 us    |                }
>  1)   6.084 us    |              }
>  1)   0.174 us    |              kfree();
>  1)   0.152 us    |              pipe_unlock();
>  1) + 14.461 us   |            }
>  1) + 14.783 us   |          }
>  1)   0.164 us    |          page_cache_pipe_buf_release();
> ... 16 times
>  1)   0.161 us    |          page_cache_pipe_buf_release();
>  1)               |          touch_atime()
>  1) + 95.854 us   |        }
>  1) + 99.784 us   |      }
>  1) ! 107.393 us  |    }
>  1) ! 107.699 us  |  }
>
> Link: https://lkml.kernel.org/r/20220415005015.525191-1-avagin@gmail.com
> Fixes: b964bf53e540 ("teach sendfile(2) to handle send-to-pipe directly")
> Signed-off-by: Andrei Vagin <avagin@gmail.com>
> Cc: Al Viro <viro@zeniv.linux.org.uk>
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
> ---
>
>  fs/read_write.c |    3 +++
>  1 file changed, 3 insertions(+)
>
> --- a/fs/read_write.c~fs-sendfile-handles-o_nonblock-of-out_fd
> +++ a/fs/read_write.c
> @@ -1247,6 +1247,9 @@ static ssize_t do_sendfile(int out_fd, i
>                                           count, fl);
>                 file_end_write(out.file);
>         } else {
> +               if (out.file->f_flags & O_NONBLOCK)
> +                       fl |= SPLICE_F_NONBLOCK;
> +
>                 retval = splice_file_to_pipe(in.file, opipe, &pos, count, fl);
>         }
>
> _
>
> Patches currently in -mm which might be from avagin@gmail.com are
>
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [merged mm-nonmm-stable] fs-sendfile-handles-o_nonblock-of-out_fd.patch removed from -mm tree
  2022-07-07 23:13 ` Andrei Vagin
@ 2022-07-08  0:25   ` Andrew Morton
  0 siblings, 0 replies; 3+ messages in thread
From: Andrew Morton @ 2022-07-08  0:25 UTC (permalink / raw)
  To: Andrei Vagin; +Cc: mm-commits, Alexander Viro, stable

On Thu, 7 Jul 2022 16:13:09 -0700 Andrei Vagin <avagin@gmail.com> wrote:

> On Fri, May 13, 2022 at 12:23 PM Andrew Morton
> <akpm@linux-foundation.org> wrote:
> >
> >
> > The quilt patch titled
> >      Subject: fs: sendfile handles O_NONBLOCK of out_fd
> > has been removed from the -mm tree.  Its filename was
> >      fs-sendfile-handles-o_nonblock-of-out_fd.patch
> >
> > This patch was dropped because it was merged into the mm-nonmm-stable branch\nof git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
> 
> Andrew, sorry for bothering you. I can't find this patch in mm-nonmm-stable
> and it has not been merged to the Linus' tree. Do I miss something?

Thanks, I'm not sure what happened there.  I'll restore it.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-07-08  0:25 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-05-13 19:23 [merged mm-nonmm-stable] fs-sendfile-handles-o_nonblock-of-out_fd.patch removed from -mm tree Andrew Morton
2022-07-07 23:13 ` Andrei Vagin
2022-07-08  0:25   ` Andrew Morton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox