On 2/13/20 6:55 PM, Andrew Morton wrote:
On Fri, 14 Feb 2020 08:29:45 +0800 Yang Shi <yang.shi@xxxxxxxxxxxxxxxxx> wrote:
Currently migration code doesn't migrate PG_readahead flag.
Theoretically this would incur slight performance loss as the
application might have to ramp its readahead back up again. Even though
such problem happens, it might be hidden by something else since
migration is typically triggered by compaction and NUMA balancing, any
of which should be more noticeable.
Migrate the flag after end_page_writeback() since it may clear
PG_reclaim flag, which is the same bit as PG_readahead, for the new
page.
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -647,6 +647,14 @@ void migrate_page_states(struct page *newpage, struct page *page)
if (PageWriteback(newpage))
end_page_writeback(newpage);
+ /*
+ * PG_readahead share the same bit with PG_reclaim, the above
+ * end_page_writeback() may clear PG_readahead mistakenly, so set
+ * the bit after that.
+ */
+ if (PageReadahead(page))
+ SetPageReadahead(newpage);
+
copy_page_owner(page, newpage);
Why not
The newpage may not have writeback set, migrating readahead flag should
not depend on it.
if (PageWriteback(newpage)) {
end_page_writeback(newpage);
/*
* PG_readahead share the same bit with PG_reclaim, the above
* end_page_writeback() may clear PG_readahead mistakenly, so
* set the bit after that.
*/
if (PageReadahead(page))
SetPageReadahead(newpage);
}
?