[PATCH 1/7] Add various hugetlb arm high level hooks
From: catalin.marinas@arm.com (Catalin Marinas)
Date: 2012-02-07 11:54:48
On Tue, Feb 07, 2012 at 02:00:25AM +0000, bill4carson wrote:
On 2012?02?07? 01:07, Catalin Marinas wrote:quoted
On Mon, Jan 30, 2012 at 07:57:12AM +0000, bill4carson at gmail.com wrote:quoted
+static inline void set_hugepte_section(struct mm_struct *mm, unsigned long addr, + pte_t *ptep, pte_t pte) +{ + pgd_t *pgd; + pud_t *pud; + pmd_t *pmd; + + int col, row; + pte_t **huge_linuxpte =&mm->huge_2m_pte[0]; + + row = HUGEPAGE_2M_PTE_ARRAY_ROW(addr); + col = HUGEPAGE_2M_PTE_ARRAY_COL(addr); + + /* an valid pte pointer is expected */ + BUG_ON(huge_linuxpte[row] == 0); + BUG_ON(ptep !=&huge_linuxpte[row][col]); + + /* set linux pte first */ + huge_linuxpte[row][col] = pte; + + /* set hardware pte */ + pgd = pgd_offset(mm, addr); + pud = pud_offset(pgd, addr); + pmd = pmd_offset(pud, addr); + + set_hugepte_at(mm, addr, pmd, pte); +}I haven't followed the whole structure of your patches but do we need to walk the page tables here? Isn't the ptep the same as the pmd when passed to this function (at least it was with my LPAE implementation).Here, ptep is not the same as pmd, mm layer always manages linux pte. For normal page, linux pte and hardware pte is just an 2048 bytes offset away and cpu_v7_set_pte_ext can set both linux/hardware pte easily. For huge page, linux pte is stored somewhere else,far away from hardware pte table, in set_hugepte_section, "ptep" is the huge page based linux pte address, first set linux pte value "pte" in there; and hardware pmd address could only be derived from "addr" by a page table walk, then setting hardware pmd value in set_hugepte_at, which cpu_v7_set_hugepte_ext does the whole job.
OK. I thought we already have some pointer in the Linux pmd for the actual hardware pmd. Walking the page table isn't expensive in this case, with only 2 levels. For LPAE we don't even need this since we don't have a separate Linux pte/pmd. -- Catalin