Skip to content

Commit 1c7ec8a

Browse files
kvaneeshmpe
authored andcommitted
powerpc/mm/book3s64/4k: Switch 4k pagesize config to use pagetable fragment
4K config use one full page at level 4 of the pagetable. Add support for single fragment allocation in pagetable fragment code and and use that for 4K config. This makes both 4k and 64k use the same code path. Later we will switch pmd to use the page table fragment code. This is done only for 64bit platforms which is using page table fragment support. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
1 parent 7023467 commit 1c7ec8a

File tree

5 files changed

+15
-44
lines changed

5 files changed

+15
-44
lines changed

arch/powerpc/include/asm/book3s/64/hash-4k.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@
3838
#define H_PAGE_4K_PFN 0x0
3939
#define H_PAGE_THP_HUGE 0x0
4040
#define H_PAGE_COMBO 0x0
41-
#define H_PTE_FRAG_NR 0
42-
#define H_PTE_FRAG_SIZE_SHIFT 0
41+
42+
/* 8 bytes per each pte entry */
43+
#define H_PTE_FRAG_SIZE_SHIFT (H_PTE_INDEX_SIZE + 3)
44+
#define H_PTE_FRAG_NR (PAGE_SIZE >> H_PTE_FRAG_SIZE_SHIFT)
4345

4446
/* memory key bits, only 8 keys supported */
4547
#define H_PTE_PKEY_BIT0 0

arch/powerpc/include/asm/book3s/64/mmu.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,10 @@ typedef struct {
134134
#ifdef CONFIG_PPC_SUBPAGE_PROT
135135
struct subpage_prot_table spt;
136136
#endif /* CONFIG_PPC_SUBPAGE_PROT */
137-
#ifdef CONFIG_PPC_64K_PAGES
138-
/* for 4K PTE fragment support */
137+
/*
138+
* pagetable fragment support
139+
*/
139140
void *pte_frag;
140-
#endif
141141
#ifdef CONFIG_SPAPR_TCE_IOMMU
142142
struct list_head iommu_group_mem_list;
143143
#endif

arch/powerpc/include/asm/book3s/64/pgalloc.h

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -173,31 +173,6 @@ static inline pgtable_t pmd_pgtable(pmd_t pmd)
173173
return (pgtable_t)pmd_page_vaddr(pmd);
174174
}
175175

176-
#ifdef CONFIG_PPC_4K_PAGES
177-
static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
178-
unsigned long address)
179-
{
180-
return (pte_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO);
181-
}
182-
183-
static inline pgtable_t pte_alloc_one(struct mm_struct *mm,
184-
unsigned long address)
185-
{
186-
struct page *page;
187-
pte_t *pte;
188-
189-
pte = (pte_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO | __GFP_ACCOUNT);
190-
if (!pte)
191-
return NULL;
192-
page = virt_to_page(pte);
193-
if (!pgtable_page_ctor(page)) {
194-
__free_page(page);
195-
return NULL;
196-
}
197-
return pte;
198-
}
199-
#else /* if CONFIG_PPC_64K_PAGES */
200-
201176
static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
202177
unsigned long address)
203178
{
@@ -209,7 +184,6 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm,
209184
{
210185
return (pgtable_t)pte_fragment_alloc(mm, address, 0);
211186
}
212-
#endif
213187

214188
static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
215189
{

arch/powerpc/mm/mmu_context_book3s64.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,7 @@ int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
159159

160160
mm->context.id = index;
161161

162-
#ifdef CONFIG_PPC_64K_PAGES
163162
mm->context.pte_frag = NULL;
164-
#endif
165163
#ifdef CONFIG_SPAPR_TCE_IOMMU
166164
mm_iommu_init(mm);
167165
#endif
@@ -192,7 +190,6 @@ static void destroy_contexts(mm_context_t *ctx)
192190
spin_unlock(&mmu_context_lock);
193191
}
194192

195-
#ifdef CONFIG_PPC_64K_PAGES
196193
static void destroy_pagetable_page(struct mm_struct *mm)
197194
{
198195
int count;
@@ -213,13 +210,6 @@ static void destroy_pagetable_page(struct mm_struct *mm)
213210
}
214211
}
215212

216-
#else
217-
static inline void destroy_pagetable_page(struct mm_struct *mm)
218-
{
219-
return;
220-
}
221-
#endif
222-
223213
void destroy_context(struct mm_struct *mm)
224214
{
225215
#ifdef CONFIG_SPAPR_TCE_IOMMU

arch/powerpc/mm/pgtable-book3s64.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ void mmu_partition_table_set_entry(unsigned int lpid, unsigned long dw0,
225225
asm volatile("eieio; tlbsync; ptesync" : : : "memory");
226226
}
227227
EXPORT_SYMBOL_GPL(mmu_partition_table_set_entry);
228-
#ifdef CONFIG_PPC_64K_PAGES
228+
229229
static pte_t *get_pte_from_cache(struct mm_struct *mm)
230230
{
231231
void *pte_frag, *ret;
@@ -264,7 +264,14 @@ static pte_t *__alloc_for_ptecache(struct mm_struct *mm, int kernel)
264264
return NULL;
265265
}
266266

267+
267268
ret = page_address(page);
269+
/*
270+
* if we support only one fragment just return the
271+
* allocated page.
272+
*/
273+
if (PTE_FRAG_NR == 1)
274+
return ret;
268275
spin_lock(&mm->page_table_lock);
269276
/*
270277
* If we find pgtable_page set, we return
@@ -291,8 +298,6 @@ pte_t *pte_fragment_alloc(struct mm_struct *mm, unsigned long vmaddr, int kernel
291298
return __alloc_for_ptecache(mm, kernel);
292299
}
293300

294-
#endif /* CONFIG_PPC_64K_PAGES */
295-
296301
void pte_fragment_free(unsigned long *table, int kernel)
297302
{
298303
struct page *page = virt_to_page(table);

0 commit comments

Comments
 (0)