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] xen: Cleanups and bug fixes after the rcu

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] xen: Cleanups and bug fixes after the rcu_lock_domain patch.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 01 Mar 2007 08:10:18 -0800
Delivery-date: Thu, 01 Mar 2007 08:10:26 -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 1172749135 0
# Node ID 9d36026b1b431990163caf09da715cacdab7cae7
# Parent  3fb02f56c19f096edc6e3b23025389c84b41ec5d
xen: Cleanups and bug fixes after the rcu_lock_domain patch.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 xen/arch/ia64/vmx/vmx_hypercall.c |    3 +--
 xen/arch/ia64/xen/mm.c            |   17 ++++++++++-------
 xen/arch/powerpc/mm.c             |   14 +++++++++-----
 xen/arch/x86/hvm/hvm.c            |   14 ++++----------
 xen/arch/x86/mm.c                 |   24 +++++++++++-------------
 xen/common/domain.c               |    5 ++---
 xen/common/domctl.c               |    6 ++----
 xen/common/event_channel.c        |    2 +-
 xen/common/grant_table.c          |   14 ++------------
 xen/common/schedule.c             |    4 ++--
 xen/common/sysctl.c               |    7 -------
 xen/include/xen/sched.h           |   14 ++++++++++++++
 12 files changed, 58 insertions(+), 66 deletions(-)

diff -r 3fb02f56c19f -r 9d36026b1b43 xen/arch/ia64/vmx/vmx_hypercall.c
--- a/xen/arch/ia64/vmx/vmx_hypercall.c Thu Mar 01 11:08:49 2007 +0000
+++ b/xen/arch/ia64/vmx/vmx_hypercall.c Thu Mar 01 11:38:55 2007 +0000
@@ -122,8 +122,7 @@ do_hvm_op(unsigned long op, XEN_GUEST_HA
             return -EINVAL;
 
         if (a.domid == DOMID_SELF) {
-            get_knownalive_domain(current->domain);
-            d = current->domain;
+            d = get_current_domain();
         }
         else if (IS_PRIV(current->domain)) {
             d = get_domain_by_id(a.domid);
diff -r 3fb02f56c19f -r 9d36026b1b43 xen/arch/ia64/xen/mm.c
--- a/xen/arch/ia64/xen/mm.c    Thu Mar 01 11:08:49 2007 +0000
+++ b/xen/arch/ia64/xen/mm.c    Thu Mar 01 11:38:55 2007 +0000
@@ -435,11 +435,15 @@ share_xen_page_with_guest(struct page_in
     page_set_owner(page, d);
     wmb(); /* install valid domain ptr before updating refcnt. */
     ASSERT(page->count_info == 0);
-    page->count_info |= PGC_allocated | 1;
-
-    if ( unlikely(d->xenheap_pages++ == 0) )
-        get_knownalive_domain(d);
-    list_add_tail(&page->list, &d->xenpage_list);
+
+    /* Only add to the allocation list if the domain isn't dying. */
+    if ( !test_bit(_DOMF_dying, &d->domain_flags) )
+    {
+        page->count_info |= PGC_allocated | 1;
+        if ( unlikely(d->xenheap_pages++ == 0) )
+            get_knownalive_domain(d);
+        list_add_tail(&page->list, &d->xenpage_list);
+    }
 
     // grant_table_destroy() releases these pages.
     // but it doesn't clear their m2p entry. So there might remain stale
@@ -2057,8 +2061,7 @@ arch_memory_op(int op, XEN_GUEST_HANDLE(
             return -EFAULT;
 
         if (xatp.domid == DOMID_SELF) {
-            d = current->domain;
-            get_knownalive_domain(d);
+            d = get_current_domain();
         }
         else if (!IS_PRIV(current->domain))
             return -EPERM;
diff -r 3fb02f56c19f -r 9d36026b1b43 xen/arch/powerpc/mm.c
--- a/xen/arch/powerpc/mm.c     Thu Mar 01 11:08:49 2007 +0000
+++ b/xen/arch/powerpc/mm.c     Thu Mar 01 11:38:55 2007 +0000
@@ -80,11 +80,15 @@ void share_xen_page_with_guest(
     page_set_owner(page, d);
     wmb(); /* install valid domain ptr before updating refcnt. */
     ASSERT(page->count_info == 0);
-    page->count_info |= PGC_allocated | 1;
-
-    if ( unlikely(d->xenheap_pages++ == 0) )
-        get_knownalive_domain(d);
-    list_add_tail(&page->list, &d->xenpage_list);
+
+    /* Only add to the allocation list if the domain isn't dying. */
+    if ( !test_bit(_DOMF_dying, &d->domain_flags) )
+    {
+        page->count_info |= PGC_allocated | 1;
+        if ( unlikely(d->xenheap_pages++ == 0) )
+            get_knownalive_domain(d);
+        list_add_tail(&page->list, &d->xenpage_list);
+    }
 
     spin_unlock(&d->page_alloc_lock);
 }
diff -r 3fb02f56c19f -r 9d36026b1b43 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Thu Mar 01 11:08:49 2007 +0000
+++ b/xen/arch/x86/hvm/hvm.c    Thu Mar 01 11:38:55 2007 +0000
@@ -836,20 +836,14 @@ long do_hvm_op(unsigned long op, XEN_GUE
             return -EINVAL;
 
         if ( a.domid == DOMID_SELF )
-        {
-            get_knownalive_domain(current->domain);
-            d = current->domain;
-        }
+            d = rcu_lock_current_domain();
         else if ( IS_PRIV(current->domain) )
-        {
             d = rcu_lock_domain_by_id(a.domid);
-            if ( d == NULL )
-                return -ESRCH;
-        }
         else
-        {
             return -EPERM;
-        }
+
+        if ( d == NULL )
+            return -ESRCH;
 
         rc = -EINVAL;
         if ( !is_hvm_domain(d) )
diff -r 3fb02f56c19f -r 9d36026b1b43 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Thu Mar 01 11:08:49 2007 +0000
+++ b/xen/arch/x86/mm.c Thu Mar 01 11:38:55 2007 +0000
@@ -263,11 +263,15 @@ void share_xen_page_with_guest(
     page_set_owner(page, d);
     wmb(); /* install valid domain ptr before updating refcnt. */
     ASSERT(page->count_info == 0);
-    page->count_info |= PGC_allocated | 1;
-
-    if ( unlikely(d->xenheap_pages++ == 0) )
-        get_knownalive_domain(d);
-    list_add_tail(&page->list, &d->xenpage_list);
+
+    /* Only add to the allocation list if the domain isn't dying. */
+    if ( !test_bit(_DOMF_dying, &d->domain_flags) )
+    {
+        page->count_info |= PGC_allocated | 1;
+        if ( unlikely(d->xenheap_pages++ == 0) )
+            get_knownalive_domain(d);
+        list_add_tail(&page->list, &d->xenpage_list);
+    }
 
     spin_unlock(&d->page_alloc_lock);
 }
@@ -2960,10 +2964,7 @@ long arch_memory_op(int op, XEN_GUEST_HA
             return -EFAULT;
 
         if ( xatp.domid == DOMID_SELF )
-        {
-            d = current->domain;
-            get_knownalive_domain(d);
-        }
+            d = rcu_lock_current_domain();
         else if ( !IS_PRIV(current->domain) )
             return -EPERM;
         else if ( (d = rcu_lock_domain_by_id(xatp.domid)) == NULL )
@@ -3039,10 +3040,7 @@ long arch_memory_op(int op, XEN_GUEST_HA
             return -EINVAL;
 
         if ( fmap.domid == DOMID_SELF )
-        {
-            d = current->domain;
-            get_knownalive_domain(d);
-        }
+            d = rcu_lock_current_domain();
         else if ( !IS_PRIV(current->domain) )
             return -EPERM;
         else if ( (d = rcu_lock_domain_by_id(fmap.domid)) == NULL )
diff -r 3fb02f56c19f -r 9d36026b1b43 xen/common/domain.c
--- a/xen/common/domain.c       Thu Mar 01 11:08:49 2007 +0000
+++ b/xen/common/domain.c       Thu Mar 01 11:38:55 2007 +0000
@@ -345,8 +345,7 @@ void domain_pause_for_debugger(void)
     send_guest_global_virq(dom0, VIRQ_DEBUGGER);
 }
 
-/* Complete domain destroy after RCU readers are not holding 
-   old references */
+/* Complete domain destroy after RCU readers are not holding old references. */
 static void complete_domain_destroy(struct rcu_head *head)
 {
     struct domain *d = container_of(head, struct domain, rcu);
@@ -390,7 +389,7 @@ void domain_destroy(struct domain *d)
     rcu_assign_pointer(*pd, d->next_in_hashbucket);
     spin_unlock(&domlist_update_lock);
 
-    /* schedule RCU asynchronous completion of domain destroy */
+    /* Schedule RCU asynchronous completion of domain destroy. */
     call_rcu(&d->rcu, complete_domain_destroy);
 }
 
diff -r 3fb02f56c19f -r 9d36026b1b43 xen/common/domctl.c
--- a/xen/common/domctl.c       Thu Mar 01 11:08:49 2007 +0000
+++ b/xen/common/domctl.c       Thu Mar 01 11:38:55 2007 +0000
@@ -484,14 +484,12 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
                 break;
         }
 
-        if ( (d == NULL) || !get_domain(d) )
+        if ( d == NULL )
         {
             rcu_read_unlock(&domlist_read_lock);
             ret = -ESRCH;
             break;
         }
-
-        rcu_read_unlock(&domlist_read_lock);
 
         getdomaininfo(d, &op->u.getdomaininfo);
 
@@ -499,7 +497,7 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
         if ( copy_to_guest(u_domctl, op, 1) )
             ret = -EFAULT;
 
-        put_domain(d);
+        rcu_read_unlock(&domlist_read_lock);
     }
     break;
 
diff -r 3fb02f56c19f -r 9d36026b1b43 xen/common/event_channel.c
--- a/xen/common/event_channel.c        Thu Mar 01 11:08:49 2007 +0000
+++ b/xen/common/event_channel.c        Thu Mar 01 11:38:55 2007 +0000
@@ -434,7 +434,7 @@ static long __evtchn_close(struct domain
             spin_unlock(&d2->evtchn_lock);
         put_domain(d2);
     }
-    
+
     spin_unlock(&d1->evtchn_lock);
 
     return rc;
diff -r 3fb02f56c19f -r 9d36026b1b43 xen/common/grant_table.c
--- a/xen/common/grant_table.c  Thu Mar 01 11:08:49 2007 +0000
+++ b/xen/common/grant_table.c  Thu Mar 01 11:38:55 2007 +0000
@@ -1086,26 +1086,16 @@ __gnttab_copy(
                  "only allow copy-by-mfn for DOMID_SELF.\n");
 
     if ( op->source.domid == DOMID_SELF )
-    {
-        sd = current->domain;
-        get_knownalive_domain(sd);
-    }
+        sd = rcu_lock_current_domain();
     else if ( (sd = rcu_lock_domain_by_id(op->source.domid)) == NULL )
-    {
         PIN_FAIL(error_out, GNTST_bad_domain,
                  "couldn't find %d\n", op->source.domid);
-    }
 
     if ( op->dest.domid == DOMID_SELF )
-    {
-        dd = current->domain;
-        get_knownalive_domain(dd);
-    }
+        dd = rcu_lock_current_domain();
     else if ( (dd = rcu_lock_domain_by_id(op->dest.domid)) == NULL )
-    {
         PIN_FAIL(error_out, GNTST_bad_domain,
                  "couldn't find %d\n", op->dest.domid);
-    }
 
     if ( src_is_gref )
     {
diff -r 3fb02f56c19f -r 9d36026b1b43 xen/common/schedule.c
--- a/xen/common/schedule.c     Thu Mar 01 11:08:49 2007 +0000
+++ b/xen/common/schedule.c     Thu Mar 01 11:38:55 2007 +0000
@@ -430,12 +430,12 @@ ret_t do_sched_op(int cmd, XEN_GUEST_HAN
             break;
 
         ret = -ESRCH;
-        d = get_domain_by_id(sched_remote_shutdown.domain_id);
+        d = rcu_lock_domain_by_id(sched_remote_shutdown.domain_id);
         if ( d == NULL )
             break;
 
         domain_shutdown(d, (u8)sched_remote_shutdown.reason);
-        put_domain(d);
+        rcu_unlock_domain(d);
         ret = 0;
 
         break;
diff -r 3fb02f56c19f -r 9d36026b1b43 xen/common/sysctl.c
--- a/xen/common/sysctl.c       Thu Mar 01 11:08:49 2007 +0000
+++ b/xen/common/sysctl.c       Thu Mar 01 11:38:55 2007 +0000
@@ -86,15 +86,8 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysc
                 continue;
             if ( num_domains == op->u.getdomaininfolist.max_domains )
                 break;
-            if ( (d == NULL) || !get_domain(d) )
-            {
-                ret = -ESRCH;
-                break;
-            }
 
             getdomaininfo(d, &info);
-
-            put_domain(d);
 
             if ( copy_to_guest_offset(op->u.getdomaininfolist.buffer,
                                       num_domains, &info, 1) )
diff -r 3fb02f56c19f -r 9d36026b1b43 xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Thu Mar 01 11:08:49 2007 +0000
+++ b/xen/include/xen/sched.h   Thu Mar 01 11:38:55 2007 +0000
@@ -258,6 +258,14 @@ static inline void get_knownalive_domain
     ASSERT(!(atomic_read(&d->refcnt) & DOMAIN_DESTROYED));
 }
 
+/* Obtain a reference to the currently-running domain. */
+static inline struct domain *get_current_domain(void)
+{
+    struct domain *d = current->domain;
+    get_knownalive_domain(d);
+    return d;
+}
+
 struct domain *domain_create(domid_t domid, unsigned int domcr_flags);
  /* DOMCRF_hvm: Create an HVM domain, as opposed to a PV domain. */
 #define _DOMCRF_hvm 0
@@ -282,6 +290,12 @@ static inline void rcu_unlock_domain(str
 static inline void rcu_unlock_domain(struct domain *d)
 {
     rcu_read_unlock(&domlist_read_lock);
+}
+
+static inline struct domain *rcu_lock_current_domain(void)
+{
+    rcu_read_lock(&domlist_read_lock);
+    return current->domain;
 }
 
 struct domain *get_domain_by_id(domid_t dom);

_______________________________________________
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] xen: Cleanups and bug fixes after the rcu_lock_domain patch., Xen patchbot-unstable <=