Skip to content

Commit e3ed910

Browse files
jsgfIngo Molnar
authored andcommitted
x86: use the same pgd_list for PAE and 64-bit
Use a standard list threaded through page->lru for maintaining the pgd list on PAE. This is the same as 64-bit, and seems saner than using a non-standard list via page->index. Signed-off-by: Jeremy Fitzhardinge <[email protected]> Signed-off-by: Ingo Molnar <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]>
1 parent fa28ba2 commit e3ed910

File tree

6 files changed

+11
-27
lines changed

6 files changed

+11
-27
lines changed

arch/x86/mm/fault.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -907,10 +907,8 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)
907907
force_sig_info_fault(SIGBUS, BUS_ADRERR, address, tsk);
908908
}
909909

910-
#ifdef CONFIG_X86_64
911910
DEFINE_SPINLOCK(pgd_lock);
912911
LIST_HEAD(pgd_list);
913-
#endif
914912

915913
void vmalloc_sync_all(void)
916914
{
@@ -935,13 +933,11 @@ void vmalloc_sync_all(void)
935933
struct page *page;
936934

937935
spin_lock_irqsave(&pgd_lock, flags);
938-
for (page = pgd_list; page; page =
939-
(struct page *)page->index)
936+
list_for_each_entry(page, &pgd_list, lru) {
940937
if (!vmalloc_sync_one(page_address(page),
941-
address)) {
942-
BUG_ON(page != pgd_list);
938+
address))
943939
break;
944-
}
940+
}
945941
spin_unlock_irqrestore(&pgd_lock, flags);
946942
if (!page)
947943
set_bit(pgd_index(address), insync);

arch/x86/mm/pageattr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ static void __set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte)
175175
if (!SHARED_KERNEL_PMD) {
176176
struct page *page;
177177

178-
for (page = pgd_list; page; page = (struct page *)page->index) {
178+
list_for_each_entry(page, &pgd_list, lru) {
179179
pgd_t *pgd;
180180
pud_t *pud;
181181
pmd_t *pmd;

arch/x86/mm/pgtable_32.c

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -205,27 +205,18 @@ struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
205205
* vmalloc faults work because attached pagetables are never freed.
206206
* -- wli
207207
*/
208-
DEFINE_SPINLOCK(pgd_lock);
209-
struct page *pgd_list;
210-
211208
static inline void pgd_list_add(pgd_t *pgd)
212209
{
213210
struct page *page = virt_to_page(pgd);
214-
page->index = (unsigned long)pgd_list;
215-
if (pgd_list)
216-
set_page_private(pgd_list, (unsigned long)&page->index);
217-
pgd_list = page;
218-
set_page_private(page, (unsigned long)&pgd_list);
211+
212+
list_add(&page->lru, &pgd_list);
219213
}
220214

221215
static inline void pgd_list_del(pgd_t *pgd)
222216
{
223-
struct page *next, **pprev, *page = virt_to_page(pgd);
224-
next = (struct page *)page->index;
225-
pprev = (struct page **)page_private(page);
226-
*pprev = next;
227-
if (next)
228-
set_page_private(next, (unsigned long)pprev);
217+
struct page *page = virt_to_page(pgd);
218+
219+
list_del(&page->lru);
229220
}
230221

231222

include/asm-x86/pgtable.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ extern pteval_t __PAGE_KERNEL, __PAGE_KERNEL_EXEC;
131131
extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)];
132132
#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
133133

134+
extern spinlock_t pgd_lock;
135+
extern struct list_head pgd_list;
134136

135137
/*
136138
* The following only work if pte_present() is true.

include/asm-x86/pgtable_32.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ struct vm_area_struct;
2727

2828
extern pgd_t swapper_pg_dir[1024];
2929
extern struct kmem_cache *pmd_cache;
30-
extern spinlock_t pgd_lock;
31-
extern struct page *pgd_list;
3230
void check_pgt_cache(void);
3331

3432
static inline void pgtable_cache_init(void) {}

include/asm-x86/pgtable_64.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,9 +240,6 @@ static inline unsigned long pmd_bad(pmd_t pmd)
240240
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
241241
#define __swp_entry_to_pte(x) ((pte_t) { .pte = (x).val })
242242

243-
extern spinlock_t pgd_lock;
244-
extern struct list_head pgd_list;
245-
246243
extern int kern_addr_valid(unsigned long addr);
247244

248245
#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \

0 commit comments

Comments
 (0)