Lines Matching refs:stable_node
590 static inline void free_stable_node(struct ksm_stable_node *stable_node) in free_stable_node() argument
592 VM_BUG_ON(stable_node->rmap_hlist_len && in free_stable_node()
593 !is_stable_node_chain(stable_node)); in free_stable_node()
594 kmem_cache_free(stable_node_cache, stable_node); in free_stable_node()
817 static void remove_node_from_stable_tree(struct ksm_stable_node *stable_node) in remove_node_from_stable_tree() argument
822 BUG_ON(stable_node->rmap_hlist_len < 0); in remove_node_from_stable_tree()
824 hlist_for_each_entry(rmap_item, &stable_node->hlist, hlist) { in remove_node_from_stable_tree()
827 trace_ksm_remove_rmap_item(stable_node->kpfn, rmap_item, rmap_item->mm); in remove_node_from_stable_tree()
834 VM_BUG_ON(stable_node->rmap_hlist_len <= 0); in remove_node_from_stable_tree()
835 stable_node->rmap_hlist_len--; in remove_node_from_stable_tree()
851 trace_ksm_remove_ksm_page(stable_node->kpfn); in remove_node_from_stable_tree()
852 if (stable_node->head == &migrate_nodes) in remove_node_from_stable_tree()
853 list_del(&stable_node->list); in remove_node_from_stable_tree()
855 stable_node_dup_del(stable_node); in remove_node_from_stable_tree()
856 free_stable_node(stable_node); in remove_node_from_stable_tree()
884 static struct folio *ksm_get_folio(struct ksm_stable_node *stable_node, in ksm_get_folio() argument
891 expected_mapping = (void *)((unsigned long)stable_node | in ksm_get_folio()
894 kpfn = READ_ONCE(stable_node->kpfn); /* Address dependency. */ in ksm_get_folio()
954 if (READ_ONCE(stable_node->kpfn) != kpfn) in ksm_get_folio()
956 remove_node_from_stable_tree(stable_node); in ksm_get_folio()
967 struct ksm_stable_node *stable_node; in remove_rmap_item_from_tree() local
970 stable_node = rmap_item->head; in remove_rmap_item_from_tree()
971 folio = ksm_get_folio(stable_node, KSM_GET_FOLIO_LOCK); in remove_rmap_item_from_tree()
979 if (!hlist_empty(&stable_node->hlist)) in remove_rmap_item_from_tree()
986 VM_BUG_ON(stable_node->rmap_hlist_len <= 0); in remove_rmap_item_from_tree()
987 stable_node->rmap_hlist_len--; in remove_rmap_item_from_tree()
1066 struct ksm_stable_node *stable_node) in folio_set_stable_node() argument
1069 folio->mapping = (void *)((unsigned long)stable_node | PAGE_MAPPING_KSM); in folio_set_stable_node()
1076 static int remove_stable_node(struct ksm_stable_node *stable_node) in remove_stable_node() argument
1081 folio = ksm_get_folio(stable_node, KSM_GET_FOLIO_LOCK); in remove_stable_node()
1105 remove_node_from_stable_tree(stable_node); in remove_stable_node()
1114 static int remove_stable_node_chain(struct ksm_stable_node *stable_node, in remove_stable_node_chain() argument
1120 if (!is_stable_node_chain(stable_node)) { in remove_stable_node_chain()
1121 VM_BUG_ON(is_stable_node_dup(stable_node)); in remove_stable_node_chain()
1122 if (remove_stable_node(stable_node)) in remove_stable_node_chain()
1129 &stable_node->hlist, hlist_dup) { in remove_stable_node_chain()
1134 BUG_ON(!hlist_empty(&stable_node->hlist)); in remove_stable_node_chain()
1135 free_stable_node_chain(stable_node, root); in remove_stable_node_chain()
1141 struct ksm_stable_node *stable_node, *next; in remove_all_stable_nodes() local
1147 stable_node = rb_entry(root_stable_tree[nid].rb_node, in remove_all_stable_nodes()
1149 if (remove_stable_node_chain(stable_node, in remove_all_stable_nodes()
1157 list_for_each_entry_safe(stable_node, next, &migrate_nodes, list) { in remove_all_stable_nodes()
1158 if (remove_stable_node(stable_node)) in remove_all_stable_nodes()
1614 bool __is_page_sharing_candidate(struct ksm_stable_node *stable_node, int offset) in __is_page_sharing_candidate() argument
1616 VM_BUG_ON(stable_node->rmap_hlist_len < 0); in __is_page_sharing_candidate()
1623 return stable_node->rmap_hlist_len && in __is_page_sharing_candidate()
1624 stable_node->rmap_hlist_len + offset < ksm_max_page_sharing; in __is_page_sharing_candidate()
1628 bool is_page_sharing_candidate(struct ksm_stable_node *stable_node) in is_page_sharing_candidate() argument
1630 return __is_page_sharing_candidate(stable_node, 0); in is_page_sharing_candidate()
1638 struct ksm_stable_node *dup, *found = NULL, *stable_node = *_stable_node; in stable_node_dup() local
1644 time_before(jiffies, stable_node->chain_prune_time + in stable_node_dup()
1649 stable_node->chain_prune_time = jiffies; in stable_node_dup()
1652 &stable_node->hlist, hlist_dup) { in stable_node_dup()
1686 if (hlist_is_singular_node(&found->hlist_dup, &stable_node->hlist)) { in stable_node_dup()
1693 BUG_ON(stable_node->hlist.first->next); in stable_node_dup()
1699 rb_replace_node(&stable_node->node, &found->node, in stable_node_dup()
1701 free_stable_node(stable_node); in stable_node_dup()
1716 stable_node = NULL; in stable_node_dup()
1717 } else if (stable_node->hlist.first != &found->hlist_dup && in stable_node_dup()
1736 &stable_node->hlist); in stable_node_dup()
1740 free_stable_node_chain(stable_node, root); in stable_node_dup()
1766 struct ksm_stable_node *stable_node = *_stable_node; in __stable_node_chain() local
1768 if (!is_stable_node_chain(stable_node)) { in __stable_node_chain()
1769 *_stable_node_dup = stable_node; in __stable_node_chain()
1770 return ksm_get_folio(stable_node, KSM_GET_FOLIO_NOLOCK); in __stable_node_chain()
1805 struct ksm_stable_node *stable_node, *stable_node_dup; in stable_tree_search() local
1828 stable_node = rb_entry(*new, struct ksm_stable_node, node); in stable_tree_search()
1829 tree_folio = chain_prune(&stable_node_dup, &stable_node, root); in stable_tree_search()
1936 if (stable_node_dup == stable_node) { in stable_tree_search()
1956 VM_BUG_ON(!is_stable_node_chain(stable_node)); in stable_tree_search()
1962 stable_node_chain_add_dup(page_node, stable_node); in stable_tree_search()
1984 if (stable_node_dup == stable_node) { in stable_tree_search()
1987 stable_node = alloc_stable_node_chain(stable_node_dup, in stable_tree_search()
1989 if (!stable_node) in stable_tree_search()
2002 stable_node_chain_add_dup(page_node, stable_node); in stable_tree_search()
2020 struct ksm_stable_node *stable_node, *stable_node_dup; in stable_tree_insert() local
2035 stable_node = rb_entry(*new, struct ksm_stable_node, node); in stable_tree_insert()
2036 tree_folio = chain(&stable_node_dup, &stable_node, root); in stable_tree_insert()
2076 if (!is_stable_node_chain(stable_node)) { in stable_tree_insert()
2077 struct ksm_stable_node *orig = stable_node; in stable_tree_insert()
2079 stable_node = alloc_stable_node_chain(orig, root); in stable_tree_insert()
2080 if (!stable_node) { in stable_tree_insert()
2085 stable_node_chain_add_dup(stable_node_dup, stable_node); in stable_tree_insert()
2180 struct ksm_stable_node *stable_node, in stable_tree_append() argument
2193 BUG_ON(stable_node->rmap_hlist_len < 0); in stable_tree_append()
2195 stable_node->rmap_hlist_len++; in stable_tree_append()
2198 WARN_ON_ONCE(stable_node->rmap_hlist_len > in stable_tree_append()
2201 rmap_item->head = stable_node; in stable_tree_append()
2203 hlist_add_head(&rmap_item->hlist, &stable_node->hlist); in stable_tree_append()
2226 struct ksm_stable_node *stable_node; in cmp_and_merge_page() local
2232 stable_node = page_stable_node(page); in cmp_and_merge_page()
2233 if (stable_node) { in cmp_and_merge_page()
2234 if (stable_node->head != &migrate_nodes && in cmp_and_merge_page()
2235 get_kpfn_nid(READ_ONCE(stable_node->kpfn)) != in cmp_and_merge_page()
2236 NUMA(stable_node->nid)) { in cmp_and_merge_page()
2237 stable_node_dup_del(stable_node); in cmp_and_merge_page()
2238 stable_node->head = &migrate_nodes; in cmp_and_merge_page()
2239 list_add(&stable_node->list, stable_node->head); in cmp_and_merge_page()
2241 if (stable_node->head != &migrate_nodes && in cmp_and_merge_page()
2242 rmap_item->head == stable_node) in cmp_and_merge_page()
2248 if (!is_page_sharing_candidate(stable_node)) in cmp_and_merge_page()
2271 if (&kfolio->page == page && rmap_item->head == stable_node) { in cmp_and_merge_page()
2323 stable_node = stable_tree_insert(kfolio); in cmp_and_merge_page()
2324 if (stable_node) { in cmp_and_merge_page()
2325 stable_tree_append(tree_rmap_item, stable_node, in cmp_and_merge_page()
2327 stable_tree_append(rmap_item, stable_node, in cmp_and_merge_page()
2338 if (!stable_node) { in cmp_and_merge_page()
2494 struct ksm_stable_node *stable_node, *next; in scan_get_next_rmap_item() local
2497 list_for_each_entry_safe(stable_node, next, in scan_get_next_rmap_item()
2499 folio = ksm_get_folio(stable_node, in scan_get_next_rmap_item()
3005 struct ksm_stable_node *stable_node; in rmap_walk_ksm() local
3017 stable_node = folio_stable_node(folio); in rmap_walk_ksm()
3018 if (!stable_node) in rmap_walk_ksm()
3021 hlist_for_each_entry(rmap_item, &stable_node->hlist, hlist) { in rmap_walk_ksm()
3080 struct ksm_stable_node *stable_node; in collect_procs_ksm() local
3085 stable_node = folio_stable_node(folio); in collect_procs_ksm()
3086 if (!stable_node) in collect_procs_ksm()
3088 hlist_for_each_entry(rmap_item, &stable_node->hlist, hlist) { in collect_procs_ksm()
3120 struct ksm_stable_node *stable_node; in folio_migrate_ksm() local
3126 stable_node = folio_stable_node(folio); in folio_migrate_ksm()
3127 if (stable_node) { in folio_migrate_ksm()
3128 VM_BUG_ON_FOLIO(stable_node->kpfn != folio_pfn(folio), folio); in folio_migrate_ksm()
3129 stable_node->kpfn = folio_pfn(newfolio); in folio_migrate_ksm()
3153 static bool stable_node_dup_remove_range(struct ksm_stable_node *stable_node, in stable_node_dup_remove_range() argument
3157 if (stable_node->kpfn >= start_pfn && in stable_node_dup_remove_range()
3158 stable_node->kpfn < end_pfn) { in stable_node_dup_remove_range()
3163 remove_node_from_stable_tree(stable_node); in stable_node_dup_remove_range()
3169 static bool stable_node_chain_remove_range(struct ksm_stable_node *stable_node, in stable_node_chain_remove_range() argument
3177 if (!is_stable_node_chain(stable_node)) { in stable_node_chain_remove_range()
3178 VM_BUG_ON(is_stable_node_dup(stable_node)); in stable_node_chain_remove_range()
3179 return stable_node_dup_remove_range(stable_node, start_pfn, in stable_node_chain_remove_range()
3184 &stable_node->hlist, hlist_dup) { in stable_node_chain_remove_range()
3188 if (hlist_empty(&stable_node->hlist)) { in stable_node_chain_remove_range()
3189 free_stable_node_chain(stable_node, root); in stable_node_chain_remove_range()
3198 struct ksm_stable_node *stable_node, *next; in ksm_check_stable_tree() local
3205 stable_node = rb_entry(node, struct ksm_stable_node, node); in ksm_check_stable_tree()
3206 if (stable_node_chain_remove_range(stable_node, in ksm_check_stable_tree()
3216 list_for_each_entry_safe(stable_node, next, &migrate_nodes, list) { in ksm_check_stable_tree()
3217 if (stable_node->kpfn >= start_pfn && in ksm_check_stable_tree()
3218 stable_node->kpfn < end_pfn) in ksm_check_stable_tree()
3219 remove_node_from_stable_tree(stable_node); in ksm_check_stable_tree()