[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 |