Lines Matching defs:mm_slot
89 * struct mm_slot - hash lookup from mm to mm_slot
94 struct mm_slot {
107 * @mm_slot: the current mm_slot we are scanning
114 struct mm_slot *mm_slot;
387 sizeof(struct mm_slot),
388 __alignof__(struct mm_slot), 0, NULL);
405 static inline struct mm_slot *alloc_mm_slot(void)
412 static inline void free_mm_slot(struct mm_slot *mm_slot)
414 kmem_cache_free(mm_slot_cache, mm_slot);
417 static struct mm_slot *get_mm_slot(struct mm_struct *mm)
419 struct mm_slot *mm_slot;
421 hash_for_each_possible(mm_slots_hash, mm_slot, hash, (unsigned long)mm)
422 if (mm == mm_slot->mm)
423 return mm_slot;
429 struct mm_slot *mm_slot)
431 mm_slot->mm = mm;
432 hash_add(mm_slots_hash, &mm_slot->hash, (long)mm);
475 struct mm_slot *mm_slot;
478 mm_slot = alloc_mm_slot();
479 if (!mm_slot)
485 free_mm_slot(mm_slot);
490 insert_to_mm_slots_hash(mm, mm_slot);
496 list_add_tail(&mm_slot->mm_node, &khugepaged_scan.mm_head);
528 struct mm_slot *mm_slot;
532 mm_slot = get_mm_slot(mm);
533 if (mm_slot && khugepaged_scan.mm_slot != mm_slot) {
534 hash_del(&mm_slot->hash);
535 list_del(&mm_slot->mm_node);
542 free_mm_slot(mm_slot);
544 } else if (mm_slot) {
1391 static void collect_mm_slot(struct mm_slot *mm_slot)
1393 struct mm_struct *mm = mm_slot->mm;
1398 /* free mm_slot */
1399 hash_del(&mm_slot->hash);
1400 list_del(&mm_slot->mm_node);
1409 free_mm_slot(mm_slot);
1422 struct mm_slot *mm_slot;
1427 mm_slot = get_mm_slot(mm);
1428 if (likely(mm_slot && mm_slot->nr_pte_mapped_thp < MAX_PTE_MAPPED_THP))
1429 mm_slot->pte_mapped_thp[mm_slot->nr_pte_mapped_thp++] = addr;
1565 static int khugepaged_collapse_pte_mapped_thps(struct mm_slot *mm_slot)
1567 struct mm_struct *mm = mm_slot->mm;
1570 if (likely(mm_slot->nr_pte_mapped_thp == 0))
1579 for (i = 0; i < mm_slot->nr_pte_mapped_thp; i++)
1580 collapse_pte_mapped_thp(mm, mm_slot->pte_mapped_thp[i]);
1583 mm_slot->nr_pte_mapped_thp = 0;
2094 static int khugepaged_collapse_pte_mapped_thps(struct mm_slot *mm_slot)
2105 struct mm_slot *mm_slot;
2113 if (khugepaged_scan.mm_slot)
2114 mm_slot = khugepaged_scan.mm_slot;
2116 mm_slot = list_entry(khugepaged_scan.mm_head.next,
2117 struct mm_slot, mm_node);
2119 khugepaged_scan.mm_slot = mm_slot;
2122 khugepaged_collapse_pte_mapped_thps(mm_slot);
2124 mm = mm_slot->mm;
2199 VM_BUG_ON(khugepaged_scan.mm_slot != mm_slot);
2201 * Release the current mm_slot if this mm is about to die, or
2208 * mm_slot not pointing to the exiting mm.
2210 if (mm_slot->mm_node.next != &khugepaged_scan.mm_head) {
2211 khugepaged_scan.mm_slot = list_entry(
2212 mm_slot->mm_node.next,
2213 struct mm_slot, mm_node);
2216 khugepaged_scan.mm_slot = NULL;
2220 collect_mm_slot(mm_slot);
2259 if (!khugepaged_scan.mm_slot)
2302 struct mm_slot *mm_slot;
2313 mm_slot = khugepaged_scan.mm_slot;
2314 khugepaged_scan.mm_slot = NULL;
2315 if (mm_slot)
2316 collect_mm_slot(mm_slot);