|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 1/2] xen: add domid_to_domain() helper
Add a helper domid_to_domain() returning the struct domain pointer for
a domain give by its domid and which is known not being able to be
released (its reference count isn't incremented and no rcu_lock_domain()
is called for it).
In order to simplify coding add an internal helper for doing the lookup
and call that from the new function and similar functions.
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
xen/common/domain.c | 54 ++++++++++++++++++++++++++---------------
xen/include/xen/sched.h | 4 +++
2 files changed, 38 insertions(+), 20 deletions(-)
diff --git a/xen/common/domain.c b/xen/common/domain.c
index c23f449451..2b1866ea42 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -832,25 +832,32 @@ out:
return 0;
}
-
-struct domain *get_domain_by_id(domid_t dom)
+/* rcu_read_lock(&domlist_read_lock) must be held. */
+static struct domain *domid_2_domain(domid_t dom)
{
struct domain *d;
- rcu_read_lock(&domlist_read_lock);
-
for ( d = rcu_dereference(domain_hash[DOMAIN_HASH(dom)]);
d != NULL;
d = rcu_dereference(d->next_in_hashbucket) )
{
if ( d->domain_id == dom )
- {
- if ( unlikely(!get_domain(d)) )
- d = NULL;
- break;
- }
+ return d;
}
+ return NULL;
+}
+
+struct domain *get_domain_by_id(domid_t dom)
+{
+ struct domain *d;
+
+ rcu_read_lock(&domlist_read_lock);
+
+ d = domid_2_domain(dom);
+ if ( d && unlikely(!get_domain(d)) )
+ d = NULL;
+
rcu_read_unlock(&domlist_read_lock);
return d;
@@ -859,20 +866,27 @@ struct domain *get_domain_by_id(domid_t dom)
struct domain *rcu_lock_domain_by_id(domid_t dom)
{
- struct domain *d = NULL;
+ struct domain *d;
rcu_read_lock(&domlist_read_lock);
- for ( d = rcu_dereference(domain_hash[DOMAIN_HASH(dom)]);
- d != NULL;
- d = rcu_dereference(d->next_in_hashbucket) )
- {
- if ( d->domain_id == dom )
- {
- rcu_lock_domain(d);
- break;
- }
- }
+ d = domid_2_domain(dom);
+ if ( d )
+ rcu_lock_domain(d);
+
+ rcu_read_unlock(&domlist_read_lock);
+
+ return d;
+}
+
+/* Use only if struct domain is known to stay allocated! */
+struct domain *domid_to_domain(domid_t dom)
+{
+ struct domain *d;
+
+ rcu_read_lock(&domlist_read_lock);
+
+ d = domid_2_domain(dom);
rcu_read_unlock(&domlist_read_lock);
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index 557b3229f6..f4c4d3a60f 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -737,8 +737,12 @@ static inline struct domain *rcu_lock_current_domain(void)
return /*rcu_lock_domain*/(current->domain);
}
+/* Get struct domain AND increase ref-count of domain. */
struct domain *get_domain_by_id(domid_t dom);
+/* Get struct domain known to stay allocated. */
+struct domain *domid_to_domain(domid_t dom);
+
struct domain *get_pg_owner(domid_t domid);
static inline void put_pg_owner(struct domain *pg_owner)
--
2.35.3
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |