[Kimchi-devel] [PATCH][Kimchi] Fix memory values in guest with attached memory devices

Paulo Vital pvital at linux.vnet.ibm.com
Mon Feb 29 12:43:57 UTC 2016



Tested-by: Paulo Vital <pvital at linux.vnet.ibm.com>
Reviewed-by: Paulo Vital <pvital at linux.vnet.ibm.com>


On 02/27/2016 04:40 PM, Rodrigo Trujillo wrote:
> There are issues when user attaches memory devices to a guest (memory
> hotplug) and try later to modify the memory values offline.
> This patch fixes the problems, checking whether there are memory devices
> configured and adjusting the newmemory value.
> This patch sets the following rules:
> - if new memory value is equal max memory, all memory devices will be
>   removed
> - if new memory is greater than old value, just update the memory
> - if new memory is lesser than old value, always remove 1G memory
>   devices first and then decrease the memory value until reach the
>   amount requested
> 
> Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>
> ---
>  model/vms.py | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
> 
> diff --git a/model/vms.py b/model/vms.py
> index c376741..8c3d4c4 100644
> --- a/model/vms.py
> +++ b/model/vms.py
> @@ -825,6 +825,24 @@ class VMModel(object):
>          validate_memory({'current': newMem >> 10,
>                           'maxmemory': newMaxMem >> 10})
> 
> +        # Adjust memory devices to new memory, if necessary
> +        memDevs = root.findall('./devices/memory')
> +        if len(memDevs) != 0 and hasMem:
> +            if newMem == newMaxMem:
> +                for dev in memDevs:
> +                    root.find('./devices').remove(dev)
> +            elif newMem > (oldMem << 10):
> +                newMem = newMem - (len(memDevs) * (1024 << 10))
> +            elif newMem < (oldMem << 10):
> +                devsRemove = len(memDevs) - (oldMem - (newMem >> 10))/1024 - 1
> +                for dev in memDevs:
> +                    if int(dev.xpath('./address/@slot')[0]) > devsRemove:
> +                        root.find('./devices').remove(dev)
> +                newMem = newMem - (len(root.findall('./devices/memory'))
> +                                   * 1024 << 10)
> +            elif newMem == (oldMem << 10):
> +                newMem = newMem - ((len(memDevs) * 1024) << 10)
> +
>          def _get_slots(mem, maxMem):
>              slots = (maxMem - mem) >> 10 >> 10
>              # Libvirt does not accepts slots <= 1
> 




More information about the Kimchi-devel mailing list