WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] x86: Clean up {alloc, free}_xen_pagetable

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] x86: Clean up {alloc, free}_xen_pagetable() interface to avoid use of
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 26 Feb 2007 15:45:43 -0800
Delivery-date: Mon, 26 Feb 2007 15:46:12 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1172507117 0
# Node ID 9e5e94942045ac09a4d3e4aa87ef49e226b79d56
# Parent  45ddffd595a1a1bcf87ad3823143e37dab459fdd
x86: Clean up {alloc,free}_xen_pagetable() interface to avoid use of
frame_table variable before initialisation. This wasn't a bug, but was
confusing.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 xen/arch/x86/mm.c          |    6 +++---
 xen/arch/x86/x86_32/mm.c   |   25 +++++++++++++------------
 xen/arch/x86/x86_64/mm.c   |   29 +++++++++++++++++------------
 xen/include/asm-x86/page.h |    4 ++--
 4 files changed, 35 insertions(+), 29 deletions(-)

diff -r 45ddffd595a1 -r 9e5e94942045 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Mon Feb 26 15:50:50 2007 +0000
+++ b/xen/arch/x86/mm.c Mon Feb 26 16:25:17 2007 +0000
@@ -3401,7 +3401,7 @@ int map_pages_to_xen(
             {
                 local_flush_tlb_pge();
                 if ( !(l2e_get_flags(ol2e) & _PAGE_PSE) )
-                    free_xen_pagetable(l2e_get_page(ol2e));
+                    free_xen_pagetable(page_to_virt(l2e_get_page(ol2e)));
             }
 
             virt    += 1UL << L2_PAGETABLE_SHIFT;
@@ -3413,14 +3413,14 @@ int map_pages_to_xen(
             /* Normal page mapping. */
             if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) )
             {
-                pl1e = page_to_virt(alloc_xen_pagetable());
+                pl1e = alloc_xen_pagetable();
                 clear_page(pl1e);
                 l2e_write(pl2e, l2e_from_page(virt_to_page(pl1e),
                                               __PAGE_HYPERVISOR));
             }
             else if ( l2e_get_flags(*pl2e) & _PAGE_PSE )
             {
-                pl1e = page_to_virt(alloc_xen_pagetable());
+                pl1e = alloc_xen_pagetable();
                 for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
                     l1e_write(&pl1e[i],
                               l1e_from_pfn(l2e_get_pfn(*pl2e) + i,
diff -r 45ddffd595a1 -r 9e5e94942045 xen/arch/x86/x86_32/mm.c
--- a/xen/arch/x86/x86_32/mm.c  Mon Feb 26 15:50:50 2007 +0000
+++ b/xen/arch/x86/x86_32/mm.c  Mon Feb 26 16:25:17 2007 +0000
@@ -35,26 +35,27 @@ unsigned int PAGE_HYPERVISOR_NOCACHE = _
 
 static unsigned long mpt_size;
 
-struct page_info *alloc_xen_pagetable(void)
+void *alloc_xen_pagetable(void)
 {
     extern int early_boot;
     extern unsigned long xenheap_phys_start;
-    struct page_info *pg;
+    unsigned long mfn;
 
     if ( !early_boot )
     {
         void *v = alloc_xenheap_page();
-        return ((v == NULL) ? NULL : virt_to_page(v));
-    }
-
-    pg = maddr_to_page(xenheap_phys_start);
+        BUG_ON(v == NULL);
+        return v;
+    }
+
+    mfn = xenheap_phys_start >> PAGE_SHIFT;
     xenheap_phys_start += PAGE_SIZE;
-    return pg;
-}
-
-void free_xen_pagetable(struct page_info *pg)
-{
-    free_xenheap_page(page_to_virt(pg));
+    return mfn_to_virt(mfn);
+}
+
+void free_xen_pagetable(void *v)
+{
+    free_xenheap_page(v);
 }
 
 l2_pgentry_t *virt_to_xen_l2e(unsigned long v)
diff -r 45ddffd595a1 -r 9e5e94942045 xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c  Mon Feb 26 15:50:50 2007 +0000
+++ b/xen/arch/x86/x86_64/mm.c  Mon Feb 26 16:25:17 2007 +0000
@@ -36,22 +36,27 @@ unsigned int m2p_compat_vstart = __HYPER
 unsigned int m2p_compat_vstart = __HYPERVISOR_COMPAT_VIRT_START;
 #endif
 
-struct page_info *alloc_xen_pagetable(void)
+void *alloc_xen_pagetable(void)
 {
     extern int early_boot;
-    unsigned long pfn;
+    unsigned long mfn;
 
     if ( !early_boot )
-        return alloc_domheap_page(NULL);
+    {
+        struct page_info *pg = alloc_domheap_page(NULL);
+        BUG_ON(pg == NULL);
+        return page_to_virt(pg);
+    }
 
     /* Early pagetables must come from low 1GB of memory. */
-    pfn = alloc_boot_low_pages(1, 1); /* 0x0 - 0x40000000 */
-    return ((pfn == 0) ? NULL : mfn_to_page(pfn));
-}
-
-void free_xen_pagetable(struct page_info *pg)
-{
-    free_domheap_page(pg);
+    mfn = alloc_boot_low_pages(1, 1); /* 0x0 - 0x40000000 */
+    BUG_ON(mfn == 0);
+    return mfn_to_virt(mfn);
+}
+
+void free_xen_pagetable(void *v)
+{
+    free_domheap_page(virt_to_page(v));
 }
 
 l2_pgentry_t *virt_to_xen_l2e(unsigned long v)
@@ -63,7 +68,7 @@ l2_pgentry_t *virt_to_xen_l2e(unsigned l
     pl4e = &idle_pg_table[l4_table_offset(v)];
     if ( !(l4e_get_flags(*pl4e) & _PAGE_PRESENT) )
     {
-        pl3e = page_to_virt(alloc_xen_pagetable());
+        pl3e = alloc_xen_pagetable();
         clear_page(pl3e);
         l4e_write(pl4e, l4e_from_paddr(__pa(pl3e), __PAGE_HYPERVISOR));
     }
@@ -71,7 +76,7 @@ l2_pgentry_t *virt_to_xen_l2e(unsigned l
     pl3e = l4e_to_l3e(*pl4e) + l3_table_offset(v);
     if ( !(l3e_get_flags(*pl3e) & _PAGE_PRESENT) )
     {
-        pl2e = page_to_virt(alloc_xen_pagetable());
+        pl2e = alloc_xen_pagetable();
         clear_page(pl2e);
         l3e_write(pl3e, l3e_from_paddr(__pa(pl2e), __PAGE_HYPERVISOR));
     }
diff -r 45ddffd595a1 -r 9e5e94942045 xen/include/asm-x86/page.h
--- a/xen/include/asm-x86/page.h        Mon Feb 26 15:50:50 2007 +0000
+++ b/xen/include/asm-x86/page.h        Mon Feb 26 16:25:17 2007 +0000
@@ -363,8 +363,8 @@ static inline int get_order_from_pages(u
 }
 
 /* Allocator functions for Xen pagetables. */
-struct page_info *alloc_xen_pagetable(void);
-void free_xen_pagetable(struct page_info *pg);
+void *alloc_xen_pagetable(void);
+void free_xen_pagetable(void *v);
 l2_pgentry_t *virt_to_xen_l2e(unsigned long v);
 
 /* Map machine page range in Xen virtual address space. */

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] x86: Clean up {alloc, free}_xen_pagetable() interface to avoid use of, Xen patchbot-unstable <=