Re: [PATCH v4 2/3] hw/i386/pc: Default to use SMBIOS 3.0 for newer machine models

2023-06-06 Thread Suthikulpanit, Suravee

Igor,

On 6/6/2023 3:11 PM, Igor Mammedov wrote:

On Tue, 6 Jun 2023 09:35:41 +0200
Igor Mammedov  wrote:


On Mon, 5 Jun 2023 16:39:05 -0500
Suravee Suthikulpanit  wrote:

[...]

+/* For pc-i44fx-8.0 and older, use SMBIOS 2.8 by default */
+pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_32;
  }

[...]

  static void pc_q35_8_0_machine_options(MachineClass *m)
  {

[...]

+/* For pc-q35-8.0 and older, use SMBIOS 2.8 by default */
+pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_32;
  }

[...]

what Michael referred to as duplication is probably these lines,
however "smbios-entry-point-type: is machine property so we can't
use device compat machinery here (pc_compat_8_0).
What we can do is override "default_machine_opts" value, but then
again it has to be opencoded in  piix4/q35_machine_options, so
don't see a point in doing so.
As you wrote here is what typically do for machine compat knobs,
so it should be fine.


Ok


I just doubt that we need extra default_smbios_ep_type field.


I introduce pcmc->default_smbios_ep_type because I could not get to 
pcms->smbios_entry_point_type from these functions. Any suggestions?


Anyhow, I'll send out v5 with some more clean up.

Thanks,
Suravee



Re: [PATCH v4 2/3] hw/i386/pc: Default to use SMBIOS 3.0 for newer machine models

2023-06-06 Thread Suthikulpanit, Suravee




On 6/6/2023 2:35 PM, Igor Mammedov wrote:

On Mon, 5 Jun 2023 16:39:05 -0500
Suravee Suthikulpanit  wrote:


Currently, pc-q35 and pc-i44fx machine models are default to use SMBIOS 2.8
(32-bit entry point). Since SMBIOS 3.0 (64-bit entry point) is now fully
supported since QEMU 7.0, default to use SMBIOS 3.0 for newer machine
models. This is necessary to avoid the following message when launching
a VM with large number of vcpus.

"SMBIOS 2.1 table length 66822 exceeds 65535"

Note that user can still override the entry point tyme w/ QEMU option
"-M ..., smbios-entry-point-type=[32|64].

Signed-off-by: Suravee Suthikulpanit
---
  hw/i386/pc.c | 14 +-
  hw/i386/pc_piix.c|  5 +
  hw/i386/pc_q35.c |  5 +
  include/hw/i386/pc.h |  2 ++
  4 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 8fc34f5454..5a87b82185 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -786,6 +786,14 @@ void pc_machine_done(Notifier *notifier, void *data)
  if (pcmc->smbios_defaults) {
  MachineClass *mc = MACHINE_GET_CLASS(pcms);
  
+/*

+ * Check if user has specified a command line option
+ * to override the SMBIOS default entry point type.
+ */
+if (!pcms->smbios_use_cmdline_ep_type) {
+pcms->smbios_entry_point_type = pcmc->default_smbios_ep_type;
+}

why pcms->smbios_entry_point_type that we already have is not enough
we need to add extra pcms->smbios_use_cmdline_ep_type field?


I'll get rid of this in V5.

Suravee




Re: [PATCH v4 2/3] hw/i386/pc: Default to use SMBIOS 3.0 for newer machine models

2023-06-06 Thread Igor Mammedov
On Tue, 6 Jun 2023 09:35:41 +0200
Igor Mammedov  wrote:

> On Mon, 5 Jun 2023 16:39:05 -0500
> Suravee Suthikulpanit  wrote:
[...]
> > +/* For pc-i44fx-8.0 and older, use SMBIOS 2.8 by default */
> > +pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_32;
> >  }
[...]
> >  static void pc_q35_8_0_machine_options(MachineClass *m)
> >  {
[...]
> > +/* For pc-q35-8.0 and older, use SMBIOS 2.8 by default */
> > +pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_32;
> >  }
[...]

what Michael referred to as duplication is probably these lines,
however "smbios-entry-point-type: is machine property so we can't
use device compat machinery here (pc_compat_8_0).
What we can do is override "default_machine_opts" value, but then
again it has to be opencoded in  piix4/q35_machine_options, so
don't see a point in doing so.
As you wrote here is what typically do for machine compat knobs,
so it should be fine.

I just doubt that we need extra default_smbios_ep_type field.




Re: [PATCH v4 2/3] hw/i386/pc: Default to use SMBIOS 3.0 for newer machine models

2023-06-06 Thread Igor Mammedov
On Mon, 5 Jun 2023 16:39:05 -0500
Suravee Suthikulpanit  wrote:

> Currently, pc-q35 and pc-i44fx machine models are default to use SMBIOS 2.8
> (32-bit entry point). Since SMBIOS 3.0 (64-bit entry point) is now fully
> supported since QEMU 7.0, default to use SMBIOS 3.0 for newer machine
> models. This is necessary to avoid the following message when launching
> a VM with large number of vcpus.
> 
>"SMBIOS 2.1 table length 66822 exceeds 65535"
> 
> Note that user can still override the entry point tyme w/ QEMU option
> "-M ..., smbios-entry-point-type=[32|64].
> 
> Signed-off-by: Suravee Suthikulpanit 
> ---
>  hw/i386/pc.c | 14 +-
>  hw/i386/pc_piix.c|  5 +
>  hw/i386/pc_q35.c |  5 +
>  include/hw/i386/pc.h |  2 ++
>  4 files changed, 25 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 8fc34f5454..5a87b82185 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -786,6 +786,14 @@ void pc_machine_done(Notifier *notifier, void *data)
>  if (pcmc->smbios_defaults) {
>  MachineClass *mc = MACHINE_GET_CLASS(pcms);
>  
> +/*
> + * Check if user has specified a command line option
> + * to override the SMBIOS default entry point type.
> + */
> +if (!pcms->smbios_use_cmdline_ep_type) {
> +pcms->smbios_entry_point_type = pcmc->default_smbios_ep_type;
> +}

why pcms->smbios_entry_point_type that we already have is not enough
we need to add extra pcms->smbios_use_cmdline_ep_type field?

> +
>  /* These values are guest ABI, do not change */
>  smbios_set_defaults("QEMU", mc->desc,
>  mc->name, pcmc->smbios_legacy_mode,
> @@ -1782,7 +1790,10 @@ static void pc_machine_set_smbios_ep(Object *obj, 
> Visitor *v, const char *name,
>  {
>  PCMachineState *pcms = PC_MACHINE(obj);
>  
> -visit_type_SmbiosEntryPointType(v, name, >smbios_entry_point_type, 
> errp);
> +pcms->smbios_use_cmdline_ep_type =
> +visit_type_SmbiosEntryPointType(v, name,
> +>smbios_entry_point_type,
> +errp);
>  }
>  
>  static void pc_machine_get_max_ram_below_4g(Object *obj, Visitor *v,
> @@ -1992,6 +2003,7 @@ static void pc_machine_class_init(ObjectClass *oc, void 
> *data)
>  mc->nvdimm_supported = true;
>  mc->smp_props.dies_supported = true;
>  mc->default_ram_id = "pc.ram";
> +pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_64;
>  
>  object_class_property_add(oc, PC_MACHINE_MAX_RAM_BELOW_4G, "size",
>  pc_machine_get_max_ram_below_4g, pc_machine_set_max_ram_below_4g,
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index da6ba4eeb4..1a2bb25c75 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -467,11 +467,16 @@ DEFINE_I440FX_MACHINE(v8_1, "pc-i440fx-8.1", NULL,
>  
>  static void pc_i440fx_8_0_machine_options(MachineClass *m)
>  {
> +PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
> +
>  pc_i440fx_8_1_machine_options(m);
>  m->alias = NULL;
>  m->is_default = false;
>  compat_props_add(m->compat_props, hw_compat_8_0, hw_compat_8_0_len);
>  compat_props_add(m->compat_props, pc_compat_8_0, pc_compat_8_0_len);
> +
> +/* For pc-i44fx-8.0 and older, use SMBIOS 2.8 by default */
> +pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_32;
>  }
>  
>  DEFINE_I440FX_MACHINE(v8_0, "pc-i440fx-8.0", NULL,
> diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
> index a58cd1d3ea..371cca7484 100644
> --- a/hw/i386/pc_q35.c
> +++ b/hw/i386/pc_q35.c
> @@ -379,10 +379,15 @@ DEFINE_Q35_MACHINE(v8_1, "pc-q35-8.1", NULL,
>  
>  static void pc_q35_8_0_machine_options(MachineClass *m)
>  {
> +PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
> +
>  pc_q35_8_1_machine_options(m);
>  m->alias = NULL;
>  compat_props_add(m->compat_props, hw_compat_8_0, hw_compat_8_0_len);
>  compat_props_add(m->compat_props, pc_compat_8_0, pc_compat_8_0_len);
> +
> +/* For pc-q35-8.0 and older, use SMBIOS 2.8 by default */
> +pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_32;
>  }
>  
>  DEFINE_Q35_MACHINE(v8_0, "pc-q35-8.0", NULL,
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index c661e9cc80..f754da5a38 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -50,6 +50,7 @@ typedef struct PCMachineState {
>  bool i8042_enabled;
>  bool default_bus_bypass_iommu;
>  uint64_t max_fw_size;
> +bool smbios_use_cmdline_ep_type;
>  
>  /* ACPI Memory hotplug IO base address */
>  hwaddr memhp_io_base;
> @@ -110,6 +111,7 @@ struct PCMachineClass {
>  bool smbios_defaults;
>  bool smbios_legacy_mode;
>  bool smbios_uuid_encoded;
> +SmbiosEntryPointType default_smbios_ep_type;
>  
>  /* RAM / address space compat: */
>  bool gigabyte_align;




[PATCH v4 2/3] hw/i386/pc: Default to use SMBIOS 3.0 for newer machine models

2023-06-05 Thread Suravee Suthikulpanit
Currently, pc-q35 and pc-i44fx machine models are default to use SMBIOS 2.8
(32-bit entry point). Since SMBIOS 3.0 (64-bit entry point) is now fully
supported since QEMU 7.0, default to use SMBIOS 3.0 for newer machine
models. This is necessary to avoid the following message when launching
a VM with large number of vcpus.

   "SMBIOS 2.1 table length 66822 exceeds 65535"

Note that user can still override the entry point tyme w/ QEMU option
"-M ..., smbios-entry-point-type=[32|64].

Signed-off-by: Suravee Suthikulpanit 
---
 hw/i386/pc.c | 14 +-
 hw/i386/pc_piix.c|  5 +
 hw/i386/pc_q35.c |  5 +
 include/hw/i386/pc.h |  2 ++
 4 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 8fc34f5454..5a87b82185 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -786,6 +786,14 @@ void pc_machine_done(Notifier *notifier, void *data)
 if (pcmc->smbios_defaults) {
 MachineClass *mc = MACHINE_GET_CLASS(pcms);
 
+/*
+ * Check if user has specified a command line option
+ * to override the SMBIOS default entry point type.
+ */
+if (!pcms->smbios_use_cmdline_ep_type) {
+pcms->smbios_entry_point_type = pcmc->default_smbios_ep_type;
+}
+
 /* These values are guest ABI, do not change */
 smbios_set_defaults("QEMU", mc->desc,
 mc->name, pcmc->smbios_legacy_mode,
@@ -1782,7 +1790,10 @@ static void pc_machine_set_smbios_ep(Object *obj, 
Visitor *v, const char *name,
 {
 PCMachineState *pcms = PC_MACHINE(obj);
 
-visit_type_SmbiosEntryPointType(v, name, >smbios_entry_point_type, 
errp);
+pcms->smbios_use_cmdline_ep_type =
+visit_type_SmbiosEntryPointType(v, name,
+>smbios_entry_point_type,
+errp);
 }
 
 static void pc_machine_get_max_ram_below_4g(Object *obj, Visitor *v,
@@ -1992,6 +2003,7 @@ static void pc_machine_class_init(ObjectClass *oc, void 
*data)
 mc->nvdimm_supported = true;
 mc->smp_props.dies_supported = true;
 mc->default_ram_id = "pc.ram";
+pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_64;
 
 object_class_property_add(oc, PC_MACHINE_MAX_RAM_BELOW_4G, "size",
 pc_machine_get_max_ram_below_4g, pc_machine_set_max_ram_below_4g,
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index da6ba4eeb4..1a2bb25c75 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -467,11 +467,16 @@ DEFINE_I440FX_MACHINE(v8_1, "pc-i440fx-8.1", NULL,
 
 static void pc_i440fx_8_0_machine_options(MachineClass *m)
 {
+PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
+
 pc_i440fx_8_1_machine_options(m);
 m->alias = NULL;
 m->is_default = false;
 compat_props_add(m->compat_props, hw_compat_8_0, hw_compat_8_0_len);
 compat_props_add(m->compat_props, pc_compat_8_0, pc_compat_8_0_len);
+
+/* For pc-i44fx-8.0 and older, use SMBIOS 2.8 by default */
+pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_32;
 }
 
 DEFINE_I440FX_MACHINE(v8_0, "pc-i440fx-8.0", NULL,
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index a58cd1d3ea..371cca7484 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -379,10 +379,15 @@ DEFINE_Q35_MACHINE(v8_1, "pc-q35-8.1", NULL,
 
 static void pc_q35_8_0_machine_options(MachineClass *m)
 {
+PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
+
 pc_q35_8_1_machine_options(m);
 m->alias = NULL;
 compat_props_add(m->compat_props, hw_compat_8_0, hw_compat_8_0_len);
 compat_props_add(m->compat_props, pc_compat_8_0, pc_compat_8_0_len);
+
+/* For pc-q35-8.0 and older, use SMBIOS 2.8 by default */
+pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_32;
 }
 
 DEFINE_Q35_MACHINE(v8_0, "pc-q35-8.0", NULL,
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index c661e9cc80..f754da5a38 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -50,6 +50,7 @@ typedef struct PCMachineState {
 bool i8042_enabled;
 bool default_bus_bypass_iommu;
 uint64_t max_fw_size;
+bool smbios_use_cmdline_ep_type;
 
 /* ACPI Memory hotplug IO base address */
 hwaddr memhp_io_base;
@@ -110,6 +111,7 @@ struct PCMachineClass {
 bool smbios_defaults;
 bool smbios_legacy_mode;
 bool smbios_uuid_encoded;
+SmbiosEntryPointType default_smbios_ep_type;
 
 /* RAM / address space compat: */
 bool gigabyte_align;
-- 
2.34.1