lkml.org 
[lkml]   [2021]   [Jan]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH v5 12/18] mm/filemap: Move the iocb checks into filemap_update_page
Date
We don't need to give up when a non-blocking request sees a !Uptodate page.
We may be able to satisfy the read from a partially-uptodate page.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Kent Overstreet <kent.overstreet@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
---
mm/filemap.c | 24 ++++++++++--------------
1 file changed, 10 insertions(+), 14 deletions(-)

diff --git a/mm/filemap.c b/mm/filemap.c
index 469fc97659cb5..9fbfb27483147 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -2253,15 +2253,16 @@ static int filemap_update_page(struct kiocb *iocb,
struct inode *inode = mapping->host;
int error;

- if (iocb->ki_flags & IOCB_WAITQ) {
- error = lock_page_async(page, iocb->ki_waitq);
- if (error)
- return error;
- } else {
- if (!trylock_page(page)) {
+ if (!trylock_page(page)) {
+ if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_NOIO))
+ return -EAGAIN;
+ if (!(iocb->ki_flags & IOCB_WAITQ)) {
put_and_wait_on_page_locked(page, TASK_KILLABLE);
return AOP_TRUNCATED_PAGE;
}
+ error = __lock_page_async(page, iocb->ki_waitq);
+ if (error)
+ return error;
}

if (!page->mapping)
@@ -2379,14 +2380,9 @@ static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter,
}

if (!PageUptodate(page)) {
- if ((iocb->ki_flags & IOCB_NOWAIT) ||
- ((iocb->ki_flags & IOCB_WAITQ) && pvec->nr > 1)) {
- put_page(page);
- pvec->nr--;
- err = -EAGAIN;
- goto err;
- }
-
+ if ((iocb->ki_flags & IOCB_WAITQ) &&
+ pagevec_count(pvec) > 1)
+ iocb->ki_flags |= IOCB_NOWAIT;
err = filemap_update_page(iocb, mapping, iter, page,
pg_pos, pg_count);
if (err) {
--
2.29.2
\
 
 \ /
  Last update: 2021-01-22 17:15    [W:0.099 / U:0.200 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site