[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 05/18] arm/altp2m: Add HVMOP_altp2m_set_domain_state.
Hello Julien, On 07/04/2016 05:39 PM, Julien Grall wrote: > Hello Sergej, > > On 04/07/16 12:45, Sergej Proskurin wrote: >> diff --git a/xen/arch/arm/hvm.c b/xen/arch/arm/hvm.c >> index 8e8e0f7..cb90a55 100644 >> --- a/xen/arch/arm/hvm.c >> +++ b/xen/arch/arm/hvm.c >> @@ -104,8 +104,36 @@ static int >> do_altp2m_op(XEN_GUEST_HANDLE_PARAM(void) arg) >> break; >> >> case HVMOP_altp2m_set_domain_state: >> - rc = -EOPNOTSUPP; >> + { > > I cannot find anything in the code which prevents this sub-op to be > called concurrently. Did I miss something? > Please correct me if I am wrong, but is the rcu-lock not already sufficient, which is locked in the same function above? [...] d = (a.cmd != HVMOP_altp2m_vcpu_enable_notify) ? rcu_lock_domain_by_any_id(a.domain) : rcu_lock_current_domain(); [...] >> + struct vcpu *v; >> + bool_t ostate; >> + >> + if ( !d->arch.hvm_domain.params[HVM_PARAM_ALTP2M] ) >> + { >> + rc = -EINVAL; >> + break; >> + } >> + >> + ostate = d->arch.altp2m_active; >> + d->arch.altp2m_active = !!a.u.domain_state.state; >> + >> + /* If the alternate p2m state has changed, handle >> appropriately */ >> + if ( d->arch.altp2m_active != ostate && >> + (ostate || !(rc = p2m_init_altp2m_by_id(d, 0))) ) >> + { >> + for_each_vcpu( d, v ) >> + { >> + if ( !ostate ) >> + altp2m_vcpu_initialise(v); >> + else >> + altp2m_vcpu_destroy(v); >> + } >> + >> + if ( ostate ) >> + p2m_flush_altp2m(d); >> + } >> break; >> + } >> >> case HVMOP_altp2m_vcpu_enable_notify: >> rc = -EOPNOTSUPP; >> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c >> index e72ca7a..4a745fd 100644 >> --- a/xen/arch/arm/p2m.c >> +++ b/xen/arch/arm/p2m.c >> @@ -2064,6 +2064,52 @@ int p2m_get_mem_access(struct domain *d, gfn_t >> gfn, >> return ret; >> } >> > > The 3 helpers below are altp2m specific so I would move them in altp2m.c > I will do that, thank you. >> +struct p2m_domain *p2m_get_altp2m(struct vcpu *v) >> +{ >> + unsigned int index = vcpu_altp2m(v).p2midx; >> + >> + if ( index == INVALID_ALTP2M ) >> + return NULL; >> + >> + BUG_ON(index >= MAX_ALTP2M); >> + >> + return v->domain->arch.altp2m_p2m[index]; >> +} >> + >> +static void p2m_init_altp2m_helper(struct domain *d, unsigned int i) >> +{ >> + struct p2m_domain *p2m = d->arch.altp2m_p2m[i]; >> + struct vttbr_data *vttbr = &p2m->vttbr; >> + >> + p2m->lowest_mapped_gfn = INVALID_GFN; >> + p2m->max_mapped_gfn = 0; > > Would not it be easier to reallocate p2m from scratch everytime you > enable it? > Do you mean instead of dynamically allocating memory for all altp2m_p2m entries at once in p2m_init_altp2m by means of p2m_init_one? If yes, then I agree. Thankyou. >> + >> + vttbr->vttbr_baddr = page_to_maddr(p2m->root); >> + vttbr->vttbr_vmid = p2m->vmid; >> + >> + d->arch.altp2m_vttbr[i] = vttbr->vttbr; >> +} >> + >> +int p2m_init_altp2m_by_id(struct domain *d, unsigned int idx) >> +{ >> + int rc = -EINVAL; >> + >> + if ( idx >= MAX_ALTP2M ) >> + return rc; >> + >> + altp2m_lock(d); >> + >> + if ( d->arch.altp2m_vttbr[idx] == INVALID_MFN ) >> + { >> + p2m_init_altp2m_helper(d, idx); >> + rc = 0; >> + } >> + >> + altp2m_unlock(d); >> + >> + return rc; >> +} >> + >> /* >> * Local variables: >> * mode: C > > [...] > >> diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h >> index 6b9770f..8bcd618 100644 >> --- a/xen/include/asm-arm/domain.h >> +++ b/xen/include/asm-arm/domain.h >> @@ -138,6 +138,12 @@ struct arch_domain >> uint64_t altp2m_vttbr[MAX_ALTP2M]; >> } __cacheline_aligned; >> >> +struct altp2mvcpu { >> + uint16_t p2midx; /* alternate p2m index */ >> +}; >> + >> +#define vcpu_altp2m(v) ((v)->arch.avcpu) >> + >> struct arch_vcpu >> { >> struct { >> @@ -267,6 +273,9 @@ struct arch_vcpu >> struct vtimer phys_timer; >> struct vtimer virt_timer; >> bool_t vtimer_initialized; >> + >> + /* Alternate p2m context */ >> + struct altp2mvcpu avcpu; >> } __cacheline_aligned; >> >> void vcpu_show_execution_state(struct vcpu *); >> diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h >> index a78d547..8ee78e0 100644 >> --- a/xen/include/asm-arm/p2m.h >> +++ b/xen/include/asm-arm/p2m.h >> @@ -121,6 +121,25 @@ void p2m_altp2m_check(struct vcpu *v, uint16_t idx) >> /* Not supported on ARM. */ >> } >> >> +/* >> + * Alternate p2m: shadow p2m tables used for alternate memory views. >> + */ >> + >> +#define altp2m_lock(d) spin_lock(&(d)->arch.altp2m_lock) >> +#define altp2m_unlock(d) spin_unlock(&(d)->arch.altp2m_lock) >> + >> +/* Get current alternate p2m table */ >> +struct p2m_domain *p2m_get_altp2m(struct vcpu *v); >> + >> +/* Flush all the alternate p2m's for a domain */ >> +static inline void p2m_flush_altp2m(struct domain *d) >> +{ >> + /* Not supported on ARM. */ >> +} >> + >> +/* Make a specific alternate p2m valid */ >> +int p2m_init_altp2m_by_id(struct domain *d, unsigned int idx); >> + > > Please move anything related to altp2m in altp2m.h > I will do that, thank you Julien. >> #define p2m_is_foreign(_t) ((_t) == p2m_map_foreign) >> #define p2m_is_ram(_t) ((_t) == p2m_ram_rw || (_t) == p2m_ram_ro) >> >> > > Regards, > Best regards, Sergej _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |