@@ -1527,7 +1527,8 @@ static int get_any_page(struct page *page, unsigned long pfn, int flags)
1527
1527
{
1528
1528
int ret = __get_any_page (page , pfn , flags );
1529
1529
1530
- if (ret == 1 && !PageHuge (page ) && !PageLRU (page )) {
1530
+ if (ret == 1 && !PageHuge (page ) &&
1531
+ !PageLRU (page ) && !__PageMovable (page )) {
1531
1532
/*
1532
1533
* Try to free it.
1533
1534
*/
@@ -1649,26 +1650,31 @@ static int __soft_offline_page(struct page *page, int flags)
1649
1650
* Try to migrate to a new page instead. migrate.c
1650
1651
* handles a large number of cases for us.
1651
1652
*/
1652
- ret = isolate_lru_page (page );
1653
+ if (PageLRU (page ))
1654
+ ret = isolate_lru_page (page );
1655
+ else
1656
+ ret = isolate_movable_page (page , ISOLATE_UNEVICTABLE );
1653
1657
/*
1654
1658
* Drop page reference which is came from get_any_page()
1655
1659
* successful isolate_lru_page() already took another one.
1656
1660
*/
1657
1661
put_hwpoison_page (page );
1658
1662
if (!ret ) {
1659
1663
LIST_HEAD (pagelist );
1660
- inc_node_page_state (page , NR_ISOLATED_ANON +
1661
- page_is_file_cache (page ));
1664
+ /*
1665
+ * After isolated lru page, the PageLRU will be cleared,
1666
+ * so use !__PageMovable instead for LRU page's mapping
1667
+ * cannot have PAGE_MAPPING_MOVABLE.
1668
+ */
1669
+ if (!__PageMovable (page ))
1670
+ inc_node_page_state (page , NR_ISOLATED_ANON +
1671
+ page_is_file_cache (page ));
1662
1672
list_add (& page -> lru , & pagelist );
1663
1673
ret = migrate_pages (& pagelist , new_page , NULL , MPOL_MF_MOVE_ALL ,
1664
1674
MIGRATE_SYNC , MR_MEMORY_FAILURE );
1665
1675
if (ret ) {
1666
- if (!list_empty (& pagelist )) {
1667
- list_del (& page -> lru );
1668
- dec_node_page_state (page , NR_ISOLATED_ANON +
1669
- page_is_file_cache (page ));
1670
- putback_lru_page (page );
1671
- }
1676
+ if (!list_empty (& pagelist ))
1677
+ putback_movable_pages (& pagelist );
1672
1678
1673
1679
pr_info ("soft offline: %#lx: migration failed %d, type %lx\n" ,
1674
1680
pfn , ret , page -> flags );
0 commit comments