| QEMU memory hotplug | 
 | =================== | 
 |  | 
 | This document explains how to use the memory hotplug feature in QEMU, | 
 | which is present since v2.1.0. | 
 |  | 
 | Guest support is required for memory hotplug to work. | 
 |  | 
 | Basic RAM hotplug | 
 | ----------------- | 
 |  | 
 | In order to be able to hotplug memory, QEMU has to be told how many | 
 | hotpluggable memory slots to create and what is the maximum amount of | 
 | memory the guest can grow. This is done at startup time by means of | 
 | the -m command-line option, which has the following format: | 
 |  | 
 |  -m [size=]megs[,slots=n,maxmem=size] | 
 |  | 
 | Where, | 
 |  | 
 |  - "megs" is the startup RAM. It is the RAM the guest will boot with | 
 |  - "slots" is the number of hotpluggable memory slots | 
 |  - "maxmem" is the maximum RAM size the guest can have | 
 |  | 
 | For example, the following command-line: | 
 |  | 
 |  qemu [...] -m 1G,slots=3,maxmem=4G | 
 |  | 
 | Creates a guest with 1GB of memory and three hotpluggable memory slots. | 
 | The hotpluggable memory slots are empty when the guest is booted, so all | 
 | memory the guest will see after boot is 1GB. The maximum memory the | 
 | guest can reach is 4GB. This means that three additional gigabytes can be | 
 | hotplugged by using any combination of the available memory slots. | 
 |  | 
 | Two monitor commands are used to hotplug memory: | 
 |  | 
 |  - "object_add": creates a memory backend object | 
 |  - "device_add": creates a front-end pc-dimm device and inserts it | 
 |                  into the first empty slot | 
 |  | 
 | For example, the following commands add another 1GB to the guest | 
 | discussed earlier: | 
 |  | 
 |   (qemu) object_add memory-backend-ram,id=mem1,size=1G | 
 |   (qemu) device_add pc-dimm,id=dimm1,memdev=mem1 | 
 |  | 
 | Using the file backend | 
 | ---------------------- | 
 |  | 
 | Besides basic RAM hotplug, QEMU also supports using files as a memory | 
 | backend. This is useful for using hugetlbfs in Linux, which provides | 
 | access to bigger page sizes. | 
 |  | 
 | For example, assuming that the host has 1GB hugepages available in | 
 | the /mnt/hugepages-1GB directory, a 1GB hugepage could be hotplugged | 
 | into the guest from the previous section with the following commands: | 
 |  | 
 |   (qemu) object_add memory-backend-file,id=mem1,size=1G,mem-path=/mnt/hugepages-1GB | 
 |   (qemu) device_add pc-dimm,id=dimm1,memdev=mem1 | 
 |  | 
 | It's also possible to start a guest with memory cold-plugged into the | 
 | hotpluggable memory slots. This might seem counterintuitive at first, | 
 | but this allows for a lot of flexibility when using the file backend. | 
 |  | 
 | In the following command-line example, an 8GB guest is created where 6GB | 
 | comes from regular RAM, 1GB is a 1GB hugepage page and 256MB is from | 
 | 2MB pages. Also, the guest has additional memory slots to hotplug more | 
 | 2GB if needed: | 
 |  | 
 |  qemu [...] -m 6GB,slots=4,maxmem=10G \ | 
 |    -object memory-backend-file,id=mem1,size=1G,mem-path=/mnt/hugepages-1G \ | 
 |    -device pc-dimm,id=dimm1,memdev=mem1 \ | 
 |    -object memory-backend-file,id=mem2,size=256M,mem-path=/mnt/hugepages-2MB \ | 
 |    -device pc-dimm,id=dimm2,memdev=mem2 | 
 |  | 
 |  | 
 | RAM hot-unplug | 
 | --------------- | 
 |  | 
 | In order to be able to hot unplug pc-dimm device, QEMU has to be told the ids | 
 | of pc-dimm device and memory backend object. The ids were assigned when you hot | 
 | plugged memory. | 
 |  | 
 | Two monitor commands are used to hot unplug memory: | 
 |  | 
 |  - "device_del": deletes a front-end pc-dimm device | 
 |  - "object_del": deletes a memory backend object | 
 |  | 
 | For example, assuming that the pc-dimm device with id "dimm1" exists, and its memory | 
 | backend is "mem1", the following commands tries to remove it. | 
 |  | 
 |   (qemu) device_del dimm1 | 
 |   (qemu) object_del mem1 |