From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ryan Harper Subject: Re: [KVM-AUTOTEST PATCH] KVM test: Add hugepage variant Date: Wed, 29 Jul 2009 09:41:04 -0500 Message-ID: <20090729144104.GA21912@us.ibm.com> References: <1248838829-7804-1-git-send-email-lmr@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: autotest@test.kernel.org, kvm@vger.kernel.org, ldoktor@redhat.com, ryanh@us.ibm.com, mgoldish@redhat.com To: Lucas Meneghel Rodrigues Return-path: Received: from e36.co.us.ibm.com ([32.97.110.154]:52489 "EHLO e36.co.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753091AbZG2OlW (ORCPT ); Wed, 29 Jul 2009 10:41:22 -0400 Received: from d03relay05.boulder.ibm.com (d03relay05.boulder.ibm.com [9.17.195.107]) by e36.co.us.ibm.com (8.14.3/8.13.1) with ESMTP id n6TEdirt014473 for ; Wed, 29 Jul 2009 08:39:44 -0600 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d03relay05.boulder.ibm.com (8.13.8/8.13.8/NCO v9.2) with ESMTP id n6TEf71s151030 for ; Wed, 29 Jul 2009 08:41:07 -0600 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n6TEf6D0008066 for ; Wed, 29 Jul 2009 08:41:07 -0600 Content-Disposition: inline In-Reply-To: <1248838829-7804-1-git-send-email-lmr@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: * Lucas Meneghel Rodrigues [2009-07-28 22:40]: > This patch adds a small setup script to set up huge memory > pages during the kvm tests execution. Also, added hugepage setup to t= he > fc8_quick sample. >=20 > Signed-off-by: Luk=E1?? Doktor > Signed-off-by: Lucas Meneghel Rodrigues Looks good. one nit below. Signed-off-by: Ryan Harper > --- > client/tests/kvm/kvm_tests.cfg.sample | 8 +++ > client/tests/kvm/kvm_vm.py | 11 +++ > client/tests/kvm/scripts/hugepage.py | 109 +++++++++++++++++++++++= ++++++++++ > 3 files changed, 128 insertions(+), 0 deletions(-) > create mode 100644 client/tests/kvm/scripts/hugepage.py >=20 > diff --git a/client/tests/kvm/kvm_tests.cfg.sample b/client/tests/kvm= /kvm_tests.cfg.sample > index 2d75a66..7cd12cb 100644 > --- a/client/tests/kvm/kvm_tests.cfg.sample > +++ b/client/tests/kvm/kvm_tests.cfg.sample > @@ -587,6 +587,13 @@ variants: >=20 >=20 > variants: > + - @kvm_smallpages: > + - kvm_hugepages: > + pre_command =3D "/usr/bin/python scripts/hugepage.py /mnt/kv= m_hugepage" > + extra_params +=3D " -mem-path /mnt/kvm_hugepage" > + > + > +variants: > - @basic: > only Fedora Windows > - @full: > @@ -598,6 +605,7 @@ variants: > only Fedora.8.32 > only install setup boot shutdown > only rtl8139 > + only kvm_hugepages > - @sample1: > only qcow2 > only ide > diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py > index d96b359..eba9b84 100644 > --- a/client/tests/kvm/kvm_vm.py > +++ b/client/tests/kvm/kvm_vm.py > @@ -397,6 +397,17 @@ class VM: > self.destroy() > return False >=20 > + # Get the output so far, to see if we have any problems = with > + # hugepage setup. > + output =3D self.process.get_output() > + > + if "alloc_mem_area" in output: > + logging.error("Could not allocate hugepage memory; " > + "qemu command:\n%s" % qemu_command) > + logging.error("Output:" + kvm_utils.format_str_for_m= essage( > + self.process.get_output())) > + return False > + > logging.debug("VM appears to be alive with PID %d", > self.process.get_pid()) > return True > diff --git a/client/tests/kvm/scripts/hugepage.py b/client/tests/kvm/= scripts/hugepage.py > new file mode 100644 > index 0000000..dc36da4 > --- /dev/null > +++ b/client/tests/kvm/scripts/hugepage.py > @@ -0,0 +1,109 @@ > +#!/usr/bin/python > +# -*- coding: utf-8 -*- > +import os, sys, time > + > +""" > +Simple script to allocate enough hugepages for KVM testing purposes. > +""" > + > +class HugePageError(Exception): > + """ > + Simple wrapper for the builtin Exception class. > + """ > + pass > + > + > +class HugePage: > + def __init__(self, hugepage_path=3DNone): > + """ > + Gets environment variable values and calculates the target n= umber > + of huge memory pages. > + > + @param hugepage_path: Path where to mount hugetlbfs path, if= not > + yet configured. > + """ > + self.vms =3D len(os.environ['KVM_TEST_vms'].split()) > + self.mem =3D int(os.environ['KVM_TEST_mem']) > + try: > + self.max_vms =3D int(os.environ['KVM_TEST_max_vms']) > + except KeyError: > + self.max_vms =3D 0 > + > + if hugepage_path: > + self.hugepage_path =3D hugepage_path > + else: > + self.hugepage_path =3D '/mnt/kvm_hugepage' > + > + self.hugepage_size =3D self.get_hugepage_size() > + self.target_hugepages =3D self.get_target_hugepages() > + > + > + def get_hugepage_size(self): > + """ > + Get the current system setting for huge memory page size. > + """ > + meminfo =3D open('/proc/meminfo', 'r').readlines() > + huge_line_list =3D [h for h in meminfo if h.startswith("Huge= pagesize")] > + try: > + return int(huge_line_list[0].split()[1]) > + except ValueError, e: > + raise HugePageError("Could not get huge page size settin= g from " > + "/proc/meminfo: %s" % e) > + > + > + def get_target_hugepages(self): > + """ > + Calculate the target number of hugepages for testing purpose= s. > + """ > + if self.vms < self.max_vms: > + self.vms =3D self.max_vms > + vmsm =3D (self.vms * self.mem) + (self.vms * 64) Nit: Maybe a comment about the fudge factor being added in? > + return int(vmsm * 1024 / self.hugepage_size) > + > + > + def set_hugepages(self): > + """ > + Sets the hugepage limit to the target hugepage value calcula= ted. > + """ > + hugepage_cfg =3D open("/proc/sys/vm/nr_hugepages", "r+") > + hp =3D hugepage_cfg.readline() > + while int(hp) < self.target_hugepages: > + loop_hp =3D hp > + hugepage_cfg.write(str(self.target_hugepages)) > + hugepage_cfg.flush() > + hugepage_cfg.seek(0) > + hp =3D int(hugepage_cfg.readline()) > + if loop_hp =3D=3D hp: > + raise HugePageError("Cannot set the kernel hugepage = setting " > + "to the target value of %d hugep= ages." % > + self.target_hugepages) > + hugepage_cfg.close() > + > + > + def mount_hugepage_fs(self): > + """ > + Verify if there's a hugetlbfs mount set. If there's none, wi= ll set up > + a hugetlbfs mount using the class attribute that defines the= mount > + point. > + """ > + if not os.path.ismount(self.hugepage_path): > + if not os.path.isdir(self.hugepage_path): > + os.makedirs(self.hugepage_path) > + cmd =3D "mount -t hugetlbfs none %s" % self.hugepage_pat= h > + if os.system(cmd): > + raise HugePageError("Cannot mount hugetlbfs path %s"= % > + self.hugepage_path) > + > + > + def setup(self): > + self.set_hugepages() > + self.mount_hugepage_fs() > + > + > +if __name__ =3D=3D "__main__": > + if len(sys.argv) < 2: > + huge_page =3D HugePage() > + else: > + huge_page =3D HugePage(sys.argv[1]) > + > + huge_page.setup() > --=20 > 1.6.2.5 >=20 > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html --=20 Ryan Harper Software Engineer; Linux Technology Center IBM Corp., Austin, Tx ryanh@us.ibm.com