[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v9 09/11] x86/ctxt: Issue a speculation barrier between vcpu contexts
>>> On 18.01.18 at 16:46, <andrew.cooper3@xxxxxxxxxx> wrote: > --- a/xen/arch/x86/domain.c > +++ b/xen/arch/x86/domain.c > @@ -1743,6 +1743,29 @@ void context_switch(struct vcpu *prev, struct vcpu > *next) > } > > ctxt_switch_levelling(next); > + > + if ( opt_ibpb ) > + { > + static DEFINE_PER_CPU(unsigned int, last_nonidle); > + unsigned int *last_id = &this_cpu(last_nonidle); "nonidle" is not entirely correct without an is_idle_...() check around it, as the outer condition leaves room for idle vCPU-s to make it here. But take this as a remark, not a strict request to change the name. > + /* Squash the domid and vcpu id together for efficiency. */ > + unsigned int next_id = (((unsigned int)nextd->domain_id << 16) | > + (uint16_t)next->vcpu_id); Is this really more efficient than just comparing struct vcpu pointers? > + BUILD_BUG_ON(MAX_VIRT_CPUS > 0xffff); > + > + /* > + * When scheduling from a vcpu, to idle, and back to the same > vcpu > + * (which might be common in a lightly loaded system, or when > + * using vcpu pinning), there is no need to issue IBPB, as we are > + * returning to the same security context. > + */ > + if ( *last_id != next_id ) > + { > + wrmsrl(MSR_PRED_CMD, PRED_CMD_IBPB); > + *last_id = next_id; > + } I've read David's mails regarding this another time, but I still can't conclude why this extra logic would be necessary. Transitions from a guest vCPU through idle and back to that very vCPU do not alter per_cpu(curr_vcpu, ...) - __context_switch() is the only place to update it. There's certainly the potential for it to be called through __sync_local_execstate(), but is that a common case? I'd support introduction of the extra logic only if so. Furthermore, if this indeed was a sufficiently common case, doing lazy context switches at all for HVM guests would once again need to be put under question. > --- a/xen/arch/x86/spec_ctrl.c > +++ b/xen/arch/x86/spec_ctrl.c > @@ -33,6 +33,7 @@ static enum ind_thunk { > THUNK_JMP, > } opt_thunk __initdata = THUNK_DEFAULT; > static int opt_ibrs __initdata = -1; > +bool __read_mostly opt_ibpb = true; > static bool opt_rsb_native __initdata = true, opt_rsb_vmexit __initdata = > true; Considering the (better imo) placement of __read_mostly here, would you mind moving the __initdata accordingly in the earlier patches (opt_thunk having reasons to be an exception)? Otherwise please move the __read_mostly to the end. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |