Re: [PATCH 1/2] vfs: Make sendfile(2) killable even better

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Fixed the issue for me.

Tested-by: Dmitry Vyukov <dvyukov@xxxxxxxxxx>

Thanks for quick fixes!


On Mon, Nov 23, 2015 at 1:09 PM, Jan Kara <jack@xxxxxxx> wrote:
> Commit 296291cdd162 (mm: make sendfile(2) killable) fixed an issue where
> sendfile(2) was doing a lot of tiny writes into a filesystem and thus
> was unkillable for a long time. However sendfile(2) can be (mis)used to
> issue lots of writes into arbitrary file descriptor such as evenfd or
> similar special file descriptors which never hit the standard filesystem
> write path and thus are still unkillable. E.g. the following example
> from Dmitry burns CPU for ~16s on my test system without possibility to
> be killed:
>
>         int r1 = eventfd(0, 0);
>         int r2 = memfd_create("", 0);
>         unsigned long n = 1<<30;
>         fallocate(r2, 0, 0, n);
>         sendfile(r1, r2, 0, n);
>
> There are actually quite a few tests for pending signals in sendfile
> code however we data to write is always available none of them seems to
> trigger. So fix the problem by adding a test for pending signal into
> splice_from_pipe_next() also before the loop waiting for pipe buffers to
> be available. This should fix all the lockup issues with sendfile of the
> do-ton-of-tiny-writes nature.
>
> CC: stable@xxxxxxxxxxxxxxx
> Reported-by: Dmitry Vyukov <dvyukov@xxxxxxxxxx>
> Signed-off-by: Jan Kara <jack@xxxxxxx>
> ---
>  fs/splice.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/fs/splice.c b/fs/splice.c
> index 801c21cd77fe..22adbbe51e52 100644
> --- a/fs/splice.c
> +++ b/fs/splice.c
> @@ -809,6 +809,13 @@ static int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_des
>   */
>  static int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_desc *sd)
>  {
> +       /*
> +        * Check for signal early to make process killable when there are
> +        * always buffers available
> +        */
> +       if (signal_pending(current))
> +               return -ERESTARTSYS;
> +
>         while (!pipe->nrbufs) {
>                 if (!pipe->writers)
>                         return 0;
> --
> 2.1.4
>
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]