Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f787fe2 authored by Paul Mundt's avatar Paul Mundt
Browse files

sh: hugetlb updates.



For some of the larger sizes we permitted spanning pages
across several PTEs, but this turned out to not be generally
useful. This reverts the sh hugetlbpage interface to something
more sensible using huge pages at single PTE granularity.

Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 4bcac20a
Loading
Loading
Loading
Loading
+16 −36
Original line number Original line Diff line number Diff line
@@ -26,61 +26,41 @@
pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
{
{
	pgd_t *pgd;
	pgd_t *pgd;
	pud_t *pud;
	pmd_t *pmd;
	pmd_t *pmd;
	pte_t *pte = NULL;
	pte_t *pte = NULL;


	pgd = pgd_offset(mm, addr);
	pgd = pgd_offset(mm, addr);
	if (pgd) {
	if (pgd) {
		pmd = pmd_alloc(mm, pgd, addr);
		pud = pud_alloc(mm, pgd, addr);
		if (pud) {
			pmd = pmd_alloc(mm, pud, addr);
			if (pmd)
			if (pmd)
				pte = pte_alloc_map(mm, pmd, addr);
				pte = pte_alloc_map(mm, pmd, addr);
		}
		}
	}

	return pte;
	return pte;
}
}


pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
{
{
	pgd_t *pgd;
	pgd_t *pgd;
	pud_t *pud;
	pmd_t *pmd;
	pmd_t *pmd;
	pte_t *pte = NULL;
	pte_t *pte = NULL;


	pgd = pgd_offset(mm, addr);
	pgd = pgd_offset(mm, addr);
	if (pgd) {
	if (pgd) {
		pmd = pmd_offset(pgd, addr);
		pud = pud_offset(pgd, addr);
		if (pud) {
			pmd = pmd_offset(pud, addr);
			if (pmd)
			if (pmd)
				pte = pte_offset_map(pmd, addr);
				pte = pte_offset_map(pmd, addr);
		}
		}
	return pte;
}

void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
		     pte_t *ptep, pte_t entry)
{
	int i;

	for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
		set_pte_at(mm, addr, ptep, entry);
		ptep++;
		addr += PAGE_SIZE;
		pte_val(entry) += PAGE_SIZE;
	}
	}
	}


pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
	return pte;
			      pte_t *ptep)
{
	pte_t entry;
	int i;

	entry = *ptep;

	for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
		pte_clear(mm, addr, ptep);
		addr += PAGE_SIZE;
		ptep++;
	}

	return entry;
}
}


struct page *follow_huge_addr(struct mm_struct *mm,
struct page *follow_huge_addr(struct mm_struct *mm,
+0 −1
Original line number Original line Diff line number Diff line
@@ -30,7 +30,6 @@
#define HPAGE_SIZE		(1UL << HPAGE_SHIFT)
#define HPAGE_SIZE		(1UL << HPAGE_SHIFT)
#define HPAGE_MASK		(~(HPAGE_SIZE-1))
#define HPAGE_MASK		(~(HPAGE_SIZE-1))
#define HUGETLB_PAGE_ORDER	(HPAGE_SHIFT-PAGE_SHIFT)
#define HUGETLB_PAGE_ORDER	(HPAGE_SHIFT-PAGE_SHIFT)
#define ARCH_HAS_SETCLEAR_HUGE_PTE
#endif
#endif


#ifdef __KERNEL__
#ifdef __KERNEL__