aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-10-02 11:39:36 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-10-02 11:39:36 +0100
commit4a93b11b6753ae0e0afb93f7307b32543447253b (patch)
treedb7770d40f9f05b0b12b12e5cb81707e86976e70 /xen/common
parent668349f38be79d2bd197ff968d728090f6d14faa (diff)
downloadxen-4a93b11b6753ae0e0afb93f7307b32543447253b.tar.gz
xen-4a93b11b6753ae0e0afb93f7307b32543447253b.tar.bz2
xen-4a93b11b6753ae0e0afb93f7307b32543447253b.zip
Eliminate code duplication with rcu_lock_domain_by_id().
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Diffstat (limited to 'xen/common')
-rw-r--r--xen/common/domain.c19
-rw-r--r--xen/common/event_channel.c51
-rw-r--r--xen/common/memory.c35
3 files changed, 34 insertions, 71 deletions
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 353242dc2c..7e1f0ebe28 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -332,6 +332,25 @@ struct domain *rcu_lock_domain_by_id(domid_t dom)
return NULL;
}
+int rcu_lock_target_domain_by_id(domid_t dom, struct domain **d)
+{
+ if ( dom == DOMID_SELF )
+ {
+ *d = rcu_lock_current_domain();
+ return 0;
+ }
+
+ if ( (*d = rcu_lock_domain_by_id(dom)) == NULL )
+ return -ESRCH;
+
+ if ( !IS_PRIV_FOR(current->domain, *d) )
+ {
+ rcu_unlock_domain(*d);
+ return -EPERM;
+ }
+
+ return 0;
+}
int domain_kill(struct domain *d)
{
diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c
index 006d5eca3a..53dad7acc9 100644
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -129,20 +129,9 @@ static long evtchn_alloc_unbound(evtchn_alloc_unbound_t *alloc)
domid_t dom = alloc->dom;
long rc;
- if ( dom == DOMID_SELF )
- {
- d = rcu_lock_current_domain();
- }
- else
- {
- if ( (d = rcu_lock_domain_by_id(dom)) == NULL )
- return -ESRCH;
- if ( !IS_PRIV_FOR(current->domain, d) )
- {
- rcu_unlock_domain(d);
- return -EPERM;
- }
- }
+ rc = rcu_lock_target_domain_by_id(dom, &d);
+ if ( rc )
+ return rc;
spin_lock(&d->evtchn_lock);
@@ -663,20 +652,9 @@ static long evtchn_status(evtchn_status_t *status)
struct evtchn *chn;
long rc = 0;
- if ( dom == DOMID_SELF )
- {
- d = rcu_lock_current_domain();
- }
- else
- {
- if ( (d = rcu_lock_domain_by_id(dom)) == NULL )
- return -ESRCH;
- if ( !IS_PRIV_FOR(current->domain, d) )
- {
- rcu_unlock_domain(d);
- return -EPERM;
- }
- }
+ rc = rcu_lock_target_domain_by_id(dom, &d);
+ if ( rc )
+ return rc;
spin_lock(&d->evtchn_lock);
@@ -824,20 +802,9 @@ static long evtchn_reset(evtchn_reset_t *r)
struct domain *d;
int i, rc;
- if ( dom == DOMID_SELF )
- {
- d = rcu_lock_current_domain();
- }
- else
- {
- if ( (d = rcu_lock_domain_by_id(dom)) == NULL )
- return -ESRCH;
- if ( !IS_PRIV_FOR(current->domain, d) )
- {
- rc = -EPERM;
- goto out;
- }
- }
+ rc = rcu_lock_target_domain_by_id(dom, &d);
+ if ( rc )
+ return rc;
rc = xsm_evtchn_reset(current->domain, d);
if ( rc )
diff --git a/xen/common/memory.c b/xen/common/memory.c
index e4d1a59f87..d39c2f59c0 100644
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -222,21 +222,9 @@ static long translate_gpfn_list(
!guest_handle_subrange_okay(op.mfn_list, *progress, op.nr_gpfns-1) )
return -EFAULT;
- if ( op.domid == DOMID_SELF )
- {
- d = rcu_lock_current_domain();
- }
- else
- {
- if ( (d = rcu_lock_domain_by_id(op.domid)) == NULL )
- return -ESRCH;
- if ( !IS_PRIV_FOR(current->domain, d) )
- {
- rcu_unlock_domain(d);
- return -EPERM;
- }
- }
-
+ rc = rcu_lock_target_domain_by_id(op.domid, &d);
+ if ( rc )
+ return rc;
if ( !paging_mode_translate(d) )
{
@@ -595,20 +583,9 @@ long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE(void) arg)
if ( copy_from_guest(&domid, arg, 1) )
return -EFAULT;
- if ( likely(domid == DOMID_SELF) )
- {
- d = rcu_lock_current_domain();
- }
- else
- {
- if ( (d = rcu_lock_domain_by_id(domid)) == NULL )
- return -ESRCH;
- if ( !IS_PRIV_FOR(current->domain, d) )
- {
- rcu_unlock_domain(d);
- return -EPERM;
- }
- }
+ rc = rcu_lock_target_domain_by_id(domid, &d);
+ if ( rc )
+ return rc;
rc = xsm_memory_stat_reservation(current->domain, d);
if ( rc )