[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xen-cvs
Subject:    [Xen-changelog] Fix infinite recursion loop in get_page_type()
From:       Xen patchbot-unstable <patchbot-unstable () lists ! xensource ! com>
Date:       2006-05-31 7:44:13
Message-ID: E1FlLNG-0002kL-40 () xenbits ! xensource ! com
[Download RAW message or body]

# HG changeset patch
# User kaf24@firebug.cl.cam.ac.uk
# Node ID c43080e63545c2c9ba101fd8864b5aacc5d666e2
# Parent  e58e04589d11429132d8abe12d19e64484970f62
Fix infinite recursion loop in get_page_type() error path.
Signed-off-by: Keir Fraser <keir@xensource.com>
---
 xen/arch/x86/mm.c |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)

diff -r e58e04589d11 -r c43080e63545 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c	Tue May 30 13:29:29 2006 +0100
+++ b/xen/arch/x86/mm.c	Tue May 30 18:11:34 2006 +0100
@@ -1598,12 +1598,18 @@ int get_page_type(struct page_info *page
             {
                 if ( unlikely((x & PGT_type_mask) != (type & PGT_type_mask) ) )
                 {
-                    if ( current->domain == page_get_owner(page) )
+                    if ( (current->domain == page_get_owner(page)) &&
+                         ((x & PGT_type_mask) == PGT_writable_page) )
                     {
                         /*
                          * This ensures functions like set_gdt() see up-to-date
                          * type info without needing to clean up writable p.t.
-                         * state on the fast path.
+                         * state on the fast path. We take this path only
+                         * when the current type is writable because:
+                         *  1. It's the only type that this path can decrement.
+                         *  2. If we take this path more liberally then we can
+                         *     enter a recursive loop via get_page_from_l1e()
+                         *     during pagetable revalidation.
                          */
                         LOCK_BIGLOCK(current->domain);
                         cleanup_writable_pagetable(current->domain);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic