khugepaged_scan
static struct khugepaged_scan khugepaged_scan = {
.mm_head = LIST_HEAD_INIT(khugepaged_scan.mm_head),
if (khugepaged_scan.mm_slot) {
slot = khugepaged_scan.mm_slot;
slot = list_first_entry(&khugepaged_scan.mm_head,
khugepaged_scan.address = 0;
khugepaged_scan.mm_slot = slot;
vma_iter_init(&vmi, mm, khugepaged_scan.address);
if (khugepaged_scan.address > hend) {
if (khugepaged_scan.address < hstart)
khugepaged_scan.address = hstart;
VM_BUG_ON(khugepaged_scan.address & ~HPAGE_PMD_MASK);
while (khugepaged_scan.address < hend) {
VM_WARN_ON_ONCE(khugepaged_scan.address < hstart ||
khugepaged_scan.address + HPAGE_PMD_SIZE >
*result = collapse_single_pmd(khugepaged_scan.address,
khugepaged_scan.address += HPAGE_PMD_SIZE;
VM_BUG_ON(khugepaged_scan.mm_slot != slot);
if (!list_is_last(&slot->mm_node, &khugepaged_scan.mm_head)) {
khugepaged_scan.mm_slot = list_next_entry(slot, mm_node);
khugepaged_scan.address = 0;
khugepaged_scan.mm_slot = NULL;
khugepaged_scan.mm_slot == NULL);
return !list_empty(&khugepaged_scan.mm_head) && hugepage_enabled();
return !list_empty(&khugepaged_scan.mm_head) ||
if (!khugepaged_scan.mm_slot)
slot = khugepaged_scan.mm_slot;
khugepaged_scan.mm_slot = NULL;
if (!list_empty(&khugepaged_scan.mm_head))
wakeup = list_empty(&khugepaged_scan.mm_head);
list_add_tail(&slot->mm_node, &khugepaged_scan.mm_head);
if (slot && khugepaged_scan.mm_slot != slot) {