|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/4] x86/domctl: Implement XEN_DOMCTL_{get, set}_vcpu_msrs
>>> On 06.06.14 at 16:53, <andrew.cooper3@xxxxxxxxxx> wrote:
> On 05/06/14 14:33, Jan Beulich wrote:
>> <snip>
>>> The sole use of this hypercall needs to ensure that all MSRs are gotten,
>>> otherwise VM corruption will occur. Permitting a partial get will make
>>> the return value ambiguous for making this hypercall a single time and
>>> guessing at the size to use, although I suspect we are less interested
>>> in this problem.
>> Why would the return value ambiguous? You'd get -ENOBUFS if you
>> provided too few slots, and you'd get to know the maximum number
>> at that point at once.
>>
>> Jan
>>
>
> Having tried to implement these improvements, I hit problems so would
> like to decide upon an interface before hacking futher.
>
> Currently behaviour for get:
> * Null guest handle returns msr_count set to maximum number of msrs Xen
> might write
> * msr_count < max_msrs fails with -ENOBUFS
> * if msrs are written, msr_count reflects the number written (likely
> less than max_msrs)
>
> Current behaviour for set:
> * msr_count > max_msrs fails with -EINVAL
> * problems with individual msrs fail with -EINVAL
>
> Suggestions:
> * for get, msr_count < max_msrs should perform a partial write,
> returning -ENOBUFS if Xen needs to write more than msr_count msrs.
>
> This reduces the amount of code added to xc_domain_save() to fail
> migrations actually using PV msrs. I am not too concerned about this
> code, as it will be rm'd in the migration-v2 series which implements PV
> MSR migration properly. I am a little bit hesitant about supporting
> partial writes, although I suppose it is plausible to want to know "how
> many MSRs is the vcpu currently using", and doing that with a single
> hypercall is preferable to requiring two.
Yes. I didn't see above what problem you found with this.
> * for set, in the case of a bad msr, identify it back to the caller to
> aid with debugging.
>
> This is useful to help debugging, but needs disambiguating against the
> other cases which fail with -EINVAL, including the paths which would
> fail before having a chance to set msr_count to the index of the bad
> msr. Therefore, msr_count *can't* be overloaded for this purpose.
Actually it can - the caller will know the number it put there, and if it's
unchanged then the failure was not associated with a particular array
entry (all possible values on error would be smaller than the value
originally there).
> I see one solution to these problems. Using:
>
> struct xen_domctl_vcpu_msrs {
> u32 vcpu;
> union { u16 max_msrs, /* OUT from get */
> u16 err_idx}; /* Possibly OUT from set */
> u16 msr_count;
> XEN_GUEST_HANDLE_64(xen_domctl_vcpu_msr_t) msrs;
> };
>
> max_msrs and current msrs can be reported at the same time (both on a
> NULL guest handle). If the caller of set sets err_idx to ~0 before the
> call, it can unambiguously determine the offending MSR, without
> confusing other -EINVAL failure cases.
>
> Does this look plausible? Can we get away with anonymous unions in the
> public header files?
No, nothing that isn't C89 is permitted in the public headers.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |