在 2026/7/10 11:15, Bibo Mao 写道:
>
>
> On 2026/7/10 上午11:02, Bibo Mao wrote:
>>
>>
>> On 2026/7/10 上午8:50, Tao Cui wrote:
>>> From: Tao Cui <[email protected]>
>>>
>>> pv_features holds the value of pseudo-register CPUCFG_KVM_FEATURE and is now
>>> pushed per vCPU. Add it to the vCPU VMState as a subsection (sent when
>>> non-zero) so it travels with the vCPU across migration between host kernel
>>> versions.
>>>
>>> Signed-off-by: Tao Cui <[email protected]>
>>> ---
>>> target/loongarch/machine.c | 19 +++++++++++++++++++
>>> 1 file changed, 19 insertions(+)
>>>
>>> diff --git a/target/loongarch/machine.c b/target/loongarch/machine.c
>>> index 931a5ca5ba..b8819bd44d 100644
>>> --- a/target/loongarch/machine.c
>>> +++ b/target/loongarch/machine.c
>>> @@ -65,6 +65,24 @@ static const VMStateDescription vmstate_msgint = {
>>> },
>>> };
>>> +static bool pv_features_needed(void *opaque)
>>> +{
>>> + LoongArchCPU *cpu = opaque;
>>> +
>>> + return cpu->env.pv_features != 0;
>> I think cpu->no_pv_feature should be check here. For QEMU 11.1 pv_feature is
>> not supported for migration, for later version it supports, something like
>> this:
>> return !cpu->no_pv_feature;
> For successful migration, env.pv_features from source host should be subset
> of destination host, there should be such checking also.
>
Agreed on both points.
1. I'll change .needed to `return !cpu->no_pv_feature` so the subsection
is gated by machine version. Since it references no_pv_feature (added
in the compat patch), I'll reorder so compat comes before vmstate.
2. For the subset check, I'll add a .post_load that calls
kvm_feature_supported() for each PV feature to build the destination's
supported mask, and rejects migration if the migrated pv_features has
bits outside it. Does this look right?
Thanks,
Tao
>>
>> Regards
>> Bibo Mao
>>> +}
>>> +
>>> +static const VMStateDescription vmstate_pv_features = {
>>> + .name = "cpu/pv_features",
>>> + .version_id = 1,
>>> + .minimum_version_id = 1,
>>> + .needed = pv_features_needed,
>>> + .fields = (const VMStateField[]) {
>>> + VMSTATE_UINT32(env.pv_features, LoongArchCPU),
>>> + VMSTATE_END_OF_LIST()
>>> + },
>>> +};
>>> +
>>> static const VMStateDescription vmstate_lsxh_reg = {
>>> .name = "lsxh_reg",
>>> .version_id = 1,
>>> @@ -289,6 +307,7 @@ const VMStateDescription vmstate_loongarch_cpu = {
>>> &vmstate_lbt,
>>> &vmstate_msgint,
>>> &vmstate_pmu,
>>> + &vmstate_pv_features,
>>> NULL
>>> }
>>> };
>>>
>>
>