Lines Matching refs:stable_node
402 static inline void free_stable_node(struct ksm_stable_node *stable_node) in free_stable_node() argument
404 VM_BUG_ON(stable_node->rmap_hlist_len && in free_stable_node()
405 !is_stable_node_chain(stable_node)); in free_stable_node()
406 kmem_cache_free(stable_node_cache, stable_node); in free_stable_node()
600 static void remove_node_from_stable_tree(struct ksm_stable_node *stable_node) in remove_node_from_stable_tree() argument
605 BUG_ON(stable_node->rmap_hlist_len < 0); in remove_node_from_stable_tree()
607 hlist_for_each_entry(rmap_item, &stable_node->hlist, hlist) { in remove_node_from_stable_tree()
615 VM_BUG_ON(stable_node->rmap_hlist_len <= 0); in remove_node_from_stable_tree()
616 stable_node->rmap_hlist_len--; in remove_node_from_stable_tree()
632 if (stable_node->head == &migrate_nodes) in remove_node_from_stable_tree()
633 list_del(&stable_node->list); in remove_node_from_stable_tree()
635 stable_node_dup_del(stable_node); in remove_node_from_stable_tree()
636 free_stable_node(stable_node); in remove_node_from_stable_tree()
664 static struct page *get_ksm_page(struct ksm_stable_node *stable_node, in get_ksm_page() argument
671 expected_mapping = (void *)((unsigned long)stable_node | in get_ksm_page()
674 kpfn = READ_ONCE(stable_node->kpfn); /* Address dependency. */ in get_ksm_page()
733 if (READ_ONCE(stable_node->kpfn) != kpfn) in get_ksm_page()
735 remove_node_from_stable_tree(stable_node); in get_ksm_page()
746 struct ksm_stable_node *stable_node; in remove_rmap_item_from_tree() local
749 stable_node = rmap_item->head; in remove_rmap_item_from_tree()
750 page = get_ksm_page(stable_node, GET_KSM_PAGE_LOCK); in remove_rmap_item_from_tree()
758 if (!hlist_empty(&stable_node->hlist)) in remove_rmap_item_from_tree()
765 VM_BUG_ON(stable_node->rmap_hlist_len <= 0); in remove_rmap_item_from_tree()
766 stable_node->rmap_hlist_len--; in remove_rmap_item_from_tree()
844 struct ksm_stable_node *stable_node) in set_page_stable_node() argument
847 page->mapping = (void *)((unsigned long)stable_node | PAGE_MAPPING_KSM); in set_page_stable_node()
854 static int remove_stable_node(struct ksm_stable_node *stable_node) in remove_stable_node() argument
859 page = get_ksm_page(stable_node, GET_KSM_PAGE_LOCK); in remove_stable_node()
883 remove_node_from_stable_tree(stable_node); in remove_stable_node()
892 static int remove_stable_node_chain(struct ksm_stable_node *stable_node, in remove_stable_node_chain() argument
898 if (!is_stable_node_chain(stable_node)) { in remove_stable_node_chain()
899 VM_BUG_ON(is_stable_node_dup(stable_node)); in remove_stable_node_chain()
900 if (remove_stable_node(stable_node)) in remove_stable_node_chain()
907 &stable_node->hlist, hlist_dup) { in remove_stable_node_chain()
912 BUG_ON(!hlist_empty(&stable_node->hlist)); in remove_stable_node_chain()
913 free_stable_node_chain(stable_node, root); in remove_stable_node_chain()
919 struct ksm_stable_node *stable_node, *next; in remove_all_stable_nodes() local
925 stable_node = rb_entry(root_stable_tree[nid].rb_node, in remove_all_stable_nodes()
927 if (remove_stable_node_chain(stable_node, in remove_all_stable_nodes()
935 list_for_each_entry_safe(stable_node, next, &migrate_nodes, list) { in remove_all_stable_nodes()
936 if (remove_stable_node(stable_node)) in remove_all_stable_nodes()
1329 bool __is_page_sharing_candidate(struct ksm_stable_node *stable_node, int offset) in __is_page_sharing_candidate() argument
1331 VM_BUG_ON(stable_node->rmap_hlist_len < 0); in __is_page_sharing_candidate()
1338 return stable_node->rmap_hlist_len && in __is_page_sharing_candidate()
1339 stable_node->rmap_hlist_len + offset < ksm_max_page_sharing; in __is_page_sharing_candidate()
1343 bool is_page_sharing_candidate(struct ksm_stable_node *stable_node) in is_page_sharing_candidate() argument
1345 return __is_page_sharing_candidate(stable_node, 0); in is_page_sharing_candidate()
1353 struct ksm_stable_node *dup, *found = NULL, *stable_node = *_stable_node; in stable_node_dup() local
1360 time_before(jiffies, stable_node->chain_prune_time + in stable_node_dup()
1365 stable_node->chain_prune_time = jiffies; in stable_node_dup()
1368 &stable_node->hlist, hlist_dup) { in stable_node_dup()
1416 BUG_ON(stable_node->hlist.first->next); in stable_node_dup()
1422 rb_replace_node(&stable_node->node, &found->node, in stable_node_dup()
1424 free_stable_node(stable_node); in stable_node_dup()
1439 stable_node = NULL; in stable_node_dup()
1440 } else if (stable_node->hlist.first != &found->hlist_dup && in stable_node_dup()
1459 &stable_node->hlist); in stable_node_dup()
1467 static struct ksm_stable_node *stable_node_dup_any(struct ksm_stable_node *stable_node, in stable_node_dup_any() argument
1470 if (!is_stable_node_chain(stable_node)) in stable_node_dup_any()
1471 return stable_node; in stable_node_dup_any()
1472 if (hlist_empty(&stable_node->hlist)) { in stable_node_dup_any()
1473 free_stable_node_chain(stable_node, root); in stable_node_dup_any()
1476 return hlist_entry(stable_node->hlist.first, in stable_node_dup_any()
1477 typeof(*stable_node), hlist_dup); in stable_node_dup_any()
1499 struct ksm_stable_node *stable_node = *_stable_node; in __stable_node_chain() local
1500 if (!is_stable_node_chain(stable_node)) { in __stable_node_chain()
1501 if (is_page_sharing_candidate(stable_node)) { in __stable_node_chain()
1502 *_stable_node_dup = stable_node; in __stable_node_chain()
1503 return get_ksm_page(stable_node, GET_KSM_PAGE_NOLOCK); in __stable_node_chain()
1551 struct ksm_stable_node *stable_node, *stable_node_dup, *stable_node_any; in stable_tree_search() local
1572 stable_node = rb_entry(*new, struct ksm_stable_node, node); in stable_tree_search()
1574 tree_page = chain_prune(&stable_node_dup, &stable_node, root); in stable_tree_search()
1593 stable_node_any = stable_node_dup_any(stable_node, in stable_tree_search()
1715 if (stable_node_dup == stable_node) { in stable_tree_search()
1735 VM_BUG_ON(!is_stable_node_chain(stable_node)); in stable_tree_search()
1741 stable_node_chain_add_dup(page_node, stable_node); in stable_tree_search()
1766 if (stable_node_dup == stable_node) { in stable_tree_search()
1769 stable_node = alloc_stable_node_chain(stable_node_dup, in stable_tree_search()
1771 if (!stable_node) in stable_tree_search()
1784 stable_node_chain_add_dup(page_node, stable_node); in stable_tree_search()
1802 struct ksm_stable_node *stable_node, *stable_node_dup, *stable_node_any; in stable_tree_insert() local
1817 stable_node = rb_entry(*new, struct ksm_stable_node, node); in stable_tree_insert()
1819 tree_page = chain(&stable_node_dup, stable_node, root); in stable_tree_insert()
1826 stable_node_any = stable_node_dup_any(stable_node, in stable_tree_insert()
1885 if (!is_stable_node_chain(stable_node)) { in stable_tree_insert()
1886 struct ksm_stable_node *orig = stable_node; in stable_tree_insert()
1888 stable_node = alloc_stable_node_chain(orig, root); in stable_tree_insert()
1889 if (!stable_node) { in stable_tree_insert()
1894 stable_node_chain_add_dup(stable_node_dup, stable_node); in stable_tree_insert()
1987 struct ksm_stable_node *stable_node, in stable_tree_append() argument
2000 BUG_ON(stable_node->rmap_hlist_len < 0); in stable_tree_append()
2002 stable_node->rmap_hlist_len++; in stable_tree_append()
2005 WARN_ON_ONCE(stable_node->rmap_hlist_len > in stable_tree_append()
2008 rmap_item->head = stable_node; in stable_tree_append()
2010 hlist_add_head(&rmap_item->hlist, &stable_node->hlist); in stable_tree_append()
2034 struct ksm_stable_node *stable_node; in cmp_and_merge_page() local
2040 stable_node = page_stable_node(page); in cmp_and_merge_page()
2041 if (stable_node) { in cmp_and_merge_page()
2042 if (stable_node->head != &migrate_nodes && in cmp_and_merge_page()
2043 get_kpfn_nid(READ_ONCE(stable_node->kpfn)) != in cmp_and_merge_page()
2044 NUMA(stable_node->nid)) { in cmp_and_merge_page()
2045 stable_node_dup_del(stable_node); in cmp_and_merge_page()
2046 stable_node->head = &migrate_nodes; in cmp_and_merge_page()
2047 list_add(&stable_node->list, stable_node->head); in cmp_and_merge_page()
2049 if (stable_node->head != &migrate_nodes && in cmp_and_merge_page()
2050 rmap_item->head == stable_node) in cmp_and_merge_page()
2056 if (!is_page_sharing_candidate(stable_node)) in cmp_and_merge_page()
2062 if (kpage == page && rmap_item->head == stable_node) { in cmp_and_merge_page()
2153 stable_node = stable_tree_insert(kpage); in cmp_and_merge_page()
2154 if (stable_node) { in cmp_and_merge_page()
2155 stable_tree_append(tree_rmap_item, stable_node, in cmp_and_merge_page()
2157 stable_tree_append(rmap_item, stable_node, in cmp_and_merge_page()
2168 if (!stable_node) { in cmp_and_merge_page()
2253 struct ksm_stable_node *stable_node, *next; in scan_get_next_rmap_item() local
2256 list_for_each_entry_safe(stable_node, next, in scan_get_next_rmap_item()
2258 page = get_ksm_page(stable_node, in scan_get_next_rmap_item()
2620 struct ksm_stable_node *stable_node; in rmap_walk_ksm() local
2632 stable_node = folio_stable_node(folio); in rmap_walk_ksm()
2633 if (!stable_node) in rmap_walk_ksm()
2636 hlist_for_each_entry(rmap_item, &stable_node->hlist, hlist) { in rmap_walk_ksm()
2691 struct ksm_stable_node *stable_node; in folio_migrate_ksm() local
2697 stable_node = folio_stable_node(folio); in folio_migrate_ksm()
2698 if (stable_node) { in folio_migrate_ksm()
2699 VM_BUG_ON_FOLIO(stable_node->kpfn != folio_pfn(folio), folio); in folio_migrate_ksm()
2700 stable_node->kpfn = folio_pfn(newfolio); in folio_migrate_ksm()
2724 static bool stable_node_dup_remove_range(struct ksm_stable_node *stable_node, in stable_node_dup_remove_range() argument
2728 if (stable_node->kpfn >= start_pfn && in stable_node_dup_remove_range()
2729 stable_node->kpfn < end_pfn) { in stable_node_dup_remove_range()
2734 remove_node_from_stable_tree(stable_node); in stable_node_dup_remove_range()
2740 static bool stable_node_chain_remove_range(struct ksm_stable_node *stable_node, in stable_node_chain_remove_range() argument
2748 if (!is_stable_node_chain(stable_node)) { in stable_node_chain_remove_range()
2749 VM_BUG_ON(is_stable_node_dup(stable_node)); in stable_node_chain_remove_range()
2750 return stable_node_dup_remove_range(stable_node, start_pfn, in stable_node_chain_remove_range()
2755 &stable_node->hlist, hlist_dup) { in stable_node_chain_remove_range()
2759 if (hlist_empty(&stable_node->hlist)) { in stable_node_chain_remove_range()
2760 free_stable_node_chain(stable_node, root); in stable_node_chain_remove_range()
2769 struct ksm_stable_node *stable_node, *next; in ksm_check_stable_tree() local
2776 stable_node = rb_entry(node, struct ksm_stable_node, node); in ksm_check_stable_tree()
2777 if (stable_node_chain_remove_range(stable_node, in ksm_check_stable_tree()
2787 list_for_each_entry_safe(stable_node, next, &migrate_nodes, list) { in ksm_check_stable_tree()
2788 if (stable_node->kpfn >= start_pfn && in ksm_check_stable_tree()
2789 stable_node->kpfn < end_pfn) in ksm_check_stable_tree()
2790 remove_node_from_stable_tree(stable_node); in ksm_check_stable_tree()