diff options
author | Matthew Wilcox <willy@infradead.org> | 2017-12-04 15:06:23 -0500 |
---|---|---|
committer | Matthew Wilcox <willy@infradead.org> | 2018-10-21 10:46:38 -0400 |
commit | 85b392dbace77bf91050e6e07f3dd0f262e4babf (patch) | |
tree | 3bd63328b8e6d495febe03dd73018fc156e8f0a0 /mm/khugepaged.c | |
parent | 77da9389b9d5f07d54fda092d1ab56002ec0019a (diff) |
mm: Convert khugepaged_scan_shmem to XArray
Slightly shorter and easier to read code.
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Diffstat (limited to 'mm/khugepaged.c')
-rw-r--r-- | mm/khugepaged.c | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 9610e8cba545..c13625c1ad5e 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c | |||
@@ -1542,8 +1542,7 @@ static void khugepaged_scan_shmem(struct mm_struct *mm, | |||
1542 | pgoff_t start, struct page **hpage) | 1542 | pgoff_t start, struct page **hpage) |
1543 | { | 1543 | { |
1544 | struct page *page = NULL; | 1544 | struct page *page = NULL; |
1545 | struct radix_tree_iter iter; | 1545 | XA_STATE(xas, &mapping->i_pages, start); |
1546 | void **slot; | ||
1547 | int present, swap; | 1546 | int present, swap; |
1548 | int node = NUMA_NO_NODE; | 1547 | int node = NUMA_NO_NODE; |
1549 | int result = SCAN_SUCCEED; | 1548 | int result = SCAN_SUCCEED; |
@@ -1552,17 +1551,11 @@ static void khugepaged_scan_shmem(struct mm_struct *mm, | |||
1552 | swap = 0; | 1551 | swap = 0; |
1553 | memset(khugepaged_node_load, 0, sizeof(khugepaged_node_load)); | 1552 | memset(khugepaged_node_load, 0, sizeof(khugepaged_node_load)); |
1554 | rcu_read_lock(); | 1553 | rcu_read_lock(); |
1555 | radix_tree_for_each_slot(slot, &mapping->i_pages, &iter, start) { | 1554 | xas_for_each(&xas, page, start + HPAGE_PMD_NR - 1) { |
1556 | if (iter.index >= start + HPAGE_PMD_NR) | 1555 | if (xas_retry(&xas, page)) |
1557 | break; | ||
1558 | |||
1559 | page = radix_tree_deref_slot(slot); | ||
1560 | if (radix_tree_deref_retry(page)) { | ||
1561 | slot = radix_tree_iter_retry(&iter); | ||
1562 | continue; | 1556 | continue; |
1563 | } | ||
1564 | 1557 | ||
1565 | if (radix_tree_exception(page)) { | 1558 | if (xa_is_value(page)) { |
1566 | if (++swap > khugepaged_max_ptes_swap) { | 1559 | if (++swap > khugepaged_max_ptes_swap) { |
1567 | result = SCAN_EXCEED_SWAP_PTE; | 1560 | result = SCAN_EXCEED_SWAP_PTE; |
1568 | break; | 1561 | break; |
@@ -1601,7 +1594,7 @@ static void khugepaged_scan_shmem(struct mm_struct *mm, | |||
1601 | present++; | 1594 | present++; |
1602 | 1595 | ||
1603 | if (need_resched()) { | 1596 | if (need_resched()) { |
1604 | slot = radix_tree_iter_resume(slot, &iter); | 1597 | xas_pause(&xas); |
1605 | cond_resched_rcu(); | 1598 | cond_resched_rcu(); |
1606 | } | 1599 | } |
1607 | } | 1600 | } |