On Fri, Nov 27, 2015 at 06:18:30PM +0100, Thomas Huth wrote: > On 27/11/15 10:55, Alexander Graf wrote: > > > > On 27.11.15 10:32, Thomas Huth wrote: > >> Add a new pseries-2.6 machine class version to make sure we can > >> keep the old types compatible to previous versions of QEMU in > >> later patches. > >> > >> Signed-off-by: Thomas Huth <th...@redhat.com> > >> --- > >> hw/ppc/spapr.c | 21 +++++++++++++++++++-- > >> 1 file changed, 19 insertions(+), 2 deletions(-) > >> > >> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > >> index 6bfb908..10b7c35 100644 > >> --- a/hw/ppc/spapr.c > >> +++ b/hw/ppc/spapr.c > >> @@ -2450,6 +2448,24 @@ static const TypeInfo spapr_machine_2_5_info = { > >> .class_init = spapr_machine_2_5_class_init, > >> }; > >> > >> +static void spapr_machine_2_6_class_init(ObjectClass *oc, void *data) > >> +{ > >> + MachineClass *mc = MACHINE_CLASS(oc); > >> + sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(oc); > >> + > >> + mc->name = "pseries-2.6"; > >> + mc->desc = "pSeries Logical Partition (PAPR compliant) v2.6"; > >> + mc->alias = "pseries"; > >> + mc->is_default = 1; > >> + smc->dr_lmb_enabled = true; > > > > We should probably start to follow a scheme similar to x86 where the new > > machine initialization calls its predecessor (2.5 in this case) to > > ensure we don't forget feature flags and quirks. > > > > So you can either directly call spapr_machine_2_5_class_init() from > > spapr_machine_2_6_class_init() or extract the quirk part > > (dr_lmb_enabled) into a function that gets marked as "from 2.5 on" in > > its function name and call it from 2_5_class_init and from a "from 2.6 > > on" function that gets called from 2_6_class_init. > > I like the idea of calling the functions in a chain. However, the i386 > people seem to do it the other way round, for example > pc_i440fx_2_4_machine_options() calls pc_i440fx_2_5_machine_options(). > That of course works, too, but it sounds a little bit cumbersome to me, > since when introducing a new machine class version, you do not only have > to introduce a function for the new class anymore, but also you have to > update the previous version to change the behavior that has been > introduced by the new function (see commit 87e896abe6d926 for example).
The alias/is_default changes are only needed because we don't have a generic class alias system (yet), that would allow us to declare the "pc" alias and a default machine outside the machine_options() function. I agree it's cumbersome. commit 87e896abe6d926 has the extra broken_reserved_end change because for some reason we decided to add the broken_reserved_end quirk to pc-2.4 before we even introduced pc-2.5. That was an exception. The common case is to add the pc-2.4 quirks only after we added a pc-2.5 machine. The patch that adds pc-1.6, for example, looks like this: -static void pc_i440fx_2_5_machine_options(MachineClass *m) +static void pc_i440fx_2_6_machine_options(MachineClass *m) { pc_i440fx_machine_options(m); m->alias = "pc"; m->is_default = 1; } +DEFINE_I440FX_MACHINE(v2_6, "pc-i440fx-2.6", NULL, + pc_i440fx_2_6_machine_options); + +static void pc_i440fx_2_5_machine_options(MachineClass *m) +{ + pc_i440fx_2_6_machine_options(m); + m->alias = NULL; + m->is_default = 0; + SET_MACHINE_COMPAT(m, PC_COMPAT_2_5); +} Except for the alias/is_default stuff, it looks very simple to me. That said, I don't understand what you would suggest as alternative. Let's use pc-1.7 and pc-1.6 as examples: static void pc_compat_1_7(MachineState *machine) { pc_compat_2_0(machine); smbios_defaults = false; gigabyte_align = false; option_rom_has_mr = true; legacy_acpi_table_size = 6414; x86_cpu_change_kvm_default("x2apic", NULL); } static void pc_compat_1_6(MachineState *machine) { pc_compat_1_7(machine); rom_file_has_mr = false; has_acpi_build = false; } pc-1.7 and older need the smbios_defaults/gigabyte_align/ option_rom_has_mr/legacy_acpi_table_size/x2apic quirks. pc-2.0 and later don't need those quirks. How exactly would you make pc-1.6 and older inherit the quirks from pc-1.7, if not by reusing pc_compat_1_7() inside pc_compat_1_6()? (I am showing pc_compat_*() instead of *_machine_options(), because we're still moving compat stuff from pc_compat_*() to *_machine_options() functions. But the same questions apply once we move the compat code above to *_machine_options() functions). What's the alternative you propose? > > Thus here's a question for the x86 people: Was this order done on > purpose and if so, why? Or has it just grown historically that way and > would it maybe make sense to change the order to the IMHO more intuitive > way, so that the newer machine setup function calls the older one > instead of the other way round? Why would we ever want a new machine-type call the older one? Why would a newer machine-type inherit the quirks from the older machine-types? The newer machine-types need less quirks than the older ones, not more quirks. > > Next question is of course: What do we do in sPAPR land? Go the x86 way > or do it the "big endian" way ;-) and do it the other way round? If you decide to do it in a different way, I am curious to see how you plan to make it work. -- Eduardo