[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] SVM: re-work VMCB sync-ing
On 04/27/2018 11:52 AM, Jan Beulich wrote: >>>> On 26.04.18 at 19:27, <boris.ostrovsky@xxxxxxxxxx> wrote: >> On 04/26/2018 11:55 AM, Jan Beulich wrote: >>>>>> On 26.04.18 at 17:20, <boris.ostrovsky@xxxxxxxxxx> wrote: >>>> On 04/26/2018 09:33 AM, Jan Beulich wrote: >>>>>>> -static void svm_sync_vmcb(struct vcpu *v) >>>>>>> +static void svm_sync_vmcb(struct vcpu *v, enum vmcb_sync_state >>>>>>> new_state) >>>>>>> { >>>>>>> struct arch_svm_struct *arch_svm = &v->arch.hvm_svm; >>>>>>> >>>>>>> - if ( arch_svm->vmcb_in_sync ) >>>>>>> - return; >>>>>>> - >>>>>>> - arch_svm->vmcb_in_sync = 1; >>>>>>> + if ( arch_svm->vmcb_sync_state == vmcb_needs_vmsave ) >>>>>>> + svm_vmsave(arch_svm->vmcb); >>>>>>> >>>>>>> - svm_vmsave(arch_svm->vmcb); >>>>>>> + if ( arch_svm->vmcb_sync_state != vmcb_needs_vmload ) >>>>>>> + arch_svm->vmcb_sync_state = new_state; >>>>>> This is slightly awkward for a couple of reasons. First, passing >>>>>> vmcb_in_sync in forget the fact that a vmload is needed. >>>>> Certainly not - that's the purpose of the if() around it. >>>>> >>>>>> In my patch, I introduced svm_sync_vmcb_for_update(), rather than >>>>>> requiring a parameter to be passed in. I think this is a better API, >>>>>> and it shrinks the size of the patch. >>>>> I'm not convinced of the "better", and even less so of the "shrinks". But >>>>> I'll wait to see what the SVM maintainers say. >>>> I think a single function is better. In fact, I was wondering whether >>>> svm_vmload() could also be folded into svm_sync_vmcb() since it is also >>>> a syncing operation. >>> That doesn't look like it would produce a usable interface: How would >>> you envision the state transition to be specified by the caller? Right >>> now the intended new state gets passed in, but in your model >>> vmcb_in_sync could mean either vmload or vmsave is needed. The >>> two svm_vmload() uses right now would pass that value in addition >>> to the svm_sync_vmcb() calls already doing so. And the function >>> couldn't tell what to do from the current state (if it's >>> vmcb_needs_vmload, a load is only needed in the cases where >>> svm_vmload() is called right now). Adding a 3rd parameter or a >>> second enum >> I was thinking about another enum value, e.g. sync_to_cpu (and >> sync_to_vmcb replacing vmcb_needs_vmsave). >> >> This will allow us to hide (v->arch.hvm_svm.vmcb_sync_state == >> vmcb_needs_vmload) test. > I'm still not entirely clear how you want that to look like. At the example > of svm_get_segment_register() and svm_set_segment_register(), how > would the svm_sync_vmcb() calls look like? I.e. how do you distinguish > the sync_to_vmcb/transition-to-clean case from the > sync_to_vmcb/transition-to-dirty one? Something like static void svm_sync_vmcb(struct vcpu *v, enum vmcb_sync_state new_state) { struct arch_svm_struct *arch_svm = &v->arch.hvm_svm; if ( new_state == vmcb_sync_to_cpu ) { if (v->arch.hvm_svm.vmcb_sync_state == vmcb_needs_vmload ) { svm_vmload(vmcb); v->arch.hvm_svm.vmcb_sync_state = vmcb_in_sync; } return; } if ( arch_svm->vmcb_sync_state == vmcb_needs_vmsave ) svm_vmsave(arch_svm->vmcb); if ( arch_svm->vmcb_sync_state != vmcb_needs_vmload ) arch_svm->vmcb_sync_state = new_state; } -boris _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |