diff -urN pte-ref/arch/um/kernel/mem.c pte/arch/um/kernel/mem.c --- pte-ref/arch/um/kernel/mem.c Fri Mar 29 17:30:59 2002 +++ pte/arch/um/kernel/mem.c Fri Mar 29 17:31:38 2002 @@ -144,8 +144,8 @@ pmd_free_slow(pmd_alloc_one_fast(NULL, 0)); freed++; } - if (pte_quicklist) { - pte_free_slow(pte_alloc_one_fast(NULL, 0)); + if (!list_empty(&pte_quicklist)) { + pte_free_slow(pte_alloc_one_fast_lifo(0, 0)); freed++; } } while(pgtable_cache_size > low); diff -urN pte-ref/arch/um/kernel/setup.c pte/arch/um/kernel/setup.c --- pte-ref/arch/um/kernel/setup.c Fri Mar 29 17:30:59 2002 +++ pte/arch/um/kernel/setup.c Fri Mar 29 17:31:38 2002 @@ -5,7 +5,9 @@ #include "asm/processor.h" -struct cpuinfo_um boot_cpu_data = { 0, 0, 0, 0 }; +struct cpuinfo_um boot_cpu_data = { + pte_quick: LIST_HEAD_INIT(boot_cpu_data.pte_quick), +}; /* * Overrides for Emacs so that we follow Linus's tabbing style. diff -urN pte-ref/arch/um/kernel/trap_kern.c pte/arch/um/kernel/trap_kern.c --- pte-ref/arch/um/kernel/trap_kern.c Fri Mar 29 17:30:59 2002 +++ pte/arch/um/kernel/trap_kern.c Fri Mar 29 17:31:38 2002 @@ -127,6 +127,8 @@ { } +void show_stack(unsigned long * esp) { } + spinlock_t trap_lock = SPIN_LOCK_UNLOCKED; void lock_trap(void) diff -urN pte-ref/include/asm-um/pgalloc.h pte/include/asm-um/pgalloc.h --- pte-ref/include/asm-um/pgalloc.h Fri Mar 29 17:30:59 2002 +++ pte/include/asm-um/pgalloc.h Fri Mar 29 17:31:38 2002 @@ -7,6 +7,7 @@ #ifndef __UM_PGALLOC_H #define __UM_PGALLOC_H +#include "linux/list.h" #include "linux/mm.h" #define pgd_quicklist (current_cpu_data.pgd_quick) @@ -14,8 +15,7 @@ #define pte_quicklist (current_cpu_data.pte_quick) #define pgtable_cache_size (current_cpu_data.pgtable_cache_sz) -#define pmd_populate(mm, pmd, pte) \ - set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) (pte))) +#define pmd_populate(mm, pmd, page) set_pmd(pmd, mk_pmd(page, __pgprot(_PAGE_TABLE))) /* * Allocate and free page tables. @@ -57,41 +57,51 @@ free_page((unsigned long)pgd); } -static inline pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address) +static inline struct page * pte_alloc_one_fast(struct mm_struct *mm, + unsigned long address) { - pte_t *pte; + struct list_head * entry = pte_quicklist.next; /* FIFO */ + struct page * page = NULL; - pte = (pte_t *) __get_free_page(GFP_KERNEL); - if (pte) - clear_page(pte); - return pte; + if (entry != &pte_quicklist) { + list_del(entry); + page = list_entry(entry, struct page, list); + pgtable_cache_size--; + } + return page; } -static inline pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long address) +static inline struct page * pte_alloc_one_fast_lifo(struct mm_struct *mm, + unsigned long address) { - unsigned long *ret; + struct list_head * entry = pte_quicklist.prev; /* LIFO */ + struct page * page = NULL; - if ((ret = (unsigned long *)pte_quicklist) != NULL) { - pte_quicklist = (unsigned long *)(*ret); - ret[0] = ret[1]; + if (entry != &pte_quicklist) { + list_del(entry); + page = list_entry(entry, struct page, list); pgtable_cache_size--; } - return (pte_t *)ret; + return page; } -static inline void pte_free_pte_fast(pte_t *pte) +static inline void pte_free_fast(struct page * page) { - *(unsigned long *)pte = (unsigned long) pte_quicklist; - pte_quicklist = (unsigned long *) pte; + list_add(&page->list, &pte_quicklist); pgtable_cache_size++; } -static inline void pte_free_slow(pte_t *pte) +static __inline__ void pte_free_slow(struct page * page) +{ + __free_page(page); +} + +static inline void pte_free_via_pmd(pmd_t pmd) { - free_page((unsigned long)pte); + pte_free_fast(virt_to_page(pte_offset(&pmd, 0))); } -#define pte_free(pte) pte_free_slow(pte) +#define pte_free(pte) pte_free_fast(pte) #define pgd_free(pgd) free_pgd_slow(pgd) #define pgd_alloc(mm) get_pgd_fast() diff -urN pte-ref/include/asm-um/pgtable.h pte/include/asm-um/pgtable.h --- pte-ref/include/asm-um/pgtable.h Fri Mar 29 17:30:59 2002 +++ pte/include/asm-um/pgtable.h Fri Mar 29 17:32:48 2002 @@ -321,6 +321,13 @@ if(pte_present(__pte)) pte_mknewprot(pte_mknewpage(__pte)); \ __pte; \ }) +#define mk_pmd(page, pgprot) \ +({ \ + pmd_t __pmd; \ + \ + pmd_val(__pmd) = ((unsigned long) __va((page-mem_map)*(unsigned long)PAGE_SIZE + pgprot_val(pgprot))); \ + __pmd; \ +}) /* This takes a physical page address that is used by the remapping functions */ #define mk_pte_phys(physpage, pgprot) \ @@ -355,6 +362,16 @@ /* Find an entry in the third-level page table.. */ #define pte_offset(pmd, address) \ ((pte_t *) (pmd_page(*pmd) + ((address>>10) & ((PTRS_PER_PTE-1)<<2)))) + +#define pte_offset2(dir, address) pte_offset(dir, address) +#define pte_offset_atomic(dir, address) pte_offset(dir, address) +#define pte_offset_atomic2(dir, address) pte_offset(dir, address) +#define pte_offset_under_lock(dir, address, mm) pte_offset(dir, address) +#define pte_offset2_under_lock(dir, address, mm) pte_offset(dir, address) +#define pte_kunmap(ptep) do { } while(0) +#define pte_kunmap2(ptep) do { } while(0) +#define pte_kunmap_atomic2(ptep) do { } while(0) +#define pte_alloc_atomic(mm, pmd, address) pte_alloc(mm, pmd, address) #define update_mmu_cache(vma,address,pte) do ; while (0) diff -urN pte-ref/include/asm-um/prefetch.h pte/include/asm-um/prefetch.h --- pte-ref/include/asm-um/prefetch.h Thu Jan 1 01:00:00 1970 +++ pte/include/asm-um/prefetch.h Fri Mar 29 17:31:38 2002 @@ -0,0 +1,4 @@ +#ifndef __UM_PREFETCH_H +#define __UM_PREFETCH_H + +#endif diff -urN pte-ref/include/asm-um/processor-generic.h pte/include/asm-um/processor-generic.h --- pte-ref/include/asm-um/processor-generic.h Fri Mar 29 17:30:59 2002 +++ pte/include/asm-um/processor-generic.h Fri Mar 29 17:31:38 2002 @@ -10,6 +10,7 @@ struct task_struct; +#include "linux/list.h" #include "linux/config.h" #include "linux/signal.h" #include "asm/segment.h" @@ -146,7 +147,7 @@ unsigned long loops_per_jiffy; unsigned long *pgd_quick; unsigned long *pmd_quick; - unsigned long *pte_quick; + struct list_head pte_quick; unsigned long pgtable_cache_sz; int ipi_pipe[2]; };