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] rcu_lock(current->domain) does not need t

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] rcu_lock(current->domain) does not need to disable preemption.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 18 Nov 2010 17:55:26 -0800
Delivery-date: Thu, 18 Nov 2010 17:55:35 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
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/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/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 Keir Fraser <keir@xxxxxxx>
# Date 1290083187 0
# Node ID 92bc47c81fdcb06c0b0db2399a7d58b15a533c5d
# Parent  0b88ccf6332d6b8285843cf403b13a6623840de3
rcu_lock(current->domain) does not need to disable preemption.

If the guest sleeps in hypervisor context, it should not be destroyed
until execution reaches a safe point (i.e., guest context). This is
not implemented yet. :-) But the next patch will rely on it, to allow
an HVM guest to execute hypercalls that indirectly invoke __hvm_copy()
within an rcu_lock_current_domain() region.

Signed-off-by: Keir Fraser <keir@xxxxxxx>
---
 xen/arch/x86/mm.c       |    2 +-
 xen/arch/x86/physdev.c  |   12 ++++--------
 xen/common/domain.c     |    9 ++++++---
 xen/include/xen/sched.h |    8 +++++---
 4 files changed, 16 insertions(+), 15 deletions(-)

diff -r 0b88ccf6332d -r 92bc47c81fdc xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Thu Nov 18 11:45:33 2010 +0000
+++ b/xen/arch/x86/mm.c Thu Nov 18 12:26:27 2010 +0000
@@ -2759,7 +2759,7 @@ static struct domain *get_pg_owner(domid
 
     if ( likely(domid == DOMID_SELF) )
     {
-        pg_owner = rcu_lock_domain(curr);
+        pg_owner = rcu_lock_current_domain();
         goto out;
     }
 
diff -r 0b88ccf6332d -r 92bc47c81fdc xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c    Thu Nov 18 11:45:33 2010 +0000
+++ b/xen/arch/x86/physdev.c    Thu Nov 18 12:26:27 2010 +0000
@@ -37,10 +37,8 @@ static int physdev_map_pirq(struct physd
     if ( !map )
         return -EINVAL;
 
-    if ( map->domid == DOMID_SELF )
-        d = rcu_lock_domain(current->domain);
-    else
-        d = rcu_lock_domain_by_id(map->domid);
+    d = (map->domid == DOMID_SELF) ? rcu_lock_current_domain()
+        : rcu_lock_domain_by_id(map->domid);
 
     if ( d == NULL )
         return -ESRCH;
@@ -165,10 +163,8 @@ static int physdev_unmap_pirq(struct phy
     struct domain *d;
     int ret;
 
-    if ( unmap->domid == DOMID_SELF )
-        d = rcu_lock_domain(current->domain);
-    else
-        d = rcu_lock_domain_by_id(unmap->domid);
+    d = (unmap->domid == DOMID_SELF) ? rcu_lock_current_domain()
+        : rcu_lock_domain_by_id(unmap->domid);
 
     if ( d == NULL )
         return -ESRCH;
diff -r 0b88ccf6332d -r 92bc47c81fdc xen/common/domain.c
--- a/xen/common/domain.c       Thu Nov 18 11:45:33 2010 +0000
+++ b/xen/common/domain.c       Thu Nov 18 12:26:27 2010 +0000
@@ -398,7 +398,7 @@ struct domain *get_domain_by_id(domid_t 
 
 struct domain *rcu_lock_domain_by_id(domid_t dom)
 {
-    struct domain *d;
+    struct domain *d = NULL;
 
     rcu_read_lock(&domlist_read_lock);
 
@@ -407,12 +407,15 @@ struct domain *rcu_lock_domain_by_id(dom
           d = rcu_dereference(d->next_in_hashbucket) )
     {
         if ( d->domain_id == dom )
-            return d;
+        {
+            rcu_lock_domain(d);
+            break;
+        }
     }
 
     rcu_read_unlock(&domlist_read_lock);
 
-    return NULL;
+    return d;
 }
 
 int rcu_lock_target_domain_by_id(domid_t dom, struct domain **d)
diff -r 0b88ccf6332d -r 92bc47c81fdc xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Thu Nov 18 11:45:33 2010 +0000
+++ b/xen/include/xen/sched.h   Thu Nov 18 12:26:27 2010 +0000
@@ -439,18 +439,20 @@ int rcu_lock_target_domain_by_id(domid_t
 /* Finish a RCU critical region started by rcu_lock_domain_by_id(). */
 static inline void rcu_unlock_domain(struct domain *d)
 {
-    rcu_read_unlock(&domlist_read_lock);
+    if ( d != current->domain )
+        rcu_read_unlock(&domlist_read_lock);
 }
 
 static inline struct domain *rcu_lock_domain(struct domain *d)
 {
-    rcu_read_lock(d);
+    if ( d != current->domain )
+        rcu_read_lock(d);
     return d;
 }
 
 static inline struct domain *rcu_lock_current_domain(void)
 {
-    return rcu_lock_domain(current->domain);
+    return /*rcu_lock_domain*/(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] rcu_lock(current->domain) does not need to disable preemption., Xen patchbot-unstable <=