@@ -97,17 +97,19 @@ void mmu_page_dtor(void *page)
97
97
98
98
typedef struct list_head ptable_desc ;
99
99
100
- static struct list_head ptable_list [2 ] = {
100
+ static struct list_head ptable_list [3 ] = {
101
101
LIST_HEAD_INIT (ptable_list [0 ]),
102
102
LIST_HEAD_INIT (ptable_list [1 ]),
103
+ LIST_HEAD_INIT (ptable_list [2 ]),
103
104
};
104
105
105
106
#define PD_PTABLE (page ) ((ptable_desc *)&(virt_to_page((void *)(page))->lru))
106
107
#define PD_PAGE (ptable ) (list_entry(ptable, struct page, lru))
107
108
#define PD_MARKBITS (dp ) (*(unsigned int *)&PD_PAGE(dp)->index)
108
109
109
- static const int ptable_shift [2 ] = {
110
- 7 + 2 , /* PGD, PMD */
110
+ static const int ptable_shift [3 ] = {
111
+ 7 + 2 , /* PGD */
112
+ 7 + 2 , /* PMD */
111
113
6 + 2 , /* PTE */
112
114
};
113
115
@@ -156,12 +158,17 @@ void *get_pointer_table(int type)
156
158
if (!(page = (void * )get_zeroed_page (GFP_KERNEL )))
157
159
return NULL ;
158
160
159
- if (type == TABLE_PTE ) {
161
+ switch (type ) {
162
+ case TABLE_PTE :
160
163
/*
161
164
* m68k doesn't have SPLIT_PTE_PTLOCKS for not having
162
165
* SMP.
163
166
*/
164
167
pagetable_pte_ctor (virt_to_ptdesc (page ));
168
+ break ;
169
+ case TABLE_PMD :
170
+ pagetable_pmd_ctor (virt_to_ptdesc (page ));
171
+ break ;
165
172
}
166
173
167
174
mmu_page_ctor (page );
@@ -200,7 +207,7 @@ int free_pointer_table(void *table, int type)
200
207
/* all tables in page are free, free page */
201
208
list_del (dp );
202
209
mmu_page_dtor ((void * )page );
203
- if (type == TABLE_PTE )
210
+ if (type == TABLE_PTE || type == TABLE_PMD )
204
211
pagetable_dtor (virt_to_ptdesc ((void * )page ));
205
212
free_page (page );
206
213
return 1 ;
0 commit comments