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

Add xen and xen-common

  • Property svn:mime-type set to text/x-patch
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 
    8484        unsigned long flags;
    8585
    8686        set_pte_atomic(kpte, pte);      /* change init_mm */
    87         if (PTRS_PER_PMD > 1)
     87        if (HAVE_SHARED_KERNEL_PMD)
    8888                return;
    8989
    9090        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 
    214214                spin_lock_irqsave(&pgd_lock, flags);
    215215        }
    216216
    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);
    220221        if (PTRS_PER_PMD > 1)
    221222                return;
    222223
    pgd_t *pgd_alloc(struct mm_struct *mm) 
    248249                        goto out_oom;
    249250                set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
    250251        }
     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
    251276        return pgd;
    252277
    253278out_oom:
    void pgd_free(pgd_t *pgd) 
    262287        int i;
    263288
    264289        /* 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        }
    268307        /* in the non-PAE case, free_pgtables() clears user pgd entries */
    269308        kmem_cache_free(pgd_cache, pgd);
    270309}
  • 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  
    11#ifndef _I386_PGTABLE_2LEVEL_DEFS_H
    22#define _I386_PGTABLE_2LEVEL_DEFS_H
    33
     4#define HAVE_SHARED_KERNEL_PMD 0
     5
    46/*
    57 * traditional i386 two-level paging structure:
    68 */
  • 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  
    11#ifndef _I386_PGTABLE_3LEVEL_DEFS_H
    22#define _I386_PGTABLE_3LEVEL_DEFS_H
    33
     4#define HAVE_SHARED_KERNEL_PMD 1
     5
    46/*
    57 * PGDIR_SHIFT determines what a top-level page table entry can map
    68 */
Note: See TracBrowser for help on using the repository browser.