while (next && next->vm_start <= vma->vm_end + PMD_SIZE) { vma = next; next = vma->vm_next;
if (is_hugepage_only_range(vma->vm_mm, addr, HPAGE_SIZE)) { hugetlb_free_pgd_range(tlb, addr, vma->vm_end, floor, next? next->vm_start: ceiling); } else {  while (next && next->vm_start <= vma->vm_end + PMD_SIZE && !is_hugepage_only_range(vma->vm_mm, next->vm_start, HPAGE_SIZE)) { vma = next; next = vma->vm_next; } free_pgd_range(tlb, addr, vma->vm_end, floor, next? next->vm_start: ceiling);
void free_pgtables(struct mmu_gather **tlb, struct vm_area_struct *vma,				unsigned long floor, unsigned long ceiling){	while (vma) {		struct vm_area_struct *next = vma->vm_next;		unsigned long addr = vma->vm_start;		/* Optimization: gather nearby vmas into a single call down */		while (next && next->vm_start <= vma->vm_end + PMD_SIZE) {			vma = next;			next = vma->vm_next;		}		free_pgd_range(*tlb, addr, vma->vm_end,				floor, next? next->vm_start: ceiling);		vma = next;	}}