fix ParseMem to handle hotplug memory format

This commit is contained in:
illustris
2026-04-14 01:34:02 +05:30
parent 20e5c87e15
commit 27906ae236
2 changed files with 33 additions and 2 deletions

View File

@@ -255,6 +255,7 @@ func ParseVcores(cmdline []string) int {
// ParseMem extracts max memory in kB from cmdline. // ParseMem extracts max memory in kB from cmdline.
// Simple: -m 1024 -> 1024*1024 kB // Simple: -m 1024 -> 1024*1024 kB
// Hotplug: -m size=4096M,slots=255,maxmem=524288M -> parse size= key
// NUMA: memory-backend-ram...size=NM -> sum * 1024 kB // NUMA: memory-backend-ram...size=NM -> sum * 1024 kB
func ParseMem(cmdline []string) int64 { func ParseMem(cmdline []string) int64 {
mVal := FlagValue(cmdline, "-m") mVal := FlagValue(cmdline, "-m")
@@ -265,11 +266,23 @@ func ParseMem(cmdline []string) int64 {
if n, err := strconv.ParseInt(mVal, 10, 64); err == nil { if n, err := strconv.ParseInt(mVal, 10, 64); err == nil {
return n * 1024 // MB to kB return n * 1024 // MB to kB
} }
// NUMA case: search for memory-backend-ram in all args // Hotplug/NUMA: -m size=NM,slots=N,maxmem=NM
// Parse the size= key from the -m value itself
for _, part := range strings.Split(mVal, ",") {
if strings.HasPrefix(part, "size=") {
sizeStr := strings.TrimPrefix(part, "size=")
if strings.HasSuffix(sizeStr, "M") {
sizeStr = strings.TrimSuffix(sizeStr, "M")
if n, err := strconv.ParseInt(sizeStr, 10, 64); err == nil {
return n * 1024 // MB to kB
}
}
}
}
// NUMA fallback: sum memory-backend-ram object sizes
var total int64 var total int64
for _, arg := range cmdline { for _, arg := range cmdline {
if strings.Contains(arg, "memory-backend-ram") { if strings.Contains(arg, "memory-backend-ram") {
// Format: ...size=XXXM
for _, part := range strings.Split(arg, ",") { for _, part := range strings.Split(arg, ",") {
if strings.HasPrefix(part, "size=") { if strings.HasPrefix(part, "size=") {
sizeStr := strings.TrimPrefix(part, "size=") sizeStr := strings.TrimPrefix(part, "size=")

View File

@@ -93,6 +93,24 @@ func TestParseMem(t *testing.T) {
}, },
4096 * 1024, // 2048+2048 MB in kB 4096 * 1024, // 2048+2048 MB in kB
}, },
{
"hotplug without numa",
[]string{"-m", "size=131072M,slots=255,maxmem=524288M"},
131072 * 1024,
},
{
"large vm simple",
[]string{
"/usr/bin/kvm", "-id", "106",
"-name", "vm-106,debug-threads=on",
"-smp", "32,sockets=1,cores=32,maxcpus=32",
"-cpu", "host,+kvm_pv_eoi,+kvm_pv_unhalt",
"-m", "131072",
"-object", "iothread,id=iothread-virtio0",
"-machine", "type=q35+pve1",
},
131072 * 1024,
},
{ {
"missing", "missing",
[]string{"-smp", "4"}, []string{"-smp", "4"},