diff options
author | Jan Beulich <jbeulich@suse.com> | 2012-09-07 17:58:12 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2012-09-07 17:58:12 +0200 |
commit | 79e6ef8c0cf1dd0820c950bb653985a8beb04203 (patch) | |
tree | 39960fa3732cea2ee65b769523951b9b240a7729 /xen/arch/x86/physdev.c | |
parent | 42599de39a98fd826b6b6bac0738a8a0d9df18fe (diff) | |
download | xen-79e6ef8c0cf1dd0820c950bb653985a8beb04203.tar.gz xen-79e6ef8c0cf1dd0820c950bb653985a8beb04203.tar.bz2 xen-79e6ef8c0cf1dd0820c950bb653985a8beb04203.zip |
adjust a few RCU domain locking calls
x86's do_physdev_op() had a case where the locking was entirely
superfluous. Its physdev_map_pirq() further had a case where the lock
was being obtained too early, needlessly complicating early exit paths.
Grant table code had two open coded instances of
rcu_lock_target_domain_by_id(), and a third code section could be
consolidated by using the newly introduced helper function.
The memory hypercall code had two more instances of open coding
rcu_lock_target_domain_by_id(), but note that here this is not just
cleanup, but also fixes an error return path in memory_exchange() to
actually return an error.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/physdev.c')
-rw-r--r-- | xen/arch/x86/physdev.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/xen/arch/x86/physdev.c b/xen/arch/x86/physdev.c index 8e7bc24b62..ce55ee1f7a 100644 --- a/xen/arch/x86/physdev.c +++ b/xen/arch/x86/physdev.c @@ -90,14 +90,10 @@ static int physdev_hvm_map_pirq( int physdev_map_pirq(domid_t domid, int type, int *index, int *pirq_p, struct msi_info *msi) { - struct domain *d; + struct domain *d = current->domain; int pirq, irq, ret = 0; void *map_data = NULL; - ret = rcu_lock_target_domain_by_id(domid, &d); - if ( ret ) - return ret; - if ( domid == DOMID_SELF && is_hvm_domain(d) ) { /* @@ -105,14 +101,15 @@ int physdev_map_pirq(domid_t domid, int type, int *index, int *pirq_p, * calls back into itself and deadlocks on hvm_domain.irq_lock. */ if ( !is_hvm_pv_evtchn_domain(d) ) - { - ret = -EINVAL; - goto free_domain; - } - ret = physdev_hvm_map_pirq(d, type, index, pirq_p); - goto free_domain; + return -EINVAL; + + return physdev_hvm_map_pirq(d, type, index, pirq_p); } + ret = rcu_lock_target_domain_by_id(domid, &d); + if ( ret ) + return ret; + if ( !IS_PRIV_FOR(current->domain, d) ) { ret = -EPERM; @@ -696,13 +693,12 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) } case PHYSDEVOP_get_free_pirq: { struct physdev_get_free_pirq out; - struct domain *d; + struct domain *d = v->domain; ret = -EFAULT; if ( copy_from_guest(&out, arg, 1) != 0 ) break; - d = rcu_lock_current_domain(); spin_lock(&d->event_lock); ret = get_free_pirq(d, out.type); @@ -717,7 +713,6 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) } spin_unlock(&d->event_lock); - rcu_unlock_domain(d); if ( ret >= 0 ) { |