From patchwork Wed Jul 29 03:40:28 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Lucas Meneghel Rodrigues X-Patchwork-Id: 38054 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n6T3egpN001785 for ; Wed, 29 Jul 2009 03:40:42 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754690AbZG2Dkj (ORCPT ); Tue, 28 Jul 2009 23:40:39 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754499AbZG2Dkj (ORCPT ); Tue, 28 Jul 2009 23:40:39 -0400 Received: from mx2.redhat.com ([66.187.237.31]:33112 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754495AbZG2Dkj (ORCPT ); Tue, 28 Jul 2009 23:40:39 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n6T3ea1U024652; Tue, 28 Jul 2009 23:40:36 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n6T3eZkG013547; Tue, 28 Jul 2009 23:40:35 -0400 Received: from localhost.localdomain (vpn-10-56.bos.redhat.com [10.16.10.56]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n6T3eWUA024642; Tue, 28 Jul 2009 23:40:32 -0400 From: Lucas Meneghel Rodrigues To: autotest@test.kernel.org Cc: kvm@vger.kernel.org, ldoktor@redhat.com, ryanh@us.ibm.com, mgoldish@redhat.com, Lucas Meneghel Rodrigues Subject: [KVM-AUTOTEST PATCH] KVM test: Add hugepage variant Date: Wed, 29 Jul 2009 00:40:28 -0300 Message-Id: <1248838829-7804-1-git-send-email-lmr@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org This patch adds a small setup script to set up huge memory pages during the kvm tests execution. Also, added hugepage setup to the fc8_quick sample. Signed-off-by: Lukáš Doktor Signed-off-by: Lucas Meneghel Rodrigues Acked-by: Lukáš Doktor 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 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: variants: + - @kvm_smallpages: + - kvm_hugepages: + pre_command = "/usr/bin/python scripts/hugepage.py /mnt/kvm_hugepage" + extra_params += " -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 + # Get the output so far, to see if we have any problems with + # hugepage setup. + output = 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_message( + 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=None): + """ + Gets environment variable values and calculates the target number + of huge memory pages. + + @param hugepage_path: Path where to mount hugetlbfs path, if not + yet configured. + """ + self.vms = len(os.environ['KVM_TEST_vms'].split()) + self.mem = int(os.environ['KVM_TEST_mem']) + try: + self.max_vms = int(os.environ['KVM_TEST_max_vms']) + except KeyError: + self.max_vms = 0 + + if hugepage_path: + self.hugepage_path = hugepage_path + else: + self.hugepage_path = '/mnt/kvm_hugepage' + + self.hugepage_size = self.get_hugepage_size() + self.target_hugepages = self.get_target_hugepages() + + + def get_hugepage_size(self): + """ + Get the current system setting for huge memory page size. + """ + meminfo = open('/proc/meminfo', 'r').readlines() + huge_line_list = [h for h in meminfo if h.startswith("Hugepagesize")] + try: + return int(huge_line_list[0].split()[1]) + except ValueError, e: + raise HugePageError("Could not get huge page size setting from " + "/proc/meminfo: %s" % e) + + + def get_target_hugepages(self): + """ + Calculate the target number of hugepages for testing purposes. + """ + if self.vms < self.max_vms: + self.vms = self.max_vms + vmsm = (self.vms * self.mem) + (self.vms * 64) + return int(vmsm * 1024 / self.hugepage_size) + + + def set_hugepages(self): + """ + Sets the hugepage limit to the target hugepage value calculated. + """ + hugepage_cfg = open("/proc/sys/vm/nr_hugepages", "r+") + hp = hugepage_cfg.readline() + while int(hp) < self.target_hugepages: + loop_hp = hp + hugepage_cfg.write(str(self.target_hugepages)) + hugepage_cfg.flush() + hugepage_cfg.seek(0) + hp = int(hugepage_cfg.readline()) + if loop_hp == hp: + raise HugePageError("Cannot set the kernel hugepage setting " + "to the target value of %d hugepages." % + self.target_hugepages) + hugepage_cfg.close() + + + def mount_hugepage_fs(self): + """ + Verify if there's a hugetlbfs mount set. If there's none, will 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 = "mount -t hugetlbfs none %s" % self.hugepage_path + 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__ == "__main__": + if len(sys.argv) < 2: + huge_page = HugePage() + else: + huge_page = HugePage(sys.argv[1]) + + huge_page.setup()