| From c2489e07c0a71a56fb2c84bc0ee66cddfca7d068 Mon Sep 17 00:00:00 2001 |
| From: Jan Kara <jack@suse.cz> |
| Date: Mon, 23 Nov 2015 13:09:51 +0100 |
| Subject: vfs: Avoid softlockups with sendfile(2) |
| |
| commit c2489e07c0a71a56fb2c84bc0ee66cddfca7d068 upstream. |
| |
| The following test program from Dmitry can cause softlockups or RCU |
| stalls as it copies 1GB from tmpfs into eventfd and we don't have any |
| scheduling point at that path in sendfile(2) implementation: |
| |
| 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); |
| |
| Add cond_resched() into __splice_from_pipe() to fix the problem. |
| |
| CC: Dmitry Vyukov <dvyukov@google.com> |
| Signed-off-by: Jan Kara <jack@suse.cz> |
| Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> |
| Signed-off-by: Zefan Li <lizefan@huawei.com> |
| --- |
| fs/splice.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/fs/splice.c |
| +++ b/fs/splice.c |
| @@ -935,6 +935,7 @@ ssize_t __splice_from_pipe(struct pipe_i |
| |
| splice_from_pipe_begin(sd); |
| do { |
| + cond_resched(); |
| ret = splice_from_pipe_next(pipe, sd); |
| if (ret > 0) |
| ret = splice_from_pipe_feed(pipe, sd, actor); |