bitkeeper revision 1.1159.258.55 (42361018TeYmwjC8C6haDMNI9sjHUw)
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Mon, 14 Mar 2005 22:28:40 +0000 (22:28 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Mon, 14 Mar 2005 22:28:40 +0000 (22:28 +0000)
Fix highmem patches to use PageHighMem instead of highmem_start_page.
Signed-off-by: Keir Fraser <keir@xensource.com>
linux-2.6.11-xen-sparse/arch/xen/i386/mm/highmem.c
linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c
linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/highmem.h

index 7f771f81fd4627b0d0f12050a06eb93ef02f2899..1bf278733f6d539344859b4c83ac40e35959ad0f 100644 (file)
@@ -25,7 +25,7 @@ void kunmap(struct page *page)
  * However when holding an atomic kmap is is not legal to sleep, so atomic
  * kmaps are appropriate for short, tight code paths only.
  */
-void *kmap_atomic(struct page *page, enum km_type type)
+static void *__kmap_atomic(struct page *page, enum km_type type, pgprot_t prot)
 {
        enum fixed_addresses idx;
        unsigned long vaddr;
@@ -41,33 +41,21 @@ void *kmap_atomic(struct page *page, enum km_type type)
        if (!pte_none(*(kmap_pte-idx)))
                BUG();
 #endif
-       set_pte(kmap_pte-idx, mk_pte(page, kmap_prot));
+       set_pte(kmap_pte-idx, mk_pte(page, prot));
        __flush_tlb_one(vaddr);
 
        return (void*) vaddr;
 }
 
-/* Same as kmap_atomic but with PAGE_KERNEL_RO page protection */
-void *kmap_atomic_pte(struct page *page, enum km_type type)
+void *kmap_atomic(struct page *page, enum km_type type)
 {
-       enum fixed_addresses idx;
-       unsigned long vaddr;
-
-       /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
-       inc_preempt_count();
-       if (page < highmem_start_page)
-               return page_address(page);
-
-       idx = type + KM_TYPE_NR*smp_processor_id();
-       vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
-#ifdef CONFIG_DEBUG_HIGHMEM
-       if (!pte_none(*(kmap_pte-idx)))
-               BUG();
-#endif
-       set_pte(kmap_pte-idx, mk_pte(page, PAGE_KERNEL_RO));
-       __flush_tlb_one(vaddr);
+       return __kmap_atomic(page, type, kmap_prot);
+}
 
-       return (void*) vaddr;
+/* Same as kmap_atomic but with PAGE_KERNEL_RO page protection. */
+void *kmap_atomic_pte(struct page *page, enum km_type type)
+{
+       return __kmap_atomic(page, type, PAGE_KERNEL_RO);
 }
 
 void kunmap_atomic(void *kvaddr, enum km_type type)
@@ -97,31 +85,6 @@ void kunmap_atomic(void *kvaddr, enum km_type type)
        preempt_check_resched();
 }
 
-void kunmap_atomic_force(void *kvaddr, enum km_type type)
-{
-       unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-       enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
-
-       if (vaddr < FIXADDR_START) { // FIXME
-               dec_preempt_count();
-               preempt_check_resched();
-               return;
-       }
-
-       if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx))
-               BUG();
-
-       /*
-        * force other mappings to Oops if they'll try to access
-        * this pte without first remap it
-        */
-       pte_clear(kmap_pte-idx);
-       __flush_tlb_one(vaddr);
-
-       dec_preempt_count();
-       preempt_check_resched();
-}
-
 struct page *kmap_atomic_to_page(void *ptr)
 {
        unsigned long idx, vaddr = (unsigned long)ptr;
index 30e929ad51e25b68800ba925b6061c2af75681f4..6fe3f08632115a49ae19a58823464d0658828e99 100644 (file)
@@ -232,7 +232,7 @@ struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
        pte = alloc_pages(GFP_KERNEL|__GFP_HIGHMEM|__GFP_REPEAT|__GFP_ZERO, 0);
        if (pte == NULL)
                return pte;
-       if (pte >= highmem_start_page)
+       if (PageHighMem(pte))
                return pte;
        /* not a highmem page -- free page and grab one from the cache */
        __free_page(pte);
@@ -247,7 +247,7 @@ void pte_free(struct page *pte)
 {
        set_page_count(pte, 1);
 #ifdef CONFIG_HIGHPTE
-       if (pte < highmem_start_page)
+       if (!PageHighMem(pte))
 #endif
                kmem_cache_free(pte_cache,
                                phys_to_virt(page_to_pseudophys(pte)));
index 8273e2db97705d2cba6a152ee532521286f8bd90..e3e4a531d219693a2c3669f3783d277fa6eddb93 100644 (file)
@@ -73,7 +73,6 @@ void kunmap(struct page *page);
 void *kmap_atomic(struct page *page, enum km_type type);
 void *kmap_atomic_pte(struct page *page, enum km_type type);
 void kunmap_atomic(void *kvaddr, enum km_type type);
-void kunmap_atomic_force(void *kvaddr, enum km_type type);
 struct page *kmap_atomic_to_page(void *ptr);
 
 #define flush_cache_kmaps()    do { } while (0)