From: Jan Kara <jack@suse.cz> To: linux-mm@kvack.org Cc: mhocko@suse.cz, mgorman@suse.de, Jan Kara <jack@suse.cz> Subject: [PATCH 2/6] mm: migrate: Lock buffers before migrate_page_move_mapping() Date: Tue, 11 Dec 2018 18:21:39 +0100 [thread overview] Message-ID: <20181211172143.7358-3-jack@suse.cz> (raw) In-Reply-To: <20181211172143.7358-1-jack@suse.cz> Lock buffers before calling into migrate_page_move_mapping() so that that function doesn't have to know about buffers (which is somewhat unexpected anyway) and all the buffer head logic is in buffer_migrate_page(). Signed-off-by: Jan Kara <jack@suse.cz> --- mm/migrate.c | 39 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/mm/migrate.c b/mm/migrate.c index 789c7bc90a0c..d58a8ecf275e 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -490,20 +490,6 @@ int migrate_page_move_mapping(struct address_space *mapping, return -EAGAIN; } - /* - * In the async migration case of moving a page with buffers, lock the - * buffers using trylock before the mapping is moved. If the mapping - * was moved, we later failed to lock the buffers and could not move - * the mapping back due to an elevated page count, we would have to - * block waiting on other references to be dropped. - */ - if (mode == MIGRATE_ASYNC && head && - !buffer_migrate_lock_buffers(head, mode)) { - page_ref_unfreeze(page, expected_count); - xas_unlock_irq(&xas); - return -EAGAIN; - } - /* * Now we know that no one else is looking at the page: * no turning back from here. @@ -779,24 +765,23 @@ int buffer_migrate_page(struct address_space *mapping, { struct buffer_head *bh, *head; int rc; + int expected_count; if (!page_has_buffers(page)) return migrate_page(mapping, newpage, page, mode); - head = page_buffers(page); + /* Check whether page does not have extra refs before we do more work */ + expected_count = expected_page_refs(page); + if (page_count(page) != expected_count) + return -EAGAIN; - rc = migrate_page_move_mapping(mapping, newpage, page, head, mode, 0); + head = page_buffers(page); + if (!buffer_migrate_lock_buffers(head, mode)) + return -EAGAIN; + rc = migrate_page_move_mapping(mapping, newpage, page, NULL, mode, 0); if (rc != MIGRATEPAGE_SUCCESS) - return rc; - - /* - * In the async case, migrate_page_move_mapping locked the buffers - * with an IRQ-safe spinlock held. In the sync case, the buffers - * need to be locked now - */ - if (mode != MIGRATE_ASYNC) - BUG_ON(!buffer_migrate_lock_buffers(head, mode)); + goto unlock_buffers; ClearPagePrivate(page); set_page_private(newpage, page_private(page)); @@ -818,6 +803,8 @@ int buffer_migrate_page(struct address_space *mapping, else migrate_page_states(newpage, page); + rc = MIGRATEPAGE_SUCCESS; +unlock_buffers: bh = head; do { unlock_buffer(bh); @@ -826,7 +813,7 @@ int buffer_migrate_page(struct address_space *mapping, } while (bh != head); - return MIGRATEPAGE_SUCCESS; + return rc; } EXPORT_SYMBOL(buffer_migrate_page); #endif -- 2.16.4
next prev parent reply other threads:[~2018-12-11 17:21 UTC|newest] Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-12-11 17:21 mm: migrate: Fix page migration stalls for blkdev pages Jan Kara 2018-12-11 17:21 ` [PATCH 1/6] mm: migration: Factor out code to compute expected number of page references Jan Kara 2018-12-13 13:05 ` Mel Gorman 2018-12-14 15:10 ` Mel Gorman 2018-12-14 15:53 ` Jan Kara 2018-12-14 16:24 ` Mel Gorman 2018-12-17 13:11 ` Jan Kara 2018-12-11 17:21 ` Jan Kara [this message] 2018-12-13 14:19 ` [PATCH 2/6] mm: migrate: Lock buffers before migrate_page_move_mapping() Mel Gorman 2018-12-11 17:21 ` [PATCH 3/6] mm: migrate: Move migrate_page_lock_buffers() Jan Kara 2018-12-13 14:57 ` Mel Gorman 2018-12-11 17:21 ` [PATCH 4/6] mm: migrate: Provide buffer_migrate_page_norefs() Jan Kara 2018-12-13 15:34 ` Mel Gorman 2018-12-14 4:53 ` Andrew Morton 2018-12-14 9:26 ` Jan Kara 2018-12-11 17:21 ` [PATCH 5/6] blkdev: Avoid migration stalls for blkdev pages Jan Kara 2018-12-13 15:35 ` Mel Gorman 2018-12-11 17:21 ` [PATCH 6/6] mm: migrate: Drop unused argument of migrate_page_move_mapping() Jan Kara 2018-12-13 15:35 ` Mel Gorman 2018-12-13 16:17 ` Jan Kara 2018-12-17 13:17 ` 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=20181211172143.7358-3-jack@suse.cz \ --to=jack@suse.cz \ --cc=linux-mm@kvack.org \ --cc=mgorman@suse.de \ --cc=mhocko@suse.cz \ --subject='Re: [PATCH 2/6] mm: migrate: Lock buffers before migrate_page_move_mapping()' \ /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 an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.