[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] linux/x86: fix clear_fixmap()



On i386-PAE, clear_fixmap() results in ill use of set_pte(). In all contexts,
p2m translations shouldn't occur here. Note that this is not really an issue
on native linux, as there is
(a) no pfn-to-mfn translation and
(b) __set_fixmap() takes an unsigned long physical address rather than a
paddr_t, which makes it so that bits 32 and up of the physical address are
always zero, permitting either order store when clearing the entry.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

Index: head-2006-11-06/arch/i386/mm/pgtable-xen.c
===================================================================
--- head-2006-11-06.orig/arch/i386/mm/pgtable-xen.c     2006-11-06 
09:07:40.000000000 +0100
+++ head-2006-11-06/arch/i386/mm/pgtable-xen.c  2006-11-06 12:22:54.000000000 
+0100
@@ -102,8 +102,11 @@ static void set_pte_pfn(unsigned long va
                return;
        }
        pte = pte_offset_kernel(pmd, vaddr);
-       /* <pfn,flags> stored as-is, to permit clearing entries */
-       set_pte(pte, pfn_pte(pfn, flags));
+       if (pgprot_val(flags))
+               /* <pfn,flags> stored as-is, to permit clearing entries */
+               set_pte(pte, pfn_pte(pfn, flags));
+       else
+               pte_clear(&init_mm, vaddr, pte);
 
        /*
         * It's enough to flush this one mapping.
@@ -140,8 +143,11 @@ static void set_pte_pfn_ma(unsigned long
                return;
        }
        pte = pte_offset_kernel(pmd, vaddr);
-       /* <pfn,flags> stored as-is, to permit clearing entries */
-       set_pte(pte, pfn_pte_ma(pfn, flags));
+       if (pgprot_val(flags))
+               /* <pfn,flags> stored as-is, to permit clearing entries */
+               set_pte(pte, pfn_pte_ma(pfn, flags));
+       else
+               pte_clear(&init_mm, vaddr, pte);
 
        /*
         * It's enough to flush this one mapping.
Index: head-2006-11-06/arch/x86_64/mm/init-xen.c
===================================================================
--- head-2006-11-06.orig/arch/x86_64/mm/init-xen.c      2006-11-06 
09:10:06.000000000 +0100
+++ head-2006-11-06/arch/x86_64/mm/init-xen.c   2006-11-06 12:19:49.000000000 
+0100
@@ -260,7 +260,10 @@ static __init void set_pte_phys(unsigned
                        return;
                }
        }
-       new_pte = pfn_pte(phys >> PAGE_SHIFT, prot);
+       if (pgprot_val(prot))
+               new_pte = pfn_pte(phys >> PAGE_SHIFT, prot);
+       else
+               new_pte = __pte(0);
 
        pte = pte_offset_kernel(pmd, vaddr);
        if (!pte_none(*pte) &&



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.