[Kimchi-devel] [PATCH 1/3 - v2] Check memory alignment in PowerPC to 256MiB

Aline Manera alinefm at linux.vnet.ibm.com
Mon Nov 16 20:28:36 UTC 2015



On 12/11/2015 23:42, Rodrigo Trujillo wrote:
> QEMU for Power requires memory aligned to 256MiB.
> This patch makes the checking and changes if necessary.
> This patch sets a global variable in osinfo.py, in case of this value
> change in the feature, code will be easier to update.
>
> Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>
> ---
>   src/wok/plugins/kimchi/i18n.py      |  3 +++
>   src/wok/plugins/kimchi/model/vms.py | 26 ++++++++++++++++++++++++++
>   src/wok/plugins/kimchi/osinfo.py    |  7 +++++++
>   3 files changed, 36 insertions(+)
>
> diff --git a/src/wok/plugins/kimchi/i18n.py b/src/wok/plugins/kimchi/i18n.py
> index 59b61de..0a77fe7 100644
> --- a/src/wok/plugins/kimchi/i18n.py
> +++ b/src/wok/plugins/kimchi/i18n.py
> @@ -19,6 +19,8 @@
>
>   import gettext


> +from wok.plugins.kimchi.osinfo import PPC_MEM_ALIGN
> +
>   _ = gettext.gettext
>
>
> @@ -115,6 +117,7 @@ messages = {
>       "KCHVM0058E": _("Failed to migrate virtual machine %(name)s due error: %(err)s"),
>       "KCHVM0059E": _("User name of the remote server must be a string."),
>       "KCHVM0060E": _("Destination host of the migration must be a string."),
> +    "KCHVM0061E": _("Memory value %(mem)s must be aligned to " + str(PPC_MEM_ALIGN) + "MiB."),

It would be better to have the replacement in the backend side. So th 
i18n.py is only for error messages without any logic.

So change the message to:

+    "KCHVM0061E": _("Memory value %(mem)s must be aligned to %(alignmem)s MiB."),


And proper do the replacement in the backend side.

>       "KCHVMHDEV0001E": _("VM %(vmid)s does not contain directly assigned host device %(dev_name)s."),
>       "KCHVMHDEV0002E": _("The host device %(dev_name)s is not allowed to directly assign to VM."),
> diff --git a/src/wok/plugins/kimchi/model/vms.py b/src/wok/plugins/kimchi/model/vms.py
> index f1ae8c2..8b7d4bd 100644
> --- a/src/wok/plugins/kimchi/model/vms.py
> +++ b/src/wok/plugins/kimchi/model/vms.py
> @@ -21,6 +21,7 @@ import copy
>   import libvirt
>   import lxml.etree as ET
>   import os
> +import platform
>   import random
>   import socket
>   import string
> @@ -45,6 +46,7 @@ from wok.plugins.kimchi import model
>   from wok.plugins.kimchi import vnc
>   from wok.plugins.kimchi.config import READONLY_POOL_TYPE, get_kimchi_version
>   from wok.plugins.kimchi.kvmusertests import UserTests
> +from wok.plugins.kimchi.osinfo import PPC_MEM_ALIGN
>   from wok.plugins.kimchi.model.config import CapabilitiesModel
>   from wok.plugins.kimchi.model.featuretests import FeatureTests
>   from wok.plugins.kimchi.model.templates import TemplateModel
> @@ -233,6 +235,13 @@ class VMModel(object):
>               vm_locks[name] = lock
>
>           with lock:
> +            # make sure memory is alingned in 256MiB
> +            distro, _, _ = platform.linux_distribution()
> +            if 'memory' in params and distro == "IBM_PowerKVM":
> +                if params['memory'] % PPC_MEM_ALIGN != 0:
> +                    raise InvalidParameter('KCHVM0061E',
> +                                           {'mem': str(params['memory'])})
> +
>               dom = self.get_vm(name, self.conn)
>               vm_name, dom = self._static_vm_update(name, dom, params)
>               self._live_vm_update(dom, params)
> @@ -803,6 +812,17 @@ class VMModel(object):
>                   raise OperationFailed("KCHVM0041E")
>               elif slots == 0:
>                   slots = 1
> +
> +            force_max_mem_update = False
> +            distro, _, _ = platform.linux_distribution()
> +            if distro == "IBM_PowerKVM":
> +                # max memory 256MiB alignment
> +                host_mem -= (host_mem % PPC_MEM_ALIGN)
> +                # force max memory update if it exists but it's wrong.
> +                if maxMem is not None and\
> +                   int(maxMem.text) != (host_mem << 10):
> +                    force_max_mem_update = True
> +
>               if maxMem is None:
>                   max_mem_xml = E.maxMemory(
>                       str(host_mem * 1024),
> @@ -816,6 +836,12 @@ class VMModel(object):
>                                             './maxMemory',
>                                             str(slots),
>                                             attr='slots')
> +
> +                if force_max_mem_update:
> +                    new_xml = xml_item_update(new_xml,
> +                                              './maxMemory',
> +                                              str(host_mem << 10))
> +
>               return new_xml
>           return ET.tostring(root, encoding="utf-8")
>
> diff --git a/src/wok/plugins/kimchi/osinfo.py b/src/wok/plugins/kimchi/osinfo.py
> index 7f8ace9..30ecd4f 100644
> --- a/src/wok/plugins/kimchi/osinfo.py
> +++ b/src/wok/plugins/kimchi/osinfo.py
> @@ -27,6 +27,9 @@ from distutils.version import LooseVersion
>
>   from wok.config import PluginPaths
>
> +# In PowerPC, memories must be aligned to 256 MiB
> +PPC_MEM_ALIGN = 256
> +
>
>   SUPPORTED_ARCHS = {'x86': ('i386', 'i686', 'x86_64'),
>                      'power': ('ppc', 'ppc64'),
> @@ -204,6 +207,10 @@ def lookup(distro, version):
>       # set up arch to ppc64 instead of ppc64le due to libvirt compatibility
>       if params["arch"] == "ppc64le":
>           params["arch"] = "ppc64"
> +        # in Power, memory must be aligned in 256MiB
> +        if (params['max_memory'] >> 10) % PPC_MEM_ALIGN != 0:
> +            alignment = params['max_memory'] % (PPC_MEM_ALIGN << 10)
> +            params['max_memory'] -= alignment
>
>       if distro in modern_version_bases[arch]:
>           if LooseVersion(version) >= LooseVersion(




More information about the Kimchi-devel mailing list