arch/s390/mm/hugetlbpage.c

Source file repositories/reference/linux-study-clean/arch/s390/mm/hugetlbpage.c

File Facts

System
Linux kernel
Corpus path
arch/s390/mm/hugetlbpage.c
Extension
.c
Size
7448 bytes
Lines
242
Domain
Architecture Layer
Bucket
arch/s390
Inferred role
Architecture Layer: implementation source
Status
source implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

if (pudp) {
			if (sz == PUD_SIZE)
				return (pte_t *) pudp;
			else if (sz == PMD_SIZE)
				pmdp = pmd_alloc(mm, pudp, addr);
		}
	}
	return (pte_t *) pmdp;
}

pte_t *huge_pte_offset(struct mm_struct *mm,
		       unsigned long addr, unsigned long sz)
{
	pgd_t *pgdp;
	p4d_t *p4dp;
	pud_t *pudp;
	pmd_t *pmdp = NULL;

	pgdp = pgd_offset(mm, addr);
	if (pgd_present(pgdp_get(pgdp))) {
		p4dp = p4d_offset(pgdp, addr);
		if (p4d_present(p4dp_get(p4dp))) {
			pudp = pud_offset(p4dp, addr);
			if (sz == PUD_SIZE)
				return (pte_t *)pudp;
			if (pud_present(pudp_get(pudp)))
				pmdp = pmd_offset(pudp, addr);
		}
	}
	return (pte_t *) pmdp;
}

bool __init arch_hugetlb_valid_size(unsigned long size)
{
	if (cpu_has_edat1() && size == PMD_SIZE)
		return true;
	else if (cpu_has_edat2() && size == PUD_SIZE)
		return true;
	else
		return false;
}

unsigned int __init arch_hugetlb_cma_order(void)
{
	if (cpu_has_edat2())
		return PUD_SHIFT - PAGE_SHIFT;

	return 0;
}

Annotation

Implementation Notes