fix ParseMem to handle hotplug memory format
This commit is contained in:
@@ -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=")
|
||||||
|
|||||||
@@ -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"},
|
||||||
|
|||||||
Reference in New Issue
Block a user