[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 4/5] x86: don't pointlessly use get_domain_by_id()
For short-lived references rcu_lock_domain_by_id() is the better (slightly cheaper) alternative. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> --- a/xen/arch/x86/cpu/mcheck/mcaction.c +++ b/xen/arch/x86/cpu/mcheck/mcaction.c @@ -87,7 +87,7 @@ mc_memerr_dhandler(struct mca_binfo *bin BUG_ON( bank->mc_domid == DOMID_COW ); if ( bank->mc_domid != DOMID_XEN ) { - d = get_domain_by_id(bank->mc_domid); + d = rcu_lock_domain_by_id(bank->mc_domid); ASSERT(d); gfn = get_gpfn_from_mfn((bank->mc_addr) >> PAGE_SHIFT); @@ -132,6 +132,8 @@ mc_memerr_dhandler(struct mca_binfo *bin goto vmce_failed; } + rcu_unlock_domain(d); + /* * Impacted domain go on with domain's recovery job * if the domain has its own MCA handler. @@ -139,12 +141,11 @@ mc_memerr_dhandler(struct mca_binfo *bin * its own recovery job. */ *result = MCER_RECOVERED; - put_domain(d); return; vmce_failed: - put_domain(d); domain_crash(d); + rcu_unlock_domain(d); } } } --- a/xen/arch/x86/cpu/mcheck/mce.c +++ b/xen/arch/x86/cpu/mcheck/mce.c @@ -1497,7 +1497,6 @@ long do_mca(XEN_GUEST_HANDLE_PARAM(xen_m if ( mc_msrinject->mcinj_flags & MC_MSRINJ_F_GPADDR ) { - domid_t domid; struct domain *d; struct mcinfo_msr *msr; unsigned int i; @@ -1505,17 +1504,17 @@ long do_mca(XEN_GUEST_HANDLE_PARAM(xen_m unsigned long gfn, mfn; p2m_type_t t; - domid = (mc_msrinject->mcinj_domid == DOMID_SELF) ? - current->domain->domain_id : mc_msrinject->mcinj_domid; - if ( domid >= DOMID_FIRST_RESERVED ) - return x86_mcerr("do_mca inject: incompatible flag " - "MC_MSRINJ_F_GPADDR with domain %d", - -EINVAL, domid); - - d = get_domain_by_id(domid); + d = rcu_lock_domain_by_any_id(mc_msrinject->mcinj_domid); if ( d == NULL ) + { + if ( mc_msrinject->mcinj_domid >= DOMID_FIRST_RESERVED ) + return x86_mcerr("do_mca inject: incompatible flag " + "MC_MSRINJ_F_GPADDR with domain %d", + -EINVAL, domid); + return x86_mcerr("do_mca inject: bad domain id %d", -EINVAL, domid); + } for ( i = 0, msr = &mc_msrinject->mcinj_msr[0]; i < mc_msrinject->mcinj_count; @@ -1528,7 +1527,7 @@ long do_mca(XEN_GUEST_HANDLE_PARAM(xen_m if ( mfn == mfn_x(INVALID_MFN) ) { put_gfn(d, gfn); - put_domain(d); + rcu_unlock_domain(d); return x86_mcerr("do_mca inject: bad gfn %#lx of domain %d", -EINVAL, gfn, domid); } @@ -1538,7 +1537,7 @@ long do_mca(XEN_GUEST_HANDLE_PARAM(xen_m put_gfn(d, gfn); } - put_domain(d); + rcu_unlock_domain(d); } if ( !x86_mc_msrinject_verify(mc_msrinject) ) --- a/xen/arch/x86/debug.c +++ b/xen/arch/x86/debug.c @@ -164,13 +164,13 @@ unsigned int dbg_rw_mem(void * __user ad unsigned int len, domid_t domid, bool toaddr, uint64_t pgd3) { - struct domain *d = get_domain_by_id(domid); + struct domain *d = rcu_lock_domain_by_id(domid); if ( d ) { if ( !d->is_dying ) len = dbg_rw_guest_mem(d, addr, buf, len, toaddr, pgd3); - put_domain(d); + rcu_unlock_domain(d); } return len; --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -323,7 +323,7 @@ void destroy_irq(unsigned int irq) if ( desc->arch.creator_domid != DOMID_INVALID ) { - struct domain *d = get_domain_by_id(desc->arch.creator_domid); + struct domain *d = rcu_lock_domain_by_id(desc->arch.creator_domid); if ( d ) { @@ -334,7 +334,7 @@ void destroy_irq(unsigned int irq) "Could not revoke %pd access to IRQ%u (error %d)\n", d, irq, err); - put_domain(d); + rcu_unlock_domain(d); } desc->arch.creator_domid = DOMID_INVALID;
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |