source:
trunk/packages/xen-3.1/xen-3.1/patches/linux-2.6.18/pmd-shared.patch
@
34
| Last change on this file since 34 was 34, checked in by hartmans, 18 years ago | |
|---|---|
|
|
| File size: 3.8 KB | |
-
arch/i386/mm/pageattr.c
diff -pruN ../orig-linux-2.6.18/arch/i386/mm/pageattr.c ./arch/i386/mm/pageattr.c
old new static void set_pmd_pte(pte_t *kpte, uns 84 84 unsigned long flags; 85 85 86 86 set_pte_atomic(kpte, pte); /* change init_mm */ 87 if ( PTRS_PER_PMD > 1)87 if (HAVE_SHARED_KERNEL_PMD) 88 88 return; 89 89 90 90 spin_lock_irqsave(&pgd_lock, flags); -
arch/i386/mm/pgtable.c
diff -pruN ../orig-linux-2.6.18/arch/i386/mm/pgtable.c ./arch/i386/mm/pgtable.c
old new void pgd_ctor(void *pgd, kmem_cache_t *c 214 214 spin_lock_irqsave(&pgd_lock, flags); 215 215 } 216 216 217 clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD, 218 swapper_pg_dir + USER_PTRS_PER_PGD, 219 KERNEL_PGD_PTRS); 217 if (PTRS_PER_PMD == 1 || HAVE_SHARED_KERNEL_PMD) 218 clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD, 219 swapper_pg_dir + USER_PTRS_PER_PGD, 220 KERNEL_PGD_PTRS); 220 221 if (PTRS_PER_PMD > 1) 221 222 return; 222 223 … … pgd_t *pgd_alloc(struct mm_struct *mm) 248 249 goto out_oom; 249 250 set_pgd(&pgd[i], __pgd(1 + __pa(pmd))); 250 251 } 252 253 if (!HAVE_SHARED_KERNEL_PMD) { 254 unsigned long flags; 255 256 for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) { 257 pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL); 258 if (!pmd) 259 goto out_oom; 260 set_pgd(&pgd[USER_PTRS_PER_PGD], __pgd(1 + __pa(pmd))); 261 } 262 263 spin_lock_irqsave(&pgd_lock, flags); 264 for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) { 265 unsigned long v = (unsigned long)i << PGDIR_SHIFT; 266 pgd_t *kpgd = pgd_offset_k(v); 267 pud_t *kpud = pud_offset(kpgd, v); 268 pmd_t *kpmd = pmd_offset(kpud, v); 269 pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1); 270 memcpy(pmd, kpmd, PAGE_SIZE); 271 } 272 pgd_list_add(pgd); 273 spin_unlock_irqrestore(&pgd_lock, flags); 274 } 275 251 276 return pgd; 252 277 253 278 out_oom: … … void pgd_free(pgd_t *pgd) 262 287 int i; 263 288 264 289 /* in the PAE case user pgd entries are overwritten before usage */ 265 if (PTRS_PER_PMD > 1) 266 for (i = 0; i < USER_PTRS_PER_PGD; ++i) 267 kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1)); 290 if (PTRS_PER_PMD > 1) { 291 for (i = 0; i < USER_PTRS_PER_PGD; ++i) { 292 pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1); 293 kmem_cache_free(pmd_cache, pmd); 294 } 295 if (!HAVE_SHARED_KERNEL_PMD) { 296 unsigned long flags; 297 spin_lock_irqsave(&pgd_lock, flags); 298 pgd_list_del(pgd); 299 spin_unlock_irqrestore(&pgd_lock, flags); 300 for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) { 301 pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1); 302 memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t)); 303 kmem_cache_free(pmd_cache, pmd); 304 } 305 } 306 } 268 307 /* in the non-PAE case, free_pgtables() clears user pgd entries */ 269 308 kmem_cache_free(pgd_cache, pgd); 270 309 } -
include/asm-i386/pgtable-2level-defs.h
diff -pruN ../orig-linux-2.6.18/include/asm-i386/pgtable-2level-defs.h ./include/asm-i386/pgtable-2level-defs.h
old new 1 1 #ifndef _I386_PGTABLE_2LEVEL_DEFS_H 2 2 #define _I386_PGTABLE_2LEVEL_DEFS_H 3 3 4 #define HAVE_SHARED_KERNEL_PMD 0 5 4 6 /* 5 7 * traditional i386 two-level paging structure: 6 8 */ -
include/asm-i386/pgtable-3level-defs.h
diff -pruN ../orig-linux-2.6.18/include/asm-i386/pgtable-3level-defs.h ./include/asm-i386/pgtable-3level-defs.h
old new 1 1 #ifndef _I386_PGTABLE_3LEVEL_DEFS_H 2 2 #define _I386_PGTABLE_3LEVEL_DEFS_H 3 3 4 #define HAVE_SHARED_KERNEL_PMD 1 5 4 6 /* 5 7 * PGDIR_SHIFT determines what a top-level page table entry can map 6 8 */
Note: See TracBrowser
for help on using the repository browser.
