diff options
| -rw-r--r-- | arch/x86/include/asm/highmem.h | 4 | ||||
| -rw-r--r-- | arch/x86/include/asm/paravirt.h | 9 | ||||
| -rw-r--r-- | arch/x86/include/asm/paravirt_types.h | 4 | ||||
| -rw-r--r-- | arch/x86/include/asm/pgtable_32.h | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/paravirt.c | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/vmi_32.c | 35 | ||||
| -rw-r--r-- | arch/x86/xen/enlighten.c | 7 | ||||
| -rw-r--r-- | arch/x86/xen/mmu.c | 21 | ||||
| -rw-r--r-- | kernel/resource.c | 9 |
9 files changed, 21 insertions, 76 deletions
diff --git a/arch/x86/include/asm/highmem.h b/arch/x86/include/asm/highmem.h index 014c2b85ae45..a726650fc80f 100644 --- a/arch/x86/include/asm/highmem.h +++ b/arch/x86/include/asm/highmem.h | |||
| @@ -66,10 +66,6 @@ void *kmap_atomic_pfn(unsigned long pfn, enum km_type type); | |||
| 66 | void *kmap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot); | 66 | void *kmap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot); |
| 67 | struct page *kmap_atomic_to_page(void *ptr); | 67 | struct page *kmap_atomic_to_page(void *ptr); |
| 68 | 68 | ||
| 69 | #ifndef CONFIG_PARAVIRT | ||
| 70 | #define kmap_atomic_pte(page, type) kmap_atomic(page, type) | ||
| 71 | #endif | ||
| 72 | |||
| 73 | #define flush_cache_kmaps() do { } while (0) | 69 | #define flush_cache_kmaps() do { } while (0) |
| 74 | 70 | ||
| 75 | extern void add_highpages_with_active_regions(int nid, unsigned long start_pfn, | 71 | extern void add_highpages_with_active_regions(int nid, unsigned long start_pfn, |
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index dd59a85a918f..5653f43d90e5 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h | |||
| @@ -435,15 +435,6 @@ static inline void paravirt_release_pud(unsigned long pfn) | |||
| 435 | PVOP_VCALL1(pv_mmu_ops.release_pud, pfn); | 435 | PVOP_VCALL1(pv_mmu_ops.release_pud, pfn); |
| 436 | } | 436 | } |
| 437 | 437 | ||
| 438 | #ifdef CONFIG_HIGHPTE | ||
| 439 | static inline void *kmap_atomic_pte(struct page *page, enum km_type type) | ||
| 440 | { | ||
| 441 | unsigned long ret; | ||
| 442 | ret = PVOP_CALL2(unsigned long, pv_mmu_ops.kmap_atomic_pte, page, type); | ||
| 443 | return (void *)ret; | ||
| 444 | } | ||
| 445 | #endif | ||
| 446 | |||
| 447 | static inline void pte_update(struct mm_struct *mm, unsigned long addr, | 438 | static inline void pte_update(struct mm_struct *mm, unsigned long addr, |
| 448 | pte_t *ptep) | 439 | pte_t *ptep) |
| 449 | { | 440 | { |
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h index b1e70d51e40c..db9ef5532341 100644 --- a/arch/x86/include/asm/paravirt_types.h +++ b/arch/x86/include/asm/paravirt_types.h | |||
| @@ -304,10 +304,6 @@ struct pv_mmu_ops { | |||
| 304 | #endif /* PAGETABLE_LEVELS == 4 */ | 304 | #endif /* PAGETABLE_LEVELS == 4 */ |
| 305 | #endif /* PAGETABLE_LEVELS >= 3 */ | 305 | #endif /* PAGETABLE_LEVELS >= 3 */ |
| 306 | 306 | ||
| 307 | #ifdef CONFIG_HIGHPTE | ||
| 308 | void *(*kmap_atomic_pte)(struct page *page, enum km_type type); | ||
| 309 | #endif | ||
| 310 | |||
| 311 | struct pv_lazy_ops lazy_mode; | 307 | struct pv_lazy_ops lazy_mode; |
| 312 | 308 | ||
| 313 | /* dom0 ops */ | 309 | /* dom0 ops */ |
diff --git a/arch/x86/include/asm/pgtable_32.h b/arch/x86/include/asm/pgtable_32.h index a28668396508..47339a1ac7b6 100644 --- a/arch/x86/include/asm/pgtable_32.h +++ b/arch/x86/include/asm/pgtable_32.h | |||
| @@ -54,10 +54,10 @@ extern void set_pmd_pfn(unsigned long, unsigned long, pgprot_t); | |||
| 54 | in_irq() ? KM_IRQ_PTE : \ | 54 | in_irq() ? KM_IRQ_PTE : \ |
| 55 | KM_PTE0) | 55 | KM_PTE0) |
| 56 | #define pte_offset_map(dir, address) \ | 56 | #define pte_offset_map(dir, address) \ |
| 57 | ((pte_t *)kmap_atomic_pte(pmd_page(*(dir)), __KM_PTE) + \ | 57 | ((pte_t *)kmap_atomic(pmd_page(*(dir)), __KM_PTE) + \ |
| 58 | pte_index((address))) | 58 | pte_index((address))) |
| 59 | #define pte_offset_map_nested(dir, address) \ | 59 | #define pte_offset_map_nested(dir, address) \ |
| 60 | ((pte_t *)kmap_atomic_pte(pmd_page(*(dir)), KM_PTE1) + \ | 60 | ((pte_t *)kmap_atomic(pmd_page(*(dir)), KM_PTE1) + \ |
| 61 | pte_index((address))) | 61 | pte_index((address))) |
| 62 | #define pte_unmap(pte) kunmap_atomic((pte), __KM_PTE) | 62 | #define pte_unmap(pte) kunmap_atomic((pte), __KM_PTE) |
| 63 | #define pte_unmap_nested(pte) kunmap_atomic((pte), KM_PTE1) | 63 | #define pte_unmap_nested(pte) kunmap_atomic((pte), KM_PTE1) |
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index 1b1739d16310..1db183ed7c01 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c | |||
| @@ -428,10 +428,6 @@ struct pv_mmu_ops pv_mmu_ops = { | |||
| 428 | .ptep_modify_prot_start = __ptep_modify_prot_start, | 428 | .ptep_modify_prot_start = __ptep_modify_prot_start, |
| 429 | .ptep_modify_prot_commit = __ptep_modify_prot_commit, | 429 | .ptep_modify_prot_commit = __ptep_modify_prot_commit, |
| 430 | 430 | ||
| 431 | #ifdef CONFIG_HIGHPTE | ||
| 432 | .kmap_atomic_pte = kmap_atomic, | ||
| 433 | #endif | ||
| 434 | |||
| 435 | #if PAGETABLE_LEVELS >= 3 | 431 | #if PAGETABLE_LEVELS >= 3 |
| 436 | #ifdef CONFIG_X86_PAE | 432 | #ifdef CONFIG_X86_PAE |
| 437 | .set_pte_atomic = native_set_pte_atomic, | 433 | .set_pte_atomic = native_set_pte_atomic, |
diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c index d430e4c30193..7dd599deca4a 100644 --- a/arch/x86/kernel/vmi_32.c +++ b/arch/x86/kernel/vmi_32.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <asm/fixmap.h> | 33 | #include <asm/fixmap.h> |
| 34 | #include <asm/apicdef.h> | 34 | #include <asm/apicdef.h> |
| 35 | #include <asm/apic.h> | 35 | #include <asm/apic.h> |
| 36 | #include <asm/pgalloc.h> | ||
| 36 | #include <asm/processor.h> | 37 | #include <asm/processor.h> |
| 37 | #include <asm/timer.h> | 38 | #include <asm/timer.h> |
| 38 | #include <asm/vmi_time.h> | 39 | #include <asm/vmi_time.h> |
| @@ -266,30 +267,6 @@ static void vmi_nop(void) | |||
| 266 | { | 267 | { |
| 267 | } | 268 | } |
| 268 | 269 | ||
| 269 | #ifdef CONFIG_HIGHPTE | ||
| 270 | static void *vmi_kmap_atomic_pte(struct page *page, enum km_type type) | ||
| 271 | { | ||
| 272 | void *va = kmap_atomic(page, type); | ||
| 273 | |||
| 274 | /* | ||
| 275 | * Internally, the VMI ROM must map virtual addresses to physical | ||
| 276 | * addresses for processing MMU updates. By the time MMU updates | ||
| 277 | * are issued, this information is typically already lost. | ||
| 278 | * Fortunately, the VMI provides a cache of mapping slots for active | ||
| 279 | * page tables. | ||
| 280 | * | ||
| 281 | * We use slot zero for the linear mapping of physical memory, and | ||
| 282 | * in HIGHPTE kernels, slot 1 and 2 for KM_PTE0 and KM_PTE1. | ||
| 283 | * | ||
| 284 | * args: SLOT VA COUNT PFN | ||
| 285 | */ | ||
| 286 | BUG_ON(type != KM_PTE0 && type != KM_PTE1); | ||
| 287 | vmi_ops.set_linear_mapping((type - KM_PTE0)+1, va, 1, page_to_pfn(page)); | ||
| 288 | |||
| 289 | return va; | ||
| 290 | } | ||
| 291 | #endif | ||
| 292 | |||
| 293 | static void vmi_allocate_pte(struct mm_struct *mm, unsigned long pfn) | 270 | static void vmi_allocate_pte(struct mm_struct *mm, unsigned long pfn) |
| 294 | { | 271 | { |
| 295 | vmi_ops.allocate_page(pfn, VMI_PAGE_L1, 0, 0, 0); | 272 | vmi_ops.allocate_page(pfn, VMI_PAGE_L1, 0, 0, 0); |
| @@ -640,6 +617,12 @@ static inline int __init activate_vmi(void) | |||
| 640 | u64 reloc; | 617 | u64 reloc; |
| 641 | const struct vmi_relocation_info *rel = (struct vmi_relocation_info *)&reloc; | 618 | const struct vmi_relocation_info *rel = (struct vmi_relocation_info *)&reloc; |
| 642 | 619 | ||
| 620 | /* | ||
| 621 | * Prevent page tables from being allocated in highmem, even if | ||
| 622 | * CONFIG_HIGHPTE is enabled. | ||
| 623 | */ | ||
| 624 | __userpte_alloc_gfp &= ~__GFP_HIGHMEM; | ||
| 625 | |||
| 643 | if (call_vrom_func(vmi_rom, vmi_init) != 0) { | 626 | if (call_vrom_func(vmi_rom, vmi_init) != 0) { |
| 644 | printk(KERN_ERR "VMI ROM failed to initialize!"); | 627 | printk(KERN_ERR "VMI ROM failed to initialize!"); |
| 645 | return 0; | 628 | return 0; |
| @@ -778,10 +761,6 @@ static inline int __init activate_vmi(void) | |||
| 778 | 761 | ||
| 779 | /* Set linear is needed in all cases */ | 762 | /* Set linear is needed in all cases */ |
| 780 | vmi_ops.set_linear_mapping = vmi_get_function(VMI_CALL_SetLinearMapping); | 763 | vmi_ops.set_linear_mapping = vmi_get_function(VMI_CALL_SetLinearMapping); |
| 781 | #ifdef CONFIG_HIGHPTE | ||
| 782 | if (vmi_ops.set_linear_mapping) | ||
| 783 | pv_mmu_ops.kmap_atomic_pte = vmi_kmap_atomic_pte; | ||
| 784 | #endif | ||
| 785 | 764 | ||
| 786 | /* | 765 | /* |
| 787 | * These MUST always be patched. Don't support indirect jumps | 766 | * These MUST always be patched. Don't support indirect jumps |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 36daccb68642..b607239c1ba8 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #include <asm/traps.h> | 50 | #include <asm/traps.h> |
| 51 | #include <asm/setup.h> | 51 | #include <asm/setup.h> |
| 52 | #include <asm/desc.h> | 52 | #include <asm/desc.h> |
| 53 | #include <asm/pgalloc.h> | ||
| 53 | #include <asm/pgtable.h> | 54 | #include <asm/pgtable.h> |
| 54 | #include <asm/tlbflush.h> | 55 | #include <asm/tlbflush.h> |
| 55 | #include <asm/reboot.h> | 56 | #include <asm/reboot.h> |
| @@ -1094,6 +1095,12 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 1094 | 1095 | ||
| 1095 | __supported_pte_mask |= _PAGE_IOMAP; | 1096 | __supported_pte_mask |= _PAGE_IOMAP; |
| 1096 | 1097 | ||
| 1098 | /* | ||
| 1099 | * Prevent page tables from being allocated in highmem, even | ||
| 1100 | * if CONFIG_HIGHPTE is enabled. | ||
| 1101 | */ | ||
| 1102 | __userpte_alloc_gfp &= ~__GFP_HIGHMEM; | ||
| 1103 | |||
| 1097 | /* Work out if we support NX */ | 1104 | /* Work out if we support NX */ |
| 1098 | x86_configure_nx(); | 1105 | x86_configure_nx(); |
| 1099 | 1106 | ||
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index bf4cd6bfe959..f9eb7de74f42 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -1427,23 +1427,6 @@ static void xen_pgd_free(struct mm_struct *mm, pgd_t *pgd) | |||
| 1427 | #endif | 1427 | #endif |
| 1428 | } | 1428 | } |
| 1429 | 1429 | ||
| 1430 | #ifdef CONFIG_HIGHPTE | ||
| 1431 | static void *xen_kmap_atomic_pte(struct page *page, enum km_type type) | ||
| 1432 | { | ||
| 1433 | pgprot_t prot = PAGE_KERNEL; | ||
| 1434 | |||
| 1435 | if (PagePinned(page)) | ||
| 1436 | prot = PAGE_KERNEL_RO; | ||
| 1437 | |||
| 1438 | if (0 && PageHighMem(page)) | ||
| 1439 | printk("mapping highpte %lx type %d prot %s\n", | ||
| 1440 | page_to_pfn(page), type, | ||
| 1441 | (unsigned long)pgprot_val(prot) & _PAGE_RW ? "WRITE" : "READ"); | ||
| 1442 | |||
| 1443 | return kmap_atomic_prot(page, type, prot); | ||
| 1444 | } | ||
| 1445 | #endif | ||
| 1446 | |||
| 1447 | #ifdef CONFIG_X86_32 | 1430 | #ifdef CONFIG_X86_32 |
| 1448 | static __init pte_t mask_rw_pte(pte_t *ptep, pte_t pte) | 1431 | static __init pte_t mask_rw_pte(pte_t *ptep, pte_t pte) |
| 1449 | { | 1432 | { |
| @@ -1902,10 +1885,6 @@ static const struct pv_mmu_ops xen_mmu_ops __initdata = { | |||
| 1902 | .alloc_pmd_clone = paravirt_nop, | 1885 | .alloc_pmd_clone = paravirt_nop, |
| 1903 | .release_pmd = xen_release_pmd_init, | 1886 | .release_pmd = xen_release_pmd_init, |
| 1904 | 1887 | ||
| 1905 | #ifdef CONFIG_HIGHPTE | ||
| 1906 | .kmap_atomic_pte = xen_kmap_atomic_pte, | ||
| 1907 | #endif | ||
| 1908 | |||
| 1909 | #ifdef CONFIG_X86_64 | 1888 | #ifdef CONFIG_X86_64 |
| 1910 | .set_pte = xen_set_pte, | 1889 | .set_pte = xen_set_pte, |
| 1911 | #else | 1890 | #else |
diff --git a/kernel/resource.c b/kernel/resource.c index 4e9d87fd7bc5..2d5be5d9bf5f 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
| @@ -304,7 +304,7 @@ int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, | |||
| 304 | void *arg, int (*func)(unsigned long, unsigned long, void *)) | 304 | void *arg, int (*func)(unsigned long, unsigned long, void *)) |
| 305 | { | 305 | { |
| 306 | struct resource res; | 306 | struct resource res; |
| 307 | unsigned long pfn, len; | 307 | unsigned long pfn, end_pfn; |
| 308 | u64 orig_end; | 308 | u64 orig_end; |
| 309 | int ret = -1; | 309 | int ret = -1; |
| 310 | 310 | ||
| @@ -314,9 +314,10 @@ int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, | |||
| 314 | orig_end = res.end; | 314 | orig_end = res.end; |
| 315 | while ((res.start < res.end) && | 315 | while ((res.start < res.end) && |
| 316 | (find_next_system_ram(&res, "System RAM") >= 0)) { | 316 | (find_next_system_ram(&res, "System RAM") >= 0)) { |
| 317 | pfn = (unsigned long)(res.start >> PAGE_SHIFT); | 317 | pfn = (res.start + PAGE_SIZE - 1) >> PAGE_SHIFT; |
| 318 | len = (unsigned long)((res.end + 1 - res.start) >> PAGE_SHIFT); | 318 | end_pfn = (res.end + 1) >> PAGE_SHIFT; |
| 319 | ret = (*func)(pfn, len, arg); | 319 | if (end_pfn > pfn) |
| 320 | ret = (*func)(pfn, end_pfn - pfn, arg); | ||
| 320 | if (ret) | 321 | if (ret) |
| 321 | break; | 322 | break; |
| 322 | res.start = res.end + 1; | 323 | res.start = res.end + 1; |
