[PATCH 0/3 - v2] Checks memory alignment to 256 MiB and number of slots in PPC

V2: - Created global variable to hold PPC Memory aligment value: 256 currently - Fix missing platform import - Changed mathematical operators by bitwise operators when manipulate memory values V1: This patchset makes necessary changes to check and change in PPC: - memory and maxMemory must be aligned to 256 MiB - Number of slots must be <= 32 Rodrigo Trujillo (3): Check memory alignment in PowerPC to 256MiB Check and align number of memory slot to 32 in PowerPC Change memory multipliers/divisors by bitwise operators src/wok/plugins/kimchi/i18n.py | 3 ++ src/wok/plugins/kimchi/model/vms.py | 38 ++++++++++++++++++++-- src/wok/plugins/kimchi/osinfo.py | 7 ++++ src/wok/plugins/kimchi/tests/test_livemigration.py | 2 +- src/wok/plugins/kimchi/vmtemplate.py | 8 ++++- 5 files changed, 54 insertions(+), 4 deletions(-) -- 2.1.0

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@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."), "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( -- 2.1.0

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@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(

This patch checks the number os memory slots needed in PowerPC and raises an error if > 32, or set it to 32. Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo@linux.vnet.ibm.com> --- src/wok/plugins/kimchi/model/vms.py | 8 ++++++++ src/wok/plugins/kimchi/vmtemplate.py | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/wok/plugins/kimchi/model/vms.py b/src/wok/plugins/kimchi/model/vms.py index 8b7d4bd..3c4c3d4 100644 --- a/src/wok/plugins/kimchi/model/vms.py +++ b/src/wok/plugins/kimchi/model/vms.py @@ -823,6 +823,10 @@ class VMModel(object): int(maxMem.text) != (host_mem << 10): force_max_mem_update = True + # max 32 slots on Power + if slots > 32: + slots = 32 + if maxMem is None: max_mem_xml = E.maxMemory( str(host_mem * 1024), @@ -881,6 +885,10 @@ class VMModel(object): # New memory value is same that current memory set return + distro, _, _ = platform.linux_distribution() + if distro == "IBM_PowerKVM" and needed_slots > 32: + raise OperationFailed('KCHVM0045E') + # Finally, we are ok to hot add the memory devices try: self._hot_add_memory_devices(dom, needed_slots) diff --git a/src/wok/plugins/kimchi/vmtemplate.py b/src/wok/plugins/kimchi/vmtemplate.py index 283d94d..d653665 100644 --- a/src/wok/plugins/kimchi/vmtemplate.py +++ b/src/wok/plugins/kimchi/vmtemplate.py @@ -18,6 +18,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA import os +import platform import stat import time import urlparse @@ -328,13 +329,18 @@ class VMTemplate(object): # Setting maximum number of slots to avoid errors when hotplug memory # Number of slots are the numbers of chunks of 1GB that fit inside - # the max_memory of the host minus memory assigned to the VM + # the max_memory of the host minus memory assigned to the VM. It + # cannot have more than 32 slots in Power. params['slots'] = ((params['max_memory'] >> 10) - params['memory']) >> 10 if params['slots'] < 0: raise OperationFailed("KCHVM0041E") elif params['slots'] == 0: params['slots'] = 1 + elif params['slots'] > 32: + distro, _, _ = platform.linux_distribution() + if distro == "IBM_PowerKVM": + params['slots'] = 32 xml = """ <domain type='%(domain)s'> -- 2.1.0

Reviewed-by: Aline Manera <alinefm@linux.vnet.ibm.com> On 12/11/2015 23:42, Rodrigo Trujillo wrote:
This patch checks the number os memory slots needed in PowerPC and raises an error if > 32, or set it to 32.
Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo@linux.vnet.ibm.com> --- src/wok/plugins/kimchi/model/vms.py | 8 ++++++++ src/wok/plugins/kimchi/vmtemplate.py | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/src/wok/plugins/kimchi/model/vms.py b/src/wok/plugins/kimchi/model/vms.py index 8b7d4bd..3c4c3d4 100644 --- a/src/wok/plugins/kimchi/model/vms.py +++ b/src/wok/plugins/kimchi/model/vms.py @@ -823,6 +823,10 @@ class VMModel(object): int(maxMem.text) != (host_mem << 10): force_max_mem_update = True
+ # max 32 slots on Power + if slots > 32: + slots = 32 + if maxMem is None: max_mem_xml = E.maxMemory( str(host_mem * 1024), @@ -881,6 +885,10 @@ class VMModel(object): # New memory value is same that current memory set return
+ distro, _, _ = platform.linux_distribution() + if distro == "IBM_PowerKVM" and needed_slots > 32: + raise OperationFailed('KCHVM0045E') + # Finally, we are ok to hot add the memory devices try: self._hot_add_memory_devices(dom, needed_slots) diff --git a/src/wok/plugins/kimchi/vmtemplate.py b/src/wok/plugins/kimchi/vmtemplate.py index 283d94d..d653665 100644 --- a/src/wok/plugins/kimchi/vmtemplate.py +++ b/src/wok/plugins/kimchi/vmtemplate.py @@ -18,6 +18,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
import os +import platform import stat import time import urlparse @@ -328,13 +329,18 @@ class VMTemplate(object):
# Setting maximum number of slots to avoid errors when hotplug memory # Number of slots are the numbers of chunks of 1GB that fit inside - # the max_memory of the host minus memory assigned to the VM + # the max_memory of the host minus memory assigned to the VM. It + # cannot have more than 32 slots in Power. params['slots'] = ((params['max_memory'] >> 10) - params['memory']) >> 10 if params['slots'] < 0: raise OperationFailed("KCHVM0041E") elif params['slots'] == 0: params['slots'] = 1 + elif params['slots'] > 32: + distro, _, _ = platform.linux_distribution() + if distro == "IBM_PowerKVM": + params['slots'] = 32
xml = """ <domain type='%(domain)s'>

In Kimchi memory manipulation code, memory values are most of the time multiplied or divided by 1024. This patch changes these operations, replacing by << 10 or >> 10, as standard. Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo@linux.vnet.ibm.com> --- src/wok/plugins/kimchi/model/vms.py | 4 ++-- src/wok/plugins/kimchi/tests/test_livemigration.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wok/plugins/kimchi/model/vms.py b/src/wok/plugins/kimchi/model/vms.py index 3c4c3d4..ab44c4b 100644 --- a/src/wok/plugins/kimchi/model/vms.py +++ b/src/wok/plugins/kimchi/model/vms.py @@ -829,7 +829,7 @@ class VMModel(object): if maxMem is None: max_mem_xml = E.maxMemory( - str(host_mem * 1024), + str(host_mem << 10), unit='Kib', slots=str(slots)) root.insert(0, max_mem_xml) @@ -877,7 +877,7 @@ class VMModel(object): # Check slot spaces: total_slots = int(xpath_get_text(xml, './maxMemory/@slots')[0]) - needed_slots = (new_mem - old_mem) / 1024 + needed_slots = (new_mem - old_mem) >> 10 used_slots = len(xpath_get_text(xml, './devices/memory')) if needed_slots > (total_slots - used_slots): raise OperationFailed('KCHVM0045E') diff --git a/src/wok/plugins/kimchi/tests/test_livemigration.py b/src/wok/plugins/kimchi/tests/test_livemigration.py index 1fdcd65..1c6d92d 100644 --- a/src/wok/plugins/kimchi/tests/test_livemigration.py +++ b/src/wok/plugins/kimchi/tests/test_livemigration.py @@ -94,7 +94,7 @@ class LiveMigrationTests(unittest.TestCase): 'disks': [], 'cdrom': UBUNTU_ISO, 'memory': 2048, - 'max_memory': 4096*1024} + 'max_memory': 4096 << 10} self.inst.templates_create(params) def tearDown(self): -- 2.1.0

Reviewed-by: Aline Manera <alinefm@linux.vnet.ibm.com> On 12/11/2015 23:42, Rodrigo Trujillo wrote:
In Kimchi memory manipulation code, memory values are most of the time multiplied or divided by 1024. This patch changes these operations, replacing by << 10 or >> 10, as standard.
Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo@linux.vnet.ibm.com> --- src/wok/plugins/kimchi/model/vms.py | 4 ++-- src/wok/plugins/kimchi/tests/test_livemigration.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/wok/plugins/kimchi/model/vms.py b/src/wok/plugins/kimchi/model/vms.py index 3c4c3d4..ab44c4b 100644 --- a/src/wok/plugins/kimchi/model/vms.py +++ b/src/wok/plugins/kimchi/model/vms.py @@ -829,7 +829,7 @@ class VMModel(object):
if maxMem is None: max_mem_xml = E.maxMemory( - str(host_mem * 1024), + str(host_mem << 10), unit='Kib', slots=str(slots)) root.insert(0, max_mem_xml) @@ -877,7 +877,7 @@ class VMModel(object):
# Check slot spaces: total_slots = int(xpath_get_text(xml, './maxMemory/@slots')[0]) - needed_slots = (new_mem - old_mem) / 1024 + needed_slots = (new_mem - old_mem) >> 10 used_slots = len(xpath_get_text(xml, './devices/memory')) if needed_slots > (total_slots - used_slots): raise OperationFailed('KCHVM0045E') diff --git a/src/wok/plugins/kimchi/tests/test_livemigration.py b/src/wok/plugins/kimchi/tests/test_livemigration.py index 1fdcd65..1c6d92d 100644 --- a/src/wok/plugins/kimchi/tests/test_livemigration.py +++ b/src/wok/plugins/kimchi/tests/test_livemigration.py @@ -94,7 +94,7 @@ class LiveMigrationTests(unittest.TestCase): 'disks': [], 'cdrom': UBUNTU_ISO, 'memory': 2048, - 'max_memory': 4096*1024} + 'max_memory': 4096 << 10} self.inst.templates_create(params)
def tearDown(self):

I was not able to apply patches 2/3 and 3/3 as they depend on patch 1/3 which needs to be resend. I will wait for the next patch series to apply all those patches together. On 12/11/2015 23:42, Rodrigo Trujillo wrote:
V2: - Created global variable to hold PPC Memory aligment value: 256 currently - Fix missing platform import - Changed mathematical operators by bitwise operators when manipulate memory values
V1: This patchset makes necessary changes to check and change in PPC: - memory and maxMemory must be aligned to 256 MiB - Number of slots must be <= 32
Rodrigo Trujillo (3): Check memory alignment in PowerPC to 256MiB Check and align number of memory slot to 32 in PowerPC Change memory multipliers/divisors by bitwise operators
src/wok/plugins/kimchi/i18n.py | 3 ++ src/wok/plugins/kimchi/model/vms.py | 38 ++++++++++++++++++++-- src/wok/plugins/kimchi/osinfo.py | 7 ++++ src/wok/plugins/kimchi/tests/test_livemigration.py | 2 +- src/wok/plugins/kimchi/vmtemplate.py | 8 ++++- 5 files changed, 54 insertions(+), 4 deletions(-)

The patchset does not apply in current kimchi master but I believe you'll rebase it for v3 anyway. As far as I've tested the patchset (fixing the conflicts and so on), it works in IBM Powerkvm running in pSeries, with no additional unit tests breaking (in fact it solved some errors there \o/ ). I'll test again when you send the v3. Daniel On 11/12/2015 11:42 PM, Rodrigo Trujillo wrote:
V2: - Created global variable to hold PPC Memory aligment value: 256 currently - Fix missing platform import - Changed mathematical operators by bitwise operators when manipulate memory values
V1: This patchset makes necessary changes to check and change in PPC: - memory and maxMemory must be aligned to 256 MiB - Number of slots must be <= 32
Rodrigo Trujillo (3): Check memory alignment in PowerPC to 256MiB Check and align number of memory slot to 32 in PowerPC Change memory multipliers/divisors by bitwise operators
src/wok/plugins/kimchi/i18n.py | 3 ++ src/wok/plugins/kimchi/model/vms.py | 38 ++++++++++++++++++++-- src/wok/plugins/kimchi/osinfo.py | 7 ++++ src/wok/plugins/kimchi/tests/test_livemigration.py | 2 +- src/wok/plugins/kimchi/vmtemplate.py | 8 ++++- 5 files changed, 54 insertions(+), 4 deletions(-)

Thanks Aline and Daniel, I will send V3 Rodrigo On 11/17/2015 03:12 PM, Daniel Henrique Barboza wrote:
The patchset does not apply in current kimchi master but I believe you'll rebase it for v3 anyway.
As far as I've tested the patchset (fixing the conflicts and so on), it works in IBM Powerkvm running in pSeries, with no additional unit tests breaking (in fact it solved some errors there \o/ ).
I'll test again when you send the v3.
Daniel
On 11/12/2015 11:42 PM, Rodrigo Trujillo wrote:
V2: - Created global variable to hold PPC Memory aligment value: 256 currently - Fix missing platform import - Changed mathematical operators by bitwise operators when manipulate memory values
V1: This patchset makes necessary changes to check and change in PPC: - memory and maxMemory must be aligned to 256 MiB - Number of slots must be <= 32
Rodrigo Trujillo (3): Check memory alignment in PowerPC to 256MiB Check and align number of memory slot to 32 in PowerPC Change memory multipliers/divisors by bitwise operators
src/wok/plugins/kimchi/i18n.py | 3 ++ src/wok/plugins/kimchi/model/vms.py | 38 ++++++++++++++++++++-- src/wok/plugins/kimchi/osinfo.py | 7 ++++ src/wok/plugins/kimchi/tests/test_livemigration.py | 2 +- src/wok/plugins/kimchi/vmtemplate.py | 8 ++++- 5 files changed, 54 insertions(+), 4 deletions(-)
_______________________________________________ Kimchi-devel mailing list Kimchi-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/kimchi-devel
participants (3)
-
Aline Manera
-
Daniel Henrique Barboza
-
Rodrigo Trujillo