Il gio 3 lug 2025, 06:51 Paolo Bonzini <pbonz...@redhat.com> ha scritto:

>
>
> Il mer 2 lug 2025, 23:36 Xiaoyao Li <xiaoyao...@intel.com> ha scritto:
>
>> The reason why accelerator's instance_init() was moved to post_init, was
>> just it needs to consider other factors. Please see commit 4db4385a7ab6
>> ("i386: run accel_cpu_instance_init as post_init")
>>
>
> You're right and this can be a problem with the simple split that Zhao
> proposed. But the root cause is that post_init is confusing many kinds of
> defaults (the KVM vendor case, globals which are different for compat
> properties and -global and which CPUs also abuse to implement -cpu by the
> way, max_features handling, maybe more; all of which have different
> priorities).
>

I checked and it seems to me that all of the accelerator-specific
initialization should be doable in instance_init (which risc-v already
does), the only problem is the max_features field. But max_features is
*not* a qdev property so it can be moved to the class side.

I will try to send patches tomorrow.

Paolo


TDX added checks on top, and instance_post_init worked when applying class
> defaults but not for checks. But as mentioned in the commit message for
> this patch, cxl_dsp_instance_post_init and
> rp_instance_post_init have similar issues so reverting is also incorrect.
>
> Maybe DeviceClass needs another callback that is called before Device's
> own instance_post_init. The accelerator could use it.
>
> Or maybe, more long term, instance_post_init could be replaced by a set of
> Notifiers that are registered by instance_init and that have a priority
> (FIXUP_CLASS_DEFAULTS, APPLY_GLOBAL_DEFAULTS, and a third for TDX).
>
> Paolo
>
> accelerator needs to do different tweak for "max/host", "xcc->model".
>>
>> Of course we can split it and put specific handling at the end of each
>> sub-class's instance_init(), like below:
>>
>> - in TYPE_X86_CPU instance_init()
>>
>>         if (accelerator_kvm) {
>>                 kvm_instance_init_common_for_x86_cpu();
>>         }
>>
>> - in "base" instance_init()
>>
>>         if (accelerator_kvm) {
>>                 kvm_instance_init_for_base();
>>         }
>>
>> - in "max" instance_init()
>>
>>         if (accelerator_kvm) {
>>                 kvm_instance_init_for_max();
>>         }
>>
>> - in "host" instance_init()
>>
>>         if (accelerator_kvm) {
>>                 kvm_instance_init_for_host();
>>         }
>>
>> - in "named cpu model" instance_init()
>>
>>         if (xcc->model) {
>>                 kvm_instance_init_for_xcc_model();
>>         }
>>
>> Contrast to the current implementation in post_init()
>>
>>         if (accelerator_kvm) {
>>                 kvm_instance_init_common_for_x86_cpu();
>>
>>                 if (base)
>>                         ...
>>                 if (max)
>>                         ...
>>                 if (host)
>>                         ...
>>                 if (xcc->model)
>>                         ...
>>         }
>>
>> The reality for the former might be simpler since "base" doesn't have
>> instance_init(), and "max/host" are same to KVM as "cpu->max_features"
>>
>> But I still like the latter.
>>
>>
>>

Reply via email to