On Mon 26-07-21 19:50:23, Andreas Grünbacher wrote: > Jan Kara <jack@xxxxxxx> schrieb am Mo., 26. Juli 2021, 19:10: > > > On Fri 23-07-21 22:58:40, Andreas Gruenbacher wrote: > > > Also disable page faults during direct I/O requests and implement the > > same kind > > > of retry logic as in the buffered I/O case. > > > > > > Direct I/O requests differ from buffered I/O requests in that they use > > > bio_iov_iter_get_pages for grabbing page references and faulting in pages > > > instead of triggering real page faults. Those manual page faults can be > > > disabled with the iocb->noio flag. > > > > > > Signed-off-by: Andreas Gruenbacher <agruenba@xxxxxxxxxx> > > > --- > > > fs/gfs2/file.c | 34 +++++++++++++++++++++++++++++++++- > > > 1 file changed, 33 insertions(+), 1 deletion(-) > > > > > > diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c > > > index f66ac7f56f6d..7986f3be69d2 100644 > > > --- a/fs/gfs2/file.c > > > +++ b/fs/gfs2/file.c > > > @@ -782,21 +782,41 @@ static ssize_t gfs2_file_direct_read(struct kiocb > > *iocb, struct iov_iter *to, > > > struct file *file = iocb->ki_filp; > > > struct gfs2_inode *ip = GFS2_I(file->f_mapping->host); > > > size_t count = iov_iter_count(to); > > > + size_t written = 0; > > > ssize_t ret; > > > > > > + /* > > > + * In this function, we disable page faults when we're holding the > > > + * inode glock while doing I/O. If a page fault occurs, we drop > > the > > > + * inode glock, fault in the pages manually, and then we retry. > > Other > > > + * than in gfs2_file_read_iter, iomap_dio_rw can trigger implicit > > as > > > + * well as manual page faults, and we need to disable both kinds > > > + * separately. > > > + */ > > > + > > > if (!count) > > > return 0; /* skip atime */ > > > > > > gfs2_holder_init(ip->i_gl, LM_ST_DEFERRED, 0, gh); > > > +retry: > > > ret = gfs2_glock_nq(gh); > > > if (ret) > > > goto out_uninit; > > > > > > + pagefault_disable(); > > > > Is there any use in pagefault_disable() here? iomap_dio_rw() should not > > trigger any page faults anyway, should it? > > > > It can trigger physical page faults when reading from holes. Aha, good point. Maybe even worth a comment at this site? Thanks for explanation! Honza -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR