From: Matthew Wilcox <willy@infradead.org>
To: Doug Anderson <dianders@chromium.org>
Cc: Mel Gorman <mgorman@techsingularity.net>,
Hillf Danton <hdanton@sina.com>,
Andrew Morton <akpm@linux-foundation.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
Yu Zhao <yuzhao@google.com>
Subject: Re: [PATCH v2 1/4] mm/filemap: Add folio_lock_timeout()
Date: Wed, 26 Apr 2023 22:26:55 +0100 [thread overview]
Message-ID: <ZEmXH1FpOgT/u6/j@casper.infradead.org> (raw)
In-Reply-To: <CAD=FV=UyLf9GLz7xJyzhW2V_JycwUppwGfe7th17f_KXmMGOqw@mail.gmail.com>
On Wed, Apr 26, 2023 at 01:46:58PM -0700, Doug Anderson wrote:
> On Wed, Apr 26, 2023 at 8:14 AM Matthew Wilcox <willy@infradead.org> wrote:
> >
> > I'm not generally a fan of lock-with-timeout approaches. I think the
> > rationale for this one makes sense, but we're going to see some people
> > try to use this for situations where it doesn't make sense.
>
> Although it won't completely prevent the issue, I could add a comment
People don't read comments.
> > Hm. If the problem is that we want to wait for the lock unless the
> > lock is being held for I/O, we can actually tell that in the caller.
> >
> > if (folio_test_uptodate(folio))
> > folio_lock(folio);
> > else
> > folio_trylock(folio);
> >
> > (the folio lock isn't held for writeback, just taken and released;
> > if the folio is uptodate, the folio lock should only be taken for a
> > short time; if it's !uptodate then it's probably being read)
>
> The current place in patch #3 where I'm using folio_lock_timeout()
> only calls it if a folio_trylock() already failed [2]. So I guess the
> idea would be that if the trylock failed and folio_test_uptodate()
> returns 0 then we immediately fail, otherwise we call the unbounded
> folio_trylock()?
Looking at the actual code, here's what I'd do:
+++ b/mm/migrate.c
@@ -1156,6 +1156,14 @@ static int migrate_folio_unmap(new_page_t get_new_page, free_page_t put_new_page
if (current->flags & PF_MEMALLOC)
goto out;
+ /*
+ * In "light" mode, we can wait for transient locks (eg
+ * inserting a page into the page table), but it's not
+ * worth waiting for I/O.
+ */
+ if (mode == MIGRATE_SYNC_LIGHT && !folio_test_uptodate(folio))
+ goto out;
+
folio_lock(src);
}
locked = true;
> I put some traces in and ran my test and it turns out that in every
> case (except one) where the tre initial folio_trylock() failed I saw
> folio_test_uptodate() return 0. Assuming my test case is typical, I
> think that means that coding it with folio_test_uptodate() is roughly
> the same as just never waiting at all for the folio lock in the
> SYNC_LIGHT case. In the original discussion of my v1 patch people
> didn't like that idea. ...so I think that for now I'm going to keep it
> with the timeout flow.
I think that means that your specific test is generally going to
exercise the case where the lock is held because we're waiting for I/O.
That's exactly what you set it up to produce, after all! But it won't
affect the cases where the folio lock is being held for other reasons,
which your testcase is incredibly unlikely to produce.
next prev parent reply other threads:[~2023-04-26 21:27 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-21 22:12 [PATCH v2 0/4] migrate: Avoid unbounded blocks in MIGRATE_SYNC_LIGHT Douglas Anderson
2023-04-21 22:12 ` [PATCH v2 1/4] mm/filemap: Add folio_lock_timeout() Douglas Anderson
2023-04-22 5:18 ` Hillf Danton
[not found] ` <20230423081203.1812-1-hdanton@sina.com>
2023-04-23 8:35 ` Gao Xiang
2023-04-23 9:49 ` Hillf Danton
2023-04-23 10:45 ` Gao Xiang
2023-04-24 16:56 ` Doug Anderson
2023-04-25 1:09 ` Hillf Danton
2023-04-25 14:19 ` Doug Anderson
2023-04-26 4:42 ` Hillf Danton
2023-04-26 4:55 ` Doug Anderson
2023-04-26 10:09 ` Mel Gorman
2023-04-26 15:14 ` Matthew Wilcox
2023-04-26 20:46 ` Doug Anderson
2023-04-26 21:26 ` Matthew Wilcox [this message]
2023-04-26 21:39 ` Doug Anderson
2023-04-27 2:16 ` Matthew Wilcox
2023-04-27 9:48 ` Mel Gorman
2023-04-28 8:17 ` Hillf Danton
2023-04-26 15:24 ` Linus Torvalds
2023-04-23 7:50 ` Huang, Ying
2023-04-24 8:22 ` Mel Gorman
2023-04-24 16:22 ` Doug Anderson
2023-04-25 8:00 ` Mel Gorman
2023-04-21 22:12 ` [PATCH v2 2/4] buffer: Add lock_buffer_timeout() Douglas Anderson
2023-04-23 8:47 ` Huang, Ying
2023-04-21 22:12 ` [PATCH v2 3/4] migrate_pages: Don't wait forever locking pages in MIGRATE_SYNC_LIGHT Douglas Anderson
2023-04-23 7:59 ` Huang, Ying
2023-04-24 9:38 ` Mel Gorman
2023-04-21 22:12 ` [PATCH v2 4/4] migrate_pages: Don't wait forever locking buffers " Douglas Anderson
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=ZEmXH1FpOgT/u6/j@casper.infradead.org \
--to=willy@infradead.org \
--cc=akpm@linux-foundation.org \
--cc=brauner@kernel.org \
--cc=dianders@chromium.org \
--cc=hdanton@sina.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mgorman@techsingularity.net \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
--cc=yuzhao@google.com \
/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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox