@@ -1051,6 +1051,33 @@ static void __migrate_folio_extract(struct folio *dst,
1051
1051
dst -> private = NULL ;
1052
1052
}
1053
1053
1054
+ /* Restore the source folio to the original state upon failure */
1055
+ static void migrate_folio_undo_src (struct folio * src ,
1056
+ int page_was_mapped ,
1057
+ struct anon_vma * anon_vma ,
1058
+ struct list_head * ret )
1059
+ {
1060
+ if (page_was_mapped )
1061
+ remove_migration_ptes (src , src , false);
1062
+ /* Drop an anon_vma reference if we took one */
1063
+ if (anon_vma )
1064
+ put_anon_vma (anon_vma );
1065
+ folio_unlock (src );
1066
+ list_move_tail (& src -> lru , ret );
1067
+ }
1068
+
1069
+ /* Restore the destination folio to the original state upon failure */
1070
+ static void migrate_folio_undo_dst (struct folio * dst ,
1071
+ free_page_t put_new_page ,
1072
+ unsigned long private )
1073
+ {
1074
+ folio_unlock (dst );
1075
+ if (put_new_page )
1076
+ put_new_page (& dst -> page , private );
1077
+ else
1078
+ folio_put (dst );
1079
+ }
1080
+
1054
1081
/* Cleanup src folio upon migration success */
1055
1082
static void migrate_folio_done (struct folio * src ,
1056
1083
enum migrate_reason reason )
@@ -1069,8 +1096,8 @@ static void migrate_folio_done(struct folio *src,
1069
1096
folio_put (src );
1070
1097
}
1071
1098
1072
- static int __migrate_folio_unmap (struct folio * src , struct folio * dst ,
1073
- int force , enum migrate_mode mode )
1099
+ static int __migrate_folio_unmap (struct folio * src , struct folio * dst , int force ,
1100
+ bool avoid_force_lock , enum migrate_mode mode )
1074
1101
{
1075
1102
int rc = - EAGAIN ;
1076
1103
int page_was_mapped = 0 ;
@@ -1097,6 +1124,17 @@ static int __migrate_folio_unmap(struct folio *src, struct folio *dst,
1097
1124
if (current -> flags & PF_MEMALLOC )
1098
1125
goto out ;
1099
1126
1127
+ /*
1128
+ * We have locked some folios and are going to wait to lock
1129
+ * this folio. To avoid a potential deadlock, let's bail
1130
+ * out and not do that. The locked folios will be moved and
1131
+ * unlocked, then we can wait to lock this folio.
1132
+ */
1133
+ if (avoid_force_lock ) {
1134
+ rc = - EDEADLOCK ;
1135
+ goto out ;
1136
+ }
1137
+
1100
1138
folio_lock (src );
1101
1139
}
1102
1140
@@ -1205,10 +1243,20 @@ static int __migrate_folio_move(struct folio *src, struct folio *dst,
1205
1243
int page_was_mapped = 0 ;
1206
1244
struct anon_vma * anon_vma = NULL ;
1207
1245
bool is_lru = !__PageMovable (& src -> page );
1246
+ struct list_head * prev ;
1208
1247
1209
1248
__migrate_folio_extract (dst , & page_was_mapped , & anon_vma );
1249
+ prev = dst -> lru .prev ;
1250
+ list_del (& dst -> lru );
1210
1251
1211
1252
rc = move_to_new_folio (dst , src , mode );
1253
+
1254
+ if (rc == - EAGAIN ) {
1255
+ list_add (& dst -> lru , prev );
1256
+ __migrate_folio_record (dst , page_was_mapped , anon_vma );
1257
+ return rc ;
1258
+ }
1259
+
1212
1260
if (unlikely (!is_lru ))
1213
1261
goto out_unlock_both ;
1214
1262
@@ -1251,7 +1299,7 @@ static int __migrate_folio_move(struct folio *src, struct folio *dst,
1251
1299
/* Obtain the lock on page, remove all ptes. */
1252
1300
static int migrate_folio_unmap (new_page_t get_new_page , free_page_t put_new_page ,
1253
1301
unsigned long private , struct folio * src ,
1254
- struct folio * * dstp , int force ,
1302
+ struct folio * * dstp , int force , bool avoid_force_lock ,
1255
1303
enum migrate_mode mode , enum migrate_reason reason ,
1256
1304
struct list_head * ret )
1257
1305
{
@@ -1279,15 +1327,15 @@ static int migrate_folio_unmap(new_page_t get_new_page, free_page_t put_new_page
1279
1327
* dstp = dst ;
1280
1328
1281
1329
dst -> private = NULL ;
1282
- rc = __migrate_folio_unmap (src , dst , force , mode );
1330
+ rc = __migrate_folio_unmap (src , dst , force , avoid_force_lock , mode );
1283
1331
if (rc == MIGRATEPAGE_UNMAP )
1284
1332
return rc ;
1285
1333
1286
1334
/*
1287
1335
* A folio that has not been unmapped will be restored to
1288
1336
* right list unless we want to retry.
1289
1337
*/
1290
- if (rc != - EAGAIN )
1338
+ if (rc != - EAGAIN && rc != - EDEADLOCK )
1291
1339
list_move_tail (& src -> lru , ret );
1292
1340
1293
1341
if (put_new_page )
@@ -1326,9 +1374,8 @@ static int migrate_folio_move(free_page_t put_new_page, unsigned long private,
1326
1374
*/
1327
1375
if (rc == MIGRATEPAGE_SUCCESS ) {
1328
1376
migrate_folio_done (src , reason );
1329
- } else {
1330
- if (rc != - EAGAIN )
1331
- list_add_tail (& src -> lru , ret );
1377
+ } else if (rc != - EAGAIN ) {
1378
+ list_add_tail (& src -> lru , ret );
1332
1379
1333
1380
if (put_new_page )
1334
1381
put_new_page (& dst -> page , private );
@@ -1603,12 +1650,16 @@ static int migrate_hugetlbs(struct list_head *from, new_page_t get_new_page,
1603
1650
return nr_failed ;
1604
1651
}
1605
1652
1653
+ /*
1654
+ * migrate_pages_batch() first unmaps folios in the from list as many as
1655
+ * possible, then move the unmapped folios.
1656
+ */
1606
1657
static int migrate_pages_batch (struct list_head * from , new_page_t get_new_page ,
1607
1658
free_page_t put_new_page , unsigned long private ,
1608
1659
enum migrate_mode mode , int reason , struct list_head * ret_folios ,
1609
1660
struct migrate_pages_stats * stats )
1610
1661
{
1611
- int retry = 1 ;
1662
+ int retry ;
1612
1663
int large_retry = 1 ;
1613
1664
int thp_retry = 1 ;
1614
1665
int nr_failed = 0 ;
@@ -1617,13 +1668,19 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page,
1617
1668
int pass = 0 ;
1618
1669
bool is_large = false;
1619
1670
bool is_thp = false;
1620
- struct folio * folio , * folio2 , * dst = NULL ;
1621
- int rc , nr_pages ;
1671
+ struct folio * folio , * folio2 , * dst = NULL , * dst2 ;
1672
+ int rc , rc_saved , nr_pages ;
1622
1673
LIST_HEAD (split_folios );
1674
+ LIST_HEAD (unmap_folios );
1675
+ LIST_HEAD (dst_folios );
1623
1676
bool nosplit = (reason == MR_NUMA_MISPLACED );
1624
1677
bool no_split_folio_counting = false;
1678
+ bool avoid_force_lock ;
1625
1679
1626
- split_folio_migration :
1680
+ retry :
1681
+ rc_saved = 0 ;
1682
+ avoid_force_lock = false;
1683
+ retry = 1 ;
1627
1684
for (pass = 0 ;
1628
1685
pass < NR_MAX_MIGRATE_PAGES_RETRY && (retry || large_retry );
1629
1686
pass ++ ) {
@@ -1645,16 +1702,15 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page,
1645
1702
cond_resched ();
1646
1703
1647
1704
rc = migrate_folio_unmap (get_new_page , put_new_page , private ,
1648
- folio , & dst , pass > 2 , mode ,
1649
- reason , ret_folios );
1650
- if (rc == MIGRATEPAGE_UNMAP )
1651
- rc = migrate_folio_move (put_new_page , private ,
1652
- folio , dst , mode ,
1653
- reason , ret_folios );
1705
+ folio , & dst , pass > 2 , avoid_force_lock ,
1706
+ mode , reason , ret_folios );
1654
1707
/*
1655
1708
* The rules are:
1656
1709
* Success: folio will be freed
1710
+ * Unmap: folio will be put on unmap_folios list,
1711
+ * dst folio put on dst_folios list
1657
1712
* -EAGAIN: stay on the from list
1713
+ * -EDEADLOCK: stay on the from list
1658
1714
* -ENOMEM: stay on the from list
1659
1715
* -ENOSYS: stay on the from list
1660
1716
* Other errno: put on ret_folios list
@@ -1689,7 +1745,7 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page,
1689
1745
case - ENOMEM :
1690
1746
/*
1691
1747
* When memory is low, don't bother to try to migrate
1692
- * other folios, just exit.
1748
+ * other folios, move unmapped folios, then exit.
1693
1749
*/
1694
1750
if (is_large ) {
1695
1751
nr_large_failed ++ ;
@@ -1728,7 +1784,19 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page,
1728
1784
/* nr_failed isn't updated for not used */
1729
1785
nr_large_failed += large_retry ;
1730
1786
stats -> nr_thp_failed += thp_retry ;
1731
- goto out ;
1787
+ rc_saved = rc ;
1788
+ if (list_empty (& unmap_folios ))
1789
+ goto out ;
1790
+ else
1791
+ goto move ;
1792
+ case - EDEADLOCK :
1793
+ /*
1794
+ * The folio cannot be locked for potential deadlock.
1795
+ * Go move (and unlock) all locked folios. Then we can
1796
+ * try again.
1797
+ */
1798
+ rc_saved = rc ;
1799
+ goto move ;
1732
1800
case - EAGAIN :
1733
1801
if (is_large ) {
1734
1802
large_retry ++ ;
@@ -1742,6 +1810,15 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page,
1742
1810
stats -> nr_succeeded += nr_pages ;
1743
1811
stats -> nr_thp_succeeded += is_thp ;
1744
1812
break ;
1813
+ case MIGRATEPAGE_UNMAP :
1814
+ /*
1815
+ * We have locked some folios, don't force lock
1816
+ * to avoid deadlock.
1817
+ */
1818
+ avoid_force_lock = true;
1819
+ list_move_tail (& folio -> lru , & unmap_folios );
1820
+ list_add_tail (& dst -> lru , & dst_folios );
1821
+ break ;
1745
1822
default :
1746
1823
/*
1747
1824
* Permanent failure (-EBUSY, etc.):
@@ -1765,25 +1842,112 @@ static int migrate_pages_batch(struct list_head *from, new_page_t get_new_page,
1765
1842
nr_large_failed += large_retry ;
1766
1843
stats -> nr_thp_failed += thp_retry ;
1767
1844
stats -> nr_failed_pages += nr_retry_pages ;
1845
+ move :
1846
+ retry = 1 ;
1847
+ for (pass = 0 ;
1848
+ pass < NR_MAX_MIGRATE_PAGES_RETRY && (retry || large_retry );
1849
+ pass ++ ) {
1850
+ retry = 0 ;
1851
+ large_retry = 0 ;
1852
+ thp_retry = 0 ;
1853
+ nr_retry_pages = 0 ;
1854
+
1855
+ dst = list_first_entry (& dst_folios , struct folio , lru );
1856
+ dst2 = list_next_entry (dst , lru );
1857
+ list_for_each_entry_safe (folio , folio2 , & unmap_folios , lru ) {
1858
+ is_large = folio_test_large (folio );
1859
+ is_thp = is_large && folio_test_pmd_mappable (folio );
1860
+ nr_pages = folio_nr_pages (folio );
1861
+
1862
+ cond_resched ();
1863
+
1864
+ rc = migrate_folio_move (put_new_page , private ,
1865
+ folio , dst , mode ,
1866
+ reason , ret_folios );
1867
+ /*
1868
+ * The rules are:
1869
+ * Success: folio will be freed
1870
+ * -EAGAIN: stay on the unmap_folios list
1871
+ * Other errno: put on ret_folios list
1872
+ */
1873
+ switch (rc ) {
1874
+ case - EAGAIN :
1875
+ if (is_large ) {
1876
+ large_retry ++ ;
1877
+ thp_retry += is_thp ;
1878
+ } else if (!no_split_folio_counting ) {
1879
+ retry ++ ;
1880
+ }
1881
+ nr_retry_pages += nr_pages ;
1882
+ break ;
1883
+ case MIGRATEPAGE_SUCCESS :
1884
+ stats -> nr_succeeded += nr_pages ;
1885
+ stats -> nr_thp_succeeded += is_thp ;
1886
+ break ;
1887
+ default :
1888
+ if (is_large ) {
1889
+ nr_large_failed ++ ;
1890
+ stats -> nr_thp_failed += is_thp ;
1891
+ } else if (!no_split_folio_counting ) {
1892
+ nr_failed ++ ;
1893
+ }
1894
+
1895
+ stats -> nr_failed_pages += nr_pages ;
1896
+ break ;
1897
+ }
1898
+ dst = dst2 ;
1899
+ dst2 = list_next_entry (dst , lru );
1900
+ }
1901
+ }
1902
+ nr_failed += retry ;
1903
+ nr_large_failed += large_retry ;
1904
+ stats -> nr_thp_failed += thp_retry ;
1905
+ stats -> nr_failed_pages += nr_retry_pages ;
1906
+
1907
+ if (rc_saved )
1908
+ rc = rc_saved ;
1909
+ else
1910
+ rc = nr_failed + nr_large_failed ;
1911
+ out :
1912
+ /* Cleanup remaining folios */
1913
+ dst = list_first_entry (& dst_folios , struct folio , lru );
1914
+ dst2 = list_next_entry (dst , lru );
1915
+ list_for_each_entry_safe (folio , folio2 , & unmap_folios , lru ) {
1916
+ int page_was_mapped = 0 ;
1917
+ struct anon_vma * anon_vma = NULL ;
1918
+
1919
+ __migrate_folio_extract (dst , & page_was_mapped , & anon_vma );
1920
+ migrate_folio_undo_src (folio , page_was_mapped , anon_vma ,
1921
+ ret_folios );
1922
+ list_del (& dst -> lru );
1923
+ migrate_folio_undo_dst (dst , put_new_page , private );
1924
+ dst = dst2 ;
1925
+ dst2 = list_next_entry (dst , lru );
1926
+ }
1927
+
1768
1928
/*
1769
1929
* Try to migrate split folios of fail-to-migrate large folios, no
1770
1930
* nr_failed counting in this round, since all split folios of a
1771
1931
* large folio is counted as 1 failure in the first round.
1772
1932
*/
1773
- if (!list_empty (& split_folios )) {
1933
+ if (rc >= 0 && !list_empty (& split_folios )) {
1774
1934
/*
1775
1935
* Move non-migrated folios (after NR_MAX_MIGRATE_PAGES_RETRY
1776
1936
* retries) to ret_folios to avoid migrating them again.
1777
1937
*/
1778
1938
list_splice_init (from , ret_folios );
1779
1939
list_splice_init (& split_folios , from );
1780
1940
no_split_folio_counting = true;
1781
- retry = 1 ;
1782
- goto split_folio_migration ;
1941
+ goto retry ;
1783
1942
}
1784
1943
1785
- rc = nr_failed + nr_large_failed ;
1786
- out :
1944
+ /*
1945
+ * We have unlocked all locked folios, so we can force lock now, let's
1946
+ * try again.
1947
+ */
1948
+ if (rc == - EDEADLOCK )
1949
+ goto retry ;
1950
+
1787
1951
return rc ;
1788
1952
}
1789
1953
0 commit comments