diff options
author | cl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk> | 2006-02-02 17:16:00 +0000 |
---|---|---|
committer | cl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk> | 2006-02-02 17:16:00 +0000 |
commit | d0b7c7a50917dca44b4a236434e9f453a0a93d35 (patch) | |
tree | 2550dee23614b8db614a53e4e1acd51f0f4c4b88 /patches/linux-2.6.15/pmd-shared.patch | |
parent | 2ec893ee8326c92d90acde0ac3b0f230bc724a6f (diff) | |
download | xen-d0b7c7a50917dca44b4a236434e9f453a0a93d35.tar.gz xen-d0b7c7a50917dca44b4a236434e9f453a0a93d35.tar.bz2 xen-d0b7c7a50917dca44b4a236434e9f453a0a93d35.zip |
Update patches for linux 2.6.15.
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
--HG--
rename : patches/linux-2.6.14/i386-mach-io-check-nmi.patch => patches/linux-2.6.15/i386-mach-io-check-nmi.patch
rename : patches/linux-2.6.14/net-csum.patch => patches/linux-2.6.15/net-csum.patch
rename : patches/linux-2.6.14/pmd-shared.patch => patches/linux-2.6.15/pmd-shared.patch
rename : patches/linux-2.6.14/smp-alts.patch => patches/linux-2.6.15/smp-alts.patch
Diffstat (limited to 'patches/linux-2.6.15/pmd-shared.patch')
-rw-r--r-- | patches/linux-2.6.15/pmd-shared.patch | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/patches/linux-2.6.15/pmd-shared.patch b/patches/linux-2.6.15/pmd-shared.patch new file mode 100644 index 0000000000..053e987fdb --- /dev/null +++ b/patches/linux-2.6.15/pmd-shared.patch @@ -0,0 +1,111 @@ +diff -pruN ../pristine-linux-2.6.15/arch/i386/mm/pageattr.c ./arch/i386/mm/pageattr.c +--- ../pristine-linux-2.6.15/arch/i386/mm/pageattr.c 2006-01-03 03:21:10.000000000 +0000 ++++ ./arch/i386/mm/pageattr.c 2006-02-02 17:15:14.000000000 +0000 +@@ -76,7 +76,7 @@ static void set_pmd_pte(pte_t *kpte, uns + unsigned long flags; + + set_pte_atomic(kpte, pte); /* change init_mm */ +- if (PTRS_PER_PMD > 1) ++ if (HAVE_SHARED_KERNEL_PMD) + return; + + spin_lock_irqsave(&pgd_lock, flags); +diff -pruN ../pristine-linux-2.6.15/arch/i386/mm/pgtable.c ./arch/i386/mm/pgtable.c +--- ../pristine-linux-2.6.15/arch/i386/mm/pgtable.c 2006-01-03 03:21:10.000000000 +0000 ++++ ./arch/i386/mm/pgtable.c 2006-02-02 17:15:14.000000000 +0000 +@@ -215,9 +215,10 @@ void pgd_ctor(void *pgd, kmem_cache_t *c + spin_lock_irqsave(&pgd_lock, flags); + } + +- clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD, +- swapper_pg_dir + USER_PTRS_PER_PGD, +- KERNEL_PGD_PTRS); ++ if (PTRS_PER_PMD == 1 || HAVE_SHARED_KERNEL_PMD) ++ clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD, ++ swapper_pg_dir + USER_PTRS_PER_PGD, ++ KERNEL_PGD_PTRS); + if (PTRS_PER_PMD > 1) + return; + +@@ -249,6 +250,30 @@ pgd_t *pgd_alloc(struct mm_struct *mm) + goto out_oom; + set_pgd(&pgd[i], __pgd(1 + __pa(pmd))); + } ++ ++ if (!HAVE_SHARED_KERNEL_PMD) { ++ unsigned long flags; ++ ++ for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) { ++ pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL); ++ if (!pmd) ++ goto out_oom; ++ set_pgd(&pgd[USER_PTRS_PER_PGD], __pgd(1 + __pa(pmd))); ++ } ++ ++ spin_lock_irqsave(&pgd_lock, flags); ++ for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) { ++ unsigned long v = (unsigned long)i << PGDIR_SHIFT; ++ pgd_t *kpgd = pgd_offset_k(v); ++ pud_t *kpud = pud_offset(kpgd, v); ++ pmd_t *kpmd = pmd_offset(kpud, v); ++ pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1); ++ memcpy(pmd, kpmd, PAGE_SIZE); ++ } ++ pgd_list_add(pgd); ++ spin_unlock_irqrestore(&pgd_lock, flags); ++ } ++ + return pgd; + + out_oom: +@@ -263,9 +288,23 @@ void pgd_free(pgd_t *pgd) + int i; + + /* in the PAE case user pgd entries are overwritten before usage */ +- if (PTRS_PER_PMD > 1) +- for (i = 0; i < USER_PTRS_PER_PGD; ++i) +- kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1)); ++ if (PTRS_PER_PMD > 1) { ++ for (i = 0; i < USER_PTRS_PER_PGD; ++i) { ++ pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1); ++ kmem_cache_free(pmd_cache, pmd); ++ } ++ if (!HAVE_SHARED_KERNEL_PMD) { ++ unsigned long flags; ++ spin_lock_irqsave(&pgd_lock, flags); ++ pgd_list_del(pgd); ++ spin_unlock_irqrestore(&pgd_lock, flags); ++ for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) { ++ pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1); ++ memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t)); ++ kmem_cache_free(pmd_cache, pmd); ++ } ++ } ++ } + /* in the non-PAE case, free_pgtables() clears user pgd entries */ + kmem_cache_free(pgd_cache, pgd); + } +diff -pruN ../pristine-linux-2.6.15/include/asm-i386/pgtable-2level-defs.h ./include/asm-i386/pgtable-2level-defs.h +--- ../pristine-linux-2.6.15/include/asm-i386/pgtable-2level-defs.h 2006-01-03 03:21:10.000000000 +0000 ++++ ./include/asm-i386/pgtable-2level-defs.h 2006-02-02 17:15:14.000000000 +0000 +@@ -1,6 +1,8 @@ + #ifndef _I386_PGTABLE_2LEVEL_DEFS_H + #define _I386_PGTABLE_2LEVEL_DEFS_H + ++#define HAVE_SHARED_KERNEL_PMD 0 ++ + /* + * traditional i386 two-level paging structure: + */ +diff -pruN ../pristine-linux-2.6.15/include/asm-i386/pgtable-3level-defs.h ./include/asm-i386/pgtable-3level-defs.h +--- ../pristine-linux-2.6.15/include/asm-i386/pgtable-3level-defs.h 2006-01-03 03:21:10.000000000 +0000 ++++ ./include/asm-i386/pgtable-3level-defs.h 2006-02-02 17:15:14.000000000 +0000 +@@ -1,6 +1,8 @@ + #ifndef _I386_PGTABLE_3LEVEL_DEFS_H + #define _I386_PGTABLE_3LEVEL_DEFS_H + ++#define HAVE_SHARED_KERNEL_PMD 1 ++ + /* + * PGDIR_SHIFT determines what a top-level page table entry can map + */ |