qemu/hw/smbios
Igor Mammedov 62f182c97b smbios: make memory device size configurable per Machine
Currently QEMU describes initial[1] RAM* in SMBIOS as a series of
virtual DIMMs (capped at 16Gb max) using type 17 structure entries.

Which is fine for the most cases.  However when starting guest
with terabytes of RAM this leads to too many memory device
structures, which eventually upsets linux kernel as it reserves
only 64K for these entries and when that border is crossed out
it runs out of reserved memory.

Instead of partitioning initial RAM on 16Gb DIMMs, use maximum
possible chunk size that SMBIOS spec allows[2]. Which lets
encode RAM in lower 31 bits of 32bit field (which amounts upto
2047Tb per DIMM).
As result initial RAM will generate only one type 17 structure
until host/guest reach ability to use more RAM in the future.

Compat changes:
We can't unconditionally change chunk size as it will break
QEMU<->guest ABI (and migration). Thus introduce a new machine
class field that would let older versioned machines to use
legacy 16Gb chunks, while new(er) machine type[s] use maximum
possible chunk size.

PS:
While it might seem to be risky to rise max entry size this large
(much beyond of what current physical RAM modules support),
I'd not expect it causing much issues, modulo uncovering bugs
in software running within guest. And those should be fixed
on guest side to handle SMBIOS spec properly, especially if
guest is expected to support so huge RAM configs.

In worst case, QEMU can reduce chunk size later if we would
care enough about introducing a workaround for some 'unfixable'
guest OS, either by fixing up the next machine type or
giving users a CLI option to customize it.

1) Initial RAM - is RAM configured with help '-m SIZE' CLI option/
   implicitly defined by machine. It doesn't include memory
   configured with help of '-device' option[s] (pcdimm,nvdimm,...)
2) SMBIOS 3.1.0 7.18.5 Memory Device — Extended Size

PS:
* tested on 8Tb host with RHEL6 guest, which seems to parse
  type 17 SMBIOS table entries correctly (according to 'dmidecode').

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Message-Id: <20240715122417.4059293-1-imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
2024-07-22 20:15:41 -04:00
..
Kconfig smbios: build legacy mode code only for 'pc' machine 2024-03-18 08:42:45 -04:00
meson.build smbios: build legacy mode code only for 'pc' machine 2024-03-18 08:42:45 -04:00
smbios_build.h hw/smbios: add core_count2 to smbios table type 4 2022-11-07 14:08:17 -05:00
smbios_legacy_stub.c hw/smbios: add stub for smbios_get_table_legacy() 2024-03-26 14:32:54 +01:00
smbios_legacy.c smbios: add extra comments to smbios_get_table_legacy() 2024-03-18 08:42:46 -04:00
smbios_type_38-stub.c hw/smbios: Remove "smbios_ipmi.h" 2018-12-19 16:48:16 -05:00
smbios_type_38.c smbios:ipmi: Ignore IPMI devices with no fwinfo function 2019-09-20 14:08:10 -05:00
smbios-stub.c hw/smbios: Dumb down smbios_entry_add() stub 2023-02-23 14:10:17 +01:00
smbios.c smbios: make memory device size configurable per Machine 2024-07-22 20:15:41 -04:00