You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
powerpc: Free a PTE bit on ppc64 with 64K pages
This frees a PTE bit when using 64K pages on ppc64. This is done by getting rid of the separate _PAGE_HASHPTE bit. Instead, we just test if any of the 16 sub-page bits is set. For non-combo pages (ie. real 64K pages), we set SUB0 and the location encoding in that field. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
committed by
Paul Mackerras
parent
ff1f4ee94c
commit
41743a4e34
@@ -41,6 +41,7 @@
|
||||
#define PGDIR_MASK (~(PGDIR_SIZE-1))
|
||||
|
||||
/* PTE bits */
|
||||
#define _PAGE_HASHPTE 0x0400 /* software: pte has an associated HPTE */
|
||||
#define _PAGE_SECONDARY 0x8000 /* software: HPTE is in secondary group */
|
||||
#define _PAGE_GROUP_IX 0x7000 /* software: HPTE index within group */
|
||||
#define _PAGE_F_SECOND _PAGE_SECONDARY
|
||||
|
||||
@@ -75,6 +75,20 @@ static inline struct subpage_prot_table *pgd_subpage_prot(pgd_t *pgd)
|
||||
#define _PAGE_COMBO 0x10000000 /* this is a combo 4k page */
|
||||
#define _PAGE_4K_PFN 0x20000000 /* PFN is for a single 4k page */
|
||||
|
||||
/* For 64K page, we don't have a separate _PAGE_HASHPTE bit. Instead,
|
||||
* we set that to be the whole sub-bits mask. The C code will only
|
||||
* test this, so a multi-bit mask will work. For combo pages, this
|
||||
* is equivalent as effectively, the old _PAGE_HASHPTE was an OR of
|
||||
* all the sub bits. For real 64k pages, we now have the assembly set
|
||||
* _PAGE_HPTE_SUB0 in addition to setting the HIDX bits which overlap
|
||||
* that mask. This is fine as long as the HIDX bits are never set on
|
||||
* a PTE that isn't hashed, which is the case today.
|
||||
*
|
||||
* A little nit is for the huge page C code, which does the hashing
|
||||
* in C, we need to provide which bit to use.
|
||||
*/
|
||||
#define _PAGE_HASHPTE _PAGE_HPTE_SUB
|
||||
|
||||
/* Note the full page bits must be in the same location as for normal
|
||||
* 4k pages as the same asssembly will be used to insert 64K pages
|
||||
* wether the kernel has CONFIG_PPC_64K_PAGES or not
|
||||
@@ -83,8 +97,7 @@ static inline struct subpage_prot_table *pgd_subpage_prot(pgd_t *pgd)
|
||||
#define _PAGE_F_GIX 0x00007000 /* full page: hidx bits */
|
||||
|
||||
/* PTE flags to conserve for HPTE identification */
|
||||
#define _PAGE_HPTEFLAGS (_PAGE_BUSY | _PAGE_HASHPTE | _PAGE_HPTE_SUB |\
|
||||
_PAGE_COMBO)
|
||||
#define _PAGE_HPTEFLAGS (_PAGE_BUSY | _PAGE_HASHPTE | _PAGE_COMBO)
|
||||
|
||||
/* Shift to put page number into pte.
|
||||
*
|
||||
|
||||
@@ -91,7 +91,6 @@
|
||||
#define _PAGE_DIRTY 0x0080 /* C: page changed */
|
||||
#define _PAGE_ACCESSED 0x0100 /* R: page referenced */
|
||||
#define _PAGE_RW 0x0200 /* software: user write access allowed */
|
||||
#define _PAGE_HASHPTE 0x0400 /* software: pte has an associated HPTE */
|
||||
#define _PAGE_BUSY 0x0800 /* software: PTE & hash are busy */
|
||||
|
||||
#define _PAGE_BASE (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_COHERENT)
|
||||
|
||||
Reference in New Issue
Block a user