@@ -1329,10 +1329,10 @@ static void collapse_shmem(struct mm_struct *mm,
1329
1329
goto out ;
1330
1330
}
1331
1331
1332
+ __SetPageLocked (new_page );
1333
+ __SetPageSwapBacked (new_page );
1332
1334
new_page -> index = start ;
1333
1335
new_page -> mapping = mapping ;
1334
- __SetPageSwapBacked (new_page );
1335
- __SetPageLocked (new_page );
1336
1336
BUG_ON (!page_ref_freeze (new_page , 1 ));
1337
1337
1338
1338
/*
@@ -1366,13 +1366,13 @@ static void collapse_shmem(struct mm_struct *mm,
1366
1366
if (index == start ) {
1367
1367
if (!xas_next_entry (& xas , end - 1 )) {
1368
1368
result = SCAN_TRUNCATED ;
1369
- break ;
1369
+ goto xa_locked ;
1370
1370
}
1371
1371
xas_set (& xas , index );
1372
1372
}
1373
1373
if (!shmem_charge (mapping -> host , 1 )) {
1374
1374
result = SCAN_FAIL ;
1375
- break ;
1375
+ goto xa_locked ;
1376
1376
}
1377
1377
xas_store (& xas , new_page + (index % HPAGE_PMD_NR ));
1378
1378
nr_none ++ ;
@@ -1387,13 +1387,12 @@ static void collapse_shmem(struct mm_struct *mm,
1387
1387
result = SCAN_FAIL ;
1388
1388
goto xa_unlocked ;
1389
1389
}
1390
- xas_lock_irq (& xas );
1391
- xas_set (& xas , index );
1392
1390
} else if (trylock_page (page )) {
1393
1391
get_page (page );
1392
+ xas_unlock_irq (& xas );
1394
1393
} else {
1395
1394
result = SCAN_PAGE_LOCK ;
1396
- break ;
1395
+ goto xa_locked ;
1397
1396
}
1398
1397
1399
1398
/*
@@ -1408,11 +1407,10 @@ static void collapse_shmem(struct mm_struct *mm,
1408
1407
result = SCAN_TRUNCATED ;
1409
1408
goto out_unlock ;
1410
1409
}
1411
- xas_unlock_irq (& xas );
1412
1410
1413
1411
if (isolate_lru_page (page )) {
1414
1412
result = SCAN_DEL_PAGE_LRU ;
1415
- goto out_isolate_failed ;
1413
+ goto out_unlock ;
1416
1414
}
1417
1415
1418
1416
if (page_mapped (page ))
@@ -1432,7 +1430,9 @@ static void collapse_shmem(struct mm_struct *mm,
1432
1430
*/
1433
1431
if (!page_ref_freeze (page , 3 )) {
1434
1432
result = SCAN_PAGE_COUNT ;
1435
- goto out_lru ;
1433
+ xas_unlock_irq (& xas );
1434
+ putback_lru_page (page );
1435
+ goto out_unlock ;
1436
1436
}
1437
1437
1438
1438
/*
@@ -1444,24 +1444,26 @@ static void collapse_shmem(struct mm_struct *mm,
1444
1444
/* Finally, replace with the new page. */
1445
1445
xas_store (& xas , new_page + (index % HPAGE_PMD_NR ));
1446
1446
continue ;
1447
- out_lru :
1448
- xas_unlock_irq (& xas );
1449
- putback_lru_page (page );
1450
- out_isolate_failed :
1451
- unlock_page (page );
1452
- put_page (page );
1453
- goto xa_unlocked ;
1454
1447
out_unlock :
1455
1448
unlock_page (page );
1456
1449
put_page (page );
1457
- break ;
1450
+ goto xa_unlocked ;
1458
1451
}
1459
- xas_unlock_irq (& xas );
1460
1452
1453
+ __inc_node_page_state (new_page , NR_SHMEM_THPS );
1454
+ if (nr_none ) {
1455
+ struct zone * zone = page_zone (new_page );
1456
+
1457
+ __mod_node_page_state (zone -> zone_pgdat , NR_FILE_PAGES , nr_none );
1458
+ __mod_node_page_state (zone -> zone_pgdat , NR_SHMEM , nr_none );
1459
+ }
1460
+
1461
+ xa_locked :
1462
+ xas_unlock_irq (& xas );
1461
1463
xa_unlocked :
1464
+
1462
1465
if (result == SCAN_SUCCEED ) {
1463
1466
struct page * page , * tmp ;
1464
- struct zone * zone = page_zone (new_page );
1465
1467
1466
1468
/*
1467
1469
* Replacing old pages with new one has succeeded, now we
@@ -1476,11 +1478,11 @@ static void collapse_shmem(struct mm_struct *mm,
1476
1478
copy_highpage (new_page + (page -> index % HPAGE_PMD_NR ),
1477
1479
page );
1478
1480
list_del (& page -> lru );
1479
- unlock_page (page );
1480
- page_ref_unfreeze (page , 1 );
1481
1481
page -> mapping = NULL ;
1482
+ page_ref_unfreeze (page , 1 );
1482
1483
ClearPageActive (page );
1483
1484
ClearPageUnevictable (page );
1485
+ unlock_page (page );
1484
1486
put_page (page );
1485
1487
index ++ ;
1486
1488
}
@@ -1489,28 +1491,17 @@ static void collapse_shmem(struct mm_struct *mm,
1489
1491
index ++ ;
1490
1492
}
1491
1493
1492
- local_irq_disable ();
1493
- __inc_node_page_state (new_page , NR_SHMEM_THPS );
1494
- if (nr_none ) {
1495
- __mod_node_page_state (zone -> zone_pgdat , NR_FILE_PAGES , nr_none );
1496
- __mod_node_page_state (zone -> zone_pgdat , NR_SHMEM , nr_none );
1497
- }
1498
- local_irq_enable ();
1499
-
1500
- /*
1501
- * Remove pte page tables, so we can re-fault
1502
- * the page as huge.
1503
- */
1504
- retract_page_tables (mapping , start );
1505
-
1506
1494
/* Everything is ready, let's unfreeze the new_page */
1507
- set_page_dirty (new_page );
1508
1495
SetPageUptodate (new_page );
1509
1496
page_ref_unfreeze (new_page , HPAGE_PMD_NR );
1497
+ set_page_dirty (new_page );
1510
1498
mem_cgroup_commit_charge (new_page , memcg , false, true);
1511
1499
lru_cache_add_anon (new_page );
1512
- unlock_page (new_page );
1513
1500
1501
+ /*
1502
+ * Remove pte page tables, so we can re-fault the page as huge.
1503
+ */
1504
+ retract_page_tables (mapping , start );
1514
1505
* hpage = NULL ;
1515
1506
1516
1507
khugepaged_pages_collapsed ++ ;
@@ -1543,8 +1534,8 @@ static void collapse_shmem(struct mm_struct *mm,
1543
1534
xas_store (& xas , page );
1544
1535
xas_pause (& xas );
1545
1536
xas_unlock_irq (& xas );
1546
- putback_lru_page (page );
1547
1537
unlock_page (page );
1538
+ putback_lru_page (page );
1548
1539
xas_lock_irq (& xas );
1549
1540
}
1550
1541
VM_BUG_ON (nr_none );
@@ -1553,9 +1544,10 @@ static void collapse_shmem(struct mm_struct *mm,
1553
1544
/* Unfreeze new_page, caller would take care about freeing it */
1554
1545
page_ref_unfreeze (new_page , 1 );
1555
1546
mem_cgroup_cancel_charge (new_page , memcg , true);
1556
- unlock_page (new_page );
1557
1547
new_page -> mapping = NULL ;
1558
1548
}
1549
+
1550
+ unlock_page (new_page );
1559
1551
out :
1560
1552
VM_BUG_ON (!list_empty (& pagelist ));
1561
1553
/* TODO: tracepoints */
0 commit comments