|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 1/5] x86/HVM: split restore state checking from state loading
On 09.01.2024 11:26, Roger Pau Monné wrote:
> On Tue, Dec 19, 2023 at 04:24:02PM +0100, Jan Beulich wrote:
>> On 19.12.2023 15:36, Roger Pau Monné wrote:
>>> On Mon, Dec 18, 2023 at 03:39:55PM +0100, Jan Beulich wrote:
>>>> --- a/xen/arch/x86/domctl.c
>>>> +++ b/xen/arch/x86/domctl.c
>>>> @@ -379,8 +379,12 @@ long arch_do_domctl(
>>>> if ( copy_from_guest(c.data, domctl->u.hvmcontext.buffer, c.size)
>>>> != 0 )
>>>> goto sethvmcontext_out;
>>>>
>>>> + ret = hvm_load(d, false, &c);
>>>> + if ( ret )
>>>> + goto sethvmcontext_out;
>>>> +
>>>> domain_pause(d);
>>>> - ret = hvm_load(d, &c);
>>>> + ret = hvm_load(d, true, &c);
>>>
>>> Now that the check has been done ahead, do we want to somehow assert
>>> that this cannot fail? AIUI that's the expectation.
>>
>> We certainly can't until all checking was moved out of the load handlers.
>> And even then I think there are still cases where load might produce an
>> error. (In fact I would have refused a little more strongly to folding
>> the prior hvm_check() into hvm_load() if indeed a separate hvm_load()
>> could have ended up returning void in the long run.)
>
> I see, _load could fail even if all the data provided was correct, for
> example because the hypervisor is OoM?
That's the primary hypothetical cause for such a failure, yes.
>>>> @@ -291,50 +295,91 @@ int hvm_load(struct domain *d, hvm_domai
>>>> if ( !hdr )
>>>> return -ENODATA;
>>>>
>>>> - rc = arch_hvm_load(d, hdr);
>>>> - if ( rc )
>>>> - return rc;
>>>> + rc = arch_hvm_check(d, hdr);
>>>
>>> Shouldn't this _check function only be called when real == false?
>>
>> Possibly. In v4 I directly transformed what I had in v3:
>>
>> ASSERT(!arch_hvm_check(d, hdr));
>>
>> I.e. it is now the call above plus ...
>>
>>>> + if ( real )
>>>> + {
>>>> + struct vcpu *v;
>>>> +
>>>> + ASSERT(!rc);
>>
>> ... this assertion. Really the little brother of the call site assertion
>> you're asking for (see above).
>>
>>>> + arch_hvm_load(d, hdr);
>>>>
>>>> - /* Down all the vcpus: we only re-enable the ones that had state
>>>> saved. */
>>>> - for_each_vcpu(d, v)
>>>> - if ( !test_and_set_bit(_VPF_down, &v->pause_flags) )
>>>> - vcpu_sleep_nosync(v);
>>>> + /*
>>>> + * Down all the vcpus: we only re-enable the ones that had state
>>>> + * saved.
>>>> + */
>>>> + for_each_vcpu(d, v)
>>>> + if ( !test_and_set_bit(_VPF_down, &v->pause_flags) )
>>>> + vcpu_sleep_nosync(v);
>>>> + }
>>>> + else if ( rc )
>>>> + return rc;
>
> The issue I see with this is that when built with debug=n the call to
> arch_hvm_check() with real == true is useless, as the result is never
> evaluated - IOW: would be clearer to just avoid the call altogether.
Which, besides being imo slightly worse for then having two call sites,
puts me in a difficult position: It may not have been here, but on
another patch (but I think it was an earlier version of this one)
where Andrew commented on
ASSERT(func());
as generally being a disliked pattern, for having a "side effect" in
the expression of an assertion. Plus the call isn't pointless even in
release builds, because of the log messages issued: Them appearing
twice in close succession might be a good hint of something fishy
going on.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |