From: Andreas Gruenbacher <agruenba@redhat.com> To: Linus Torvalds <torvalds@linux-foundation.org>, Alexander Viro <viro@zeniv.linux.org.uk>, Christoph Hellwig <hch@infradead.org>, "Darrick J. Wong" <djwong@kernel.org> Cc: Jan Kara <jack@suse.cz>, Andreas Gruenbacher <agruenba@redhat.com>, linux-kernel@vger.kernel.org, cluster-devel@redhat.com, linux-fsdevel@vger.kernel.org, ocfs2-devel@oss.oracle.com Subject: [Ocfs2-devel] [PATCH v3 6/7] iov_iter: Introduce noio flag to disable page faults Date: Fri, 23 Jul 2021 22:58:39 +0200 [thread overview] Message-ID: <20210723205840.299280-7-agruenba@redhat.com> (raw) In-Reply-To: <20210723205840.299280-1-agruenba@redhat.com> Introduce a new noio flag to indicate to get_user_pages to use the FOLL_FAST_ONLY flag. This will cause get_user_pages to fail when it would otherwise fault in a page. Currently, the noio flag is only checked in iov_iter_get_pages and iov_iter_get_pages_alloc. This is enough for iomaop_dio_rw, but it may make sense to check for this flag in other contexts as well. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> --- include/linux/uio.h | 1 + lib/iov_iter.c | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/linux/uio.h b/include/linux/uio.h index 152b3605e86c..8de6354ade14 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h @@ -29,6 +29,7 @@ enum iter_type { struct iov_iter { u8 iter_type; + bool noio; bool data_source; size_t iov_offset; size_t count; diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 7221665f7ac4..a20426cedf60 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -509,6 +509,7 @@ void iov_iter_init(struct iov_iter *i, unsigned int direction, WARN_ON(direction & ~(READ | WRITE)); *i = (struct iov_iter) { .iter_type = ITER_IOVEC, + .noio = false, .data_source = direction, .iov = iov, .nr_segs = nr_segs, @@ -1519,13 +1520,17 @@ ssize_t iov_iter_get_pages(struct iov_iter *i, return 0; if (likely(iter_is_iovec(i))) { + unsigned int gup_flags = 0; unsigned long addr; + if (iov_iter_rw(i) != WRITE) + gup_flags |= FOLL_WRITE; + if (i->noio) + gup_flags |= FOLL_FAST_ONLY; + addr = first_iovec_segment(i, &len, start, maxsize, maxpages); n = DIV_ROUND_UP(len, PAGE_SIZE); - res = get_user_pages_fast(addr, n, - iov_iter_rw(i) != WRITE ? FOLL_WRITE : 0, - pages); + res = get_user_pages_fast(addr, n, gup_flags, pages); if (unlikely(res <= 0)) return res; return (res == n ? len : res * PAGE_SIZE) - *start; @@ -1641,15 +1646,20 @@ ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, return 0; if (likely(iter_is_iovec(i))) { + unsigned int gup_flags = 0; unsigned long addr; + if (iov_iter_rw(i) != WRITE) + gup_flags |= FOLL_WRITE; + if (i->noio) + gup_flags |= FOLL_FAST_ONLY; + addr = first_iovec_segment(i, &len, start, maxsize, ~0U); n = DIV_ROUND_UP(len, PAGE_SIZE); p = get_pages_array(n); if (!p) return -ENOMEM; - res = get_user_pages_fast(addr, n, - iov_iter_rw(i) != WRITE ? FOLL_WRITE : 0, p); + res = get_user_pages_fast(addr, n, gup_flags, p); if (unlikely(res <= 0)) { kvfree(p); *pages = ZERO_SIZE_PTR; -- 2.26.3 _______________________________________________ Ocfs2-devel mailing list Ocfs2-devel@oss.oracle.com https://oss.oracle.com/mailman/listinfo/ocfs2-devel
next prev parent reply other threads:[~2021-07-23 20:59 UTC|newest] Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-07-23 20:58 [Ocfs2-devel] [PATCH v3 0/7] gfs2: Fix mmap + page fault deadlocks Andreas Gruenbacher 2021-07-23 20:58 ` [Ocfs2-devel] [PATCH v3 1/7] iov_iter: Introduce fault_in_iov_iter helper Andreas Gruenbacher 2021-07-23 23:40 ` Linus Torvalds 2021-07-24 7:51 ` Andreas Grünbacher 2021-07-24 1:52 ` Al Viro 2021-07-24 8:05 ` Andreas Grünbacher 2021-07-26 16:33 ` Jan Kara 2021-07-26 17:15 ` Linus Torvalds 2021-07-23 20:58 ` [Ocfs2-devel] [PATCH v3 2/7] gfs2: Add wrapper for iomap_file_buffered_write Andreas Gruenbacher 2021-07-23 20:58 ` [Ocfs2-devel] [PATCH v3 3/7] gfs2: Fix mmap + page fault deadlocks for buffered I/O Andreas Gruenbacher 2021-07-23 20:58 ` [Ocfs2-devel] [PATCH v3 4/7] iomap: Fix iomap_dio_rw return value for user copies Andreas Gruenbacher 2021-07-23 20:58 ` [Ocfs2-devel] [PATCH v3 5/7] iomap: Support restarting direct I/O requests after user copy failures Andreas Gruenbacher 2021-07-26 17:19 ` Jan Kara 2021-07-26 17:45 ` Andreas Grünbacher 2021-07-26 18:08 ` Jan Kara 2021-07-23 20:58 ` Andreas Gruenbacher [this message] 2021-07-23 20:58 ` [Ocfs2-devel] [PATCH v3 7/7] gfs2: Fix mmap + page fault deadlocks for direct I/O Andreas Gruenbacher 2021-07-26 17:02 ` Jan Kara 2021-07-26 17:50 ` Andreas Grünbacher 2021-07-26 18:00 ` Jan Kara
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210723205840.299280-7-agruenba@redhat.com \ --to=agruenba@redhat.com \ --cc=cluster-devel@redhat.com \ --cc=djwong@kernel.org \ --cc=hch@infradead.org \ --cc=jack@suse.cz \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=ocfs2-devel@oss.oracle.com \ --cc=torvalds@linux-foundation.org \ --cc=viro@zeniv.linux.org.uk \ --subject='Re: [Ocfs2-devel] [PATCH v3 6/7] iov_iter: Introduce noio flag to disable page faults' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).