@@ -1416,6 +1416,19 @@ static int khugepaged_add_pte_mapped_thp(struct mm_struct *mm,
1416
1416
return 0 ;
1417
1417
}
1418
1418
1419
+ static void collapse_and_free_pmd (struct mm_struct * mm , struct vm_area_struct * vma ,
1420
+ unsigned long addr , pmd_t * pmdp )
1421
+ {
1422
+ spinlock_t * ptl ;
1423
+ pmd_t pmd ;
1424
+
1425
+ ptl = pmd_lock (vma -> vm_mm , pmdp );
1426
+ pmd = pmdp_collapse_flush (vma , addr , pmdp );
1427
+ spin_unlock (ptl );
1428
+ mm_dec_nr_ptes (mm );
1429
+ pte_free (mm , pmd_pgtable (pmd ));
1430
+ }
1431
+
1419
1432
/**
1420
1433
* collapse_pte_mapped_thp - Try to collapse a pte-mapped THP for mm at
1421
1434
* address haddr.
@@ -1433,7 +1446,7 @@ void collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr)
1433
1446
struct vm_area_struct * vma = find_vma (mm , haddr );
1434
1447
struct page * hpage ;
1435
1448
pte_t * start_pte , * pte ;
1436
- pmd_t * pmd , _pmd ;
1449
+ pmd_t * pmd ;
1437
1450
spinlock_t * ptl ;
1438
1451
int count = 0 ;
1439
1452
int i ;
@@ -1509,12 +1522,7 @@ void collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr)
1509
1522
}
1510
1523
1511
1524
/* step 4: collapse pmd */
1512
- ptl = pmd_lock (vma -> vm_mm , pmd );
1513
- _pmd = pmdp_collapse_flush (vma , haddr , pmd );
1514
- spin_unlock (ptl );
1515
- mm_dec_nr_ptes (mm );
1516
- pte_free (mm , pmd_pgtable (_pmd ));
1517
-
1525
+ collapse_and_free_pmd (mm , vma , haddr , pmd );
1518
1526
drop_hpage :
1519
1527
unlock_page (hpage );
1520
1528
put_page (hpage );
@@ -1552,7 +1560,7 @@ static void retract_page_tables(struct address_space *mapping, pgoff_t pgoff)
1552
1560
struct vm_area_struct * vma ;
1553
1561
struct mm_struct * mm ;
1554
1562
unsigned long addr ;
1555
- pmd_t * pmd , _pmd ;
1563
+ pmd_t * pmd ;
1556
1564
1557
1565
i_mmap_lock_write (mapping );
1558
1566
vma_interval_tree_foreach (vma , & mapping -> i_mmap , pgoff , pgoff ) {
@@ -1591,14 +1599,8 @@ static void retract_page_tables(struct address_space *mapping, pgoff_t pgoff)
1591
1599
* reverse order. Trylock is a way to avoid deadlock.
1592
1600
*/
1593
1601
if (mmap_write_trylock (mm )) {
1594
- if (!khugepaged_test_exit (mm )) {
1595
- spinlock_t * ptl = pmd_lock (mm , pmd );
1596
- /* assume page table is clear */
1597
- _pmd = pmdp_collapse_flush (vma , addr , pmd );
1598
- spin_unlock (ptl );
1599
- mm_dec_nr_ptes (mm );
1600
- pte_free (mm , pmd_pgtable (_pmd ));
1601
- }
1602
+ if (!khugepaged_test_exit (mm ))
1603
+ collapse_and_free_pmd (mm , vma , addr , pmd );
1602
1604
mmap_write_unlock (mm );
1603
1605
} else {
1604
1606
/* Try again later */
0 commit comments