diff options
| author | Richard Henderson <rth@are.twiddle.net> | 2002-03-24 09:52:10 -0800 |
|---|---|---|
| committer | Richard Henderson <rth@are.twiddle.net> | 2002-03-24 09:52:10 -0800 |
| commit | 7ee912babeec5f7190820dac442db634ae2136de (patch) | |
| tree | 30a3867ef6490db8952d6fe10cfd10007623937f /arch | |
| parent | 085c9a18acd4003fa77cf852aa770e52b2ce6a71 (diff) | |
Break an include loop by moving cache flushing routines from
asm/pgtable.h and/or asm/pgalloc.h to asm/cacheflush.h, and
tlb flushing routines to asm/tlbflush.h.
Diffstat (limited to 'arch')
25 files changed, 123 insertions, 2 deletions
diff --git a/arch/alpha/kernel/core_irongate.c b/arch/alpha/kernel/core_irongate.c index daf3158eb0a3..702dea61dc21 100644 --- a/arch/alpha/kernel/core_irongate.c +++ b/arch/alpha/kernel/core_irongate.c @@ -19,6 +19,8 @@ #include <asm/system.h> #include <asm/pci.h> #include <asm/hwrpb.h> +#include <asm/cacheflush.h> +#include <asm/tlbflush.h> #define __EXTERN_INLINE inline #include <asm/io.h> diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c index aec3d088f12d..1b17a6a0e364 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c @@ -26,6 +26,7 @@ #include <asm/irq.h> #include <asm/pgtable.h> #include <asm/core_cia.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c index a676e9e454f1..618cd340a31c 100644 --- a/arch/alpha/kernel/sys_cabriolet.c +++ b/arch/alpha/kernel/sys_cabriolet.c @@ -28,6 +28,7 @@ #include <asm/core_apecs.h> #include <asm/core_cia.h> #include <asm/core_lca.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index bd28bcad51b2..3ff877f92dde 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c @@ -30,6 +30,7 @@ #include <asm/pgtable.h> #include <asm/core_tsunami.h> #include <asm/hwrpb.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_eb64p.c b/arch/alpha/kernel/sys_eb64p.c index 8a98a959c005..665ea9a4b990 100644 --- a/arch/alpha/kernel/sys_eb64p.c +++ b/arch/alpha/kernel/sys_eb64p.c @@ -27,6 +27,7 @@ #include <asm/core_apecs.h> #include <asm/core_lca.h> #include <asm/hwrpb.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index e8f59c2b6279..68c17b45f76f 100644 --- a/arch/alpha/kernel/sys_eiger.c +++ b/arch/alpha/kernel/sys_eiger.c @@ -27,6 +27,7 @@ #include <asm/pgtable.h> #include <asm/core_tsunami.h> #include <asm/hwrpb.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_jensen.c b/arch/alpha/kernel/sys_jensen.c index 049a344393f0..3b03b8e7ee80 100644 --- a/arch/alpha/kernel/sys_jensen.c +++ b/arch/alpha/kernel/sys_jensen.c @@ -26,6 +26,7 @@ #include <asm/irq.h> #include <asm/mmu_context.h> #include <asm/pgtable.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_miata.c b/arch/alpha/kernel/sys_miata.c index 866d9c8649bf..fefda1f8dd6a 100644 --- a/arch/alpha/kernel/sys_miata.c +++ b/arch/alpha/kernel/sys_miata.c @@ -24,6 +24,7 @@ #include <asm/io.h> #include <asm/pgtable.h> #include <asm/core_cia.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_mikasa.c b/arch/alpha/kernel/sys_mikasa.c index 298fac1b2c19..fb7bf56c367d 100644 --- a/arch/alpha/kernel/sys_mikasa.c +++ b/arch/alpha/kernel/sys_mikasa.c @@ -26,6 +26,7 @@ #include <asm/pgtable.h> #include <asm/core_apecs.h> #include <asm/core_cia.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_nautilus.c b/arch/alpha/kernel/sys_nautilus.c index bd8e9ea221b5..cbe8bbb8e5f0 100644 --- a/arch/alpha/kernel/sys_nautilus.c +++ b/arch/alpha/kernel/sys_nautilus.c @@ -43,6 +43,7 @@ #include <asm/pgtable.h> #include <asm/core_irongate.h> #include <asm/hwrpb.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index 950fffcf187d..16ea1329f3e1 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c @@ -27,6 +27,7 @@ #include <asm/pgtable.h> #include <asm/core_apecs.h> #include <asm/core_cia.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_rawhide.c b/arch/alpha/kernel/sys_rawhide.c index d8947bf07d93..6518097f7bd4 100644 --- a/arch/alpha/kernel/sys_rawhide.c +++ b/arch/alpha/kernel/sys_rawhide.c @@ -23,6 +23,7 @@ #include <asm/io.h> #include <asm/pgtable.h> #include <asm/core_mcpcia.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_ruffian.c b/arch/alpha/kernel/sys_ruffian.c index fa2a55dbee28..a1966a07b8b3 100644 --- a/arch/alpha/kernel/sys_ruffian.c +++ b/arch/alpha/kernel/sys_ruffian.c @@ -24,6 +24,7 @@ #include <asm/io.h> #include <asm/pgtable.h> #include <asm/core_cia.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_rx164.c b/arch/alpha/kernel/sys_rx164.c index fa237282ca84..36aa640556e8 100644 --- a/arch/alpha/kernel/sys_rx164.c +++ b/arch/alpha/kernel/sys_rx164.c @@ -24,6 +24,7 @@ #include <asm/io.h> #include <asm/pgtable.h> #include <asm/core_polaris.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index 563bfba72115..6255f9cab307 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c @@ -24,6 +24,7 @@ #include <asm/io.h> #include <asm/pgtable.h> #include <asm/core_t2.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_sio.c b/arch/alpha/kernel/sys_sio.c index f84b750dcff4..a371399a2e3a 100644 --- a/arch/alpha/kernel/sys_sio.c +++ b/arch/alpha/kernel/sys_sio.c @@ -29,6 +29,7 @@ #include <asm/pgtable.h> #include <asm/core_apecs.h> #include <asm/core_lca.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_sx164.c b/arch/alpha/kernel/sys_sx164.c index 9c9f1b1a4eb7..efcf059d3d8c 100644 --- a/arch/alpha/kernel/sys_sx164.c +++ b/arch/alpha/kernel/sys_sx164.c @@ -25,6 +25,7 @@ #include <asm/pgtable.h> #include <asm/core_cia.h> #include <asm/hwrpb.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c index c6d858f91a84..6af89e81b028 100644 --- a/arch/alpha/kernel/sys_takara.c +++ b/arch/alpha/kernel/sys_takara.c @@ -23,6 +23,7 @@ #include <asm/io.h> #include <asm/pgtable.h> #include <asm/core_cia.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index 846fb3d3251f..c6ed45836e7d 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c @@ -28,6 +28,7 @@ #include <asm/pgtable.h> #include <asm/core_titan.h> #include <asm/hwrpb.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c index dbc4bee484c6..bccbbdc0c678 100644 --- a/arch/alpha/kernel/sys_wildfire.c +++ b/arch/alpha/kernel/sys_wildfire.c @@ -23,6 +23,7 @@ #include <asm/pgtable.h> #include <asm/core_wildfire.h> #include <asm/hwrpb.h> +#include <asm/tlbflush.h> #include "proto.h" #include "irq_impl.h" diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c index 6c8c54277c36..77ca3cca1386 100644 --- a/arch/alpha/mm/fault.c +++ b/arch/alpha/mm/fault.c @@ -12,7 +12,7 @@ #define __EXTERN_INLINE inline #include <asm/mmu_context.h> -#include <asm/pgalloc.h> +#include <asm/tlbflush.h> #undef __EXTERN_INLINE #include <linux/signal.h> diff --git a/arch/i386/kernel/acpi.c b/arch/i386/kernel/acpi.c index 1fc9d6866aaa..05b0f590d105 100644 --- a/arch/i386/kernel/acpi.c +++ b/arch/i386/kernel/acpi.c @@ -43,6 +43,7 @@ #include <asm/pgtable.h> #include <asm/pgalloc.h> #include <asm/io_apic.h> +#include <asm/tlbflush.h> #define PREFIX "ACPI: " diff --git a/arch/i386/kernel/vm86.c b/arch/i386/kernel/vm86.c index 6276c73955bb..195a2b943908 100644 --- a/arch/i386/kernel/vm86.c +++ b/arch/i386/kernel/vm86.c @@ -12,10 +12,12 @@ #include <linux/mm.h> #include <linux/smp.h> #include <linux/smp_lock.h> +#include <linux/highmem.h> #include <asm/uaccess.h> #include <asm/pgalloc.h> #include <asm/io.h> +#include <asm/tlbflush.h> /* * Known problems: diff --git a/arch/i386/mm/init.c b/arch/i386/mm/init.c index 702b4a45e56b..68011bc71509 100644 --- a/arch/i386/mm/init.c +++ b/arch/i386/mm/init.c @@ -37,6 +37,7 @@ #include <asm/e820.h> #include <asm/apic.h> #include <asm/tlb.h> +#include <asm/tlbflush.h> mmu_gather_t mmu_gathers[NR_CPUS]; unsigned long highstart_pfn, highend_pfn; @@ -573,7 +574,8 @@ void si_meminfo(struct sysinfo *val) } #if defined(CONFIG_X86_PAE) -struct kmem_cache_s *pae_pgd_cachep; +static struct kmem_cache_s *pae_pgd_cachep; + void __init pgtable_cache_init(void) { /* @@ -584,4 +586,96 @@ void __init pgtable_cache_init(void) if (!pae_pgd_cachep) panic("init_pae(): Cannot alloc pae_pgd SLAB cache"); } + +pgd_t *pgd_alloc(struct mm_struct *mm) +{ + int i; + pgd_t *pgd = kmem_cache_alloc(pae_pgd_cachep, GFP_KERNEL); + + if (pgd) { + for (i = 0; i < USER_PTRS_PER_PGD; i++) { + unsigned long pmd = __get_free_page(GFP_KERNEL); + if (!pmd) + goto out_oom; + clear_page(pmd); + set_pgd(pgd + i, __pgd(1 + __pa(pmd))); + } + memcpy(pgd + USER_PTRS_PER_PGD, + swapper_pg_dir + USER_PTRS_PER_PGD, + (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); + } + return pgd; +out_oom: + for (i--; i >= 0; i--) + free_page((unsigned long)__va(pgd_val(pgd[i])-1)); + kmem_cache_free(pae_pgd_cachep, pgd); + return NULL; +} + +void pgd_free(pgd_t *pgd) +{ + int i; + + for (i = 0; i < USER_PTRS_PER_PGD; i++) + free_page((unsigned long)__va(pgd_val(pgd[i])-1)); + kmem_cache_free(pae_pgd_cachep, pgd); +} + +#else + +pgd_t *pgd_alloc(struct mm_struct *mm) +{ + pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL); + + if (pgd) { + memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t)); + memcpy(pgd + USER_PTRS_PER_PGD, + swapper_pg_dir + USER_PTRS_PER_PGD, + (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); + } + return pgd; +} + +void pgd_free(pgd_t *pgd) +{ + free_page((unsigned long)pgd); +} #endif /* CONFIG_X86_PAE */ + +pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) +{ + int count = 0; + pte_t *pte; + + do { + pte = (pte_t *) __get_free_page(GFP_KERNEL); + if (pte) + clear_page(pte); + else { + current->state = TASK_UNINTERRUPTIBLE; + schedule_timeout(HZ); + } + } while (!pte && (count++ < 10)); + return pte; +} + +struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) +{ + int count = 0; + struct page *pte; + + do { +#if CONFIG_HIGHPTE + pte = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, 0); +#else + pte = alloc_pages(GFP_KERNEL, 0); +#endif + if (pte) + clear_highpage(pte); + else { + current->state = TASK_UNINTERRUPTIBLE; + schedule_timeout(HZ); + } + } while (!pte && (count++ < 10)); + return pte; +} diff --git a/arch/i386/mm/ioremap.c b/arch/i386/mm/ioremap.c index 043accaad82c..7af37a5c9161 100644 --- a/arch/i386/mm/ioremap.c +++ b/arch/i386/mm/ioremap.c @@ -11,6 +11,9 @@ #include <linux/vmalloc.h> #include <asm/io.h> #include <asm/pgalloc.h> +#include <asm/cacheflush.h> +#include <asm/tlbflush.h> + static inline void remap_area_pte(pte_t * pte, unsigned long address, unsigned long size, unsigned long phys_addr, unsigned long flags) |
