* [PATCH 0/2] Removing scripts/hugepage.py
@ 2011-01-19 1:56 Lucas Meneghel Rodrigues
2011-01-19 1:56 ` [PATCH 1/2] KVM test: Turning hugepages setup into KVM autotest infrastructure Lucas Meneghel Rodrigues
2011-01-19 1:56 ` [PATCH 2/2] KVM test: Removing scripts/hugepage.py Lucas Meneghel Rodrigues
0 siblings, 2 replies; 4+ messages in thread
From: Lucas Meneghel Rodrigues @ 2011-01-19 1:56 UTC (permalink / raw)
To: autotest; +Cc: kvm
Continuing on our quest of obsoleting and removing the pre/post
scripts, this time we remove hugepage.py for a slightly better
and cleaner framework implementation.
Lucas Meneghel Rodrigues (2):
KVM test: Turning hugepages setup into KVM autotest infrastructure
KVM test: Removing scripts/hugepage.py
client/tests/kvm/kvm_preprocessing.py | 8 ++
client/tests/kvm/kvm_utils.py | 102 +++++++++++++++++++++++++++
client/tests/kvm/scripts/hugepage.py | 118 --------------------------------
client/tests/kvm/tests_base.cfg.sample | 3 +-
4 files changed, 111 insertions(+), 120 deletions(-)
delete mode 100755 client/tests/kvm/scripts/hugepage.py
--
1.7.3.4
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] KVM test: Turning hugepages setup into KVM autotest infrastructure
2011-01-19 1:56 [PATCH 0/2] Removing scripts/hugepage.py Lucas Meneghel Rodrigues
@ 2011-01-19 1:56 ` Lucas Meneghel Rodrigues
2011-01-19 9:33 ` Michael Goldish
2011-01-19 1:56 ` [PATCH 2/2] KVM test: Removing scripts/hugepage.py Lucas Meneghel Rodrigues
1 sibling, 1 reply; 4+ messages in thread
From: Lucas Meneghel Rodrigues @ 2011-01-19 1:56 UTC (permalink / raw)
To: autotest; +Cc: kvm
So we can get rid of scripts/hugepage.py. The implementation
strategy is to have a kvm_utils.HugePageConfig class that
can do both hugepages setup and cleanup, and call it during
pre/postprocessing.
Signed-off-by: Lucas Meneghel Rodrigues <lmr@redhat.com>
---
client/tests/kvm/kvm_preprocessing.py | 8 +++
client/tests/kvm/kvm_utils.py | 102 ++++++++++++++++++++++++++++++++
client/tests/kvm/tests_base.cfg.sample | 3 +-
3 files changed, 111 insertions(+), 2 deletions(-)
diff --git a/client/tests/kvm/kvm_preprocessing.py b/client/tests/kvm/kvm_preprocessing.py
index 4a6e0f8..41455cf 100644
--- a/client/tests/kvm/kvm_preprocessing.py
+++ b/client/tests/kvm/kvm_preprocessing.py
@@ -254,6 +254,10 @@ def preprocess(test, params, env):
logging.debug("KVM userspace version: %s" % kvm_userspace_version)
test.write_test_keyval({"kvm_userspace_version": kvm_userspace_version})
+ if params.get("setup_hugepages") == "yes":
+ h = kvm_utils.HugePageConfig(params)
+ h.setup()
+
# Execute any pre_commands
if params.get("pre_command"):
process_command(test, params, env, params.get("pre_command"),
@@ -350,6 +354,10 @@ def postprocess(test, params, env):
env["tcpdump"].close()
del env["tcpdump"]
+ if params.get("setup_hugepages") == "yes":
+ h = kvm_utils.HugePageConfig(params)
+ h.cleanup()
+
# Execute any post_commands
if params.get("post_command"):
process_command(test, params, env, params.get("post_command"),
diff --git a/client/tests/kvm/kvm_utils.py b/client/tests/kvm/kvm_utils.py
index 78c9f25..b61ff94 100644
--- a/client/tests/kvm/kvm_utils.py
+++ b/client/tests/kvm/kvm_utils.py
@@ -1265,6 +1265,108 @@ class KvmLoggingConfig(logging_config.LoggingConfig):
verbose=verbose)
+class HugePageConfig:
+ def __init__(self, params):
+ """
+ Gets environment variable values and calculates the target number
+ of huge memory pages.
+
+ @param params: Dict like object containing parameters for the test.
+ """
+ self.vms = len(params.objects("vms"))
+ self.mem = int(params.get("mem"))
+ self.max_vms = int(params.get("max_vms", 0))
+ self.hugepage_path = '/mnt/kvm_hugepage'
+ self.hugepage_size = self.get_hugepage_size()
+ self.target_hugepages = self.get_target_hugepages()
+ self.kernel_hp_file = '/proc/sys/vm/nr_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 ValueError("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
+ # memory of all VMs plus qemu overhead of 64MB per guest
+ vmsm = (self.vms * self.mem) + (self.vms * 64)
+ return int(vmsm * 1024 / self.hugepage_size)
+
+
+ @error.context_aware
+ def set_hugepages(self):
+ """
+ Sets the hugepage limit to the target hugepage value calculated.
+ """
+ error.base_context("Setting hugepages limit to %s" %
+ self.target_hugepages)
+ hugepage_cfg = open(self.kernel_hp_file, "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 ValueError("Cannot set the kernel hugepage setting "
+ "to the target value of %d hugepages." %
+ self.target_hugepages)
+ hugepage_cfg.close()
+ logging.debug("Successfuly set %s large memory pages on host ",
+ self.target_hugepages)
+
+
+ @error.context_aware
+ 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.
+ """
+ error.base_context("Mounting hugepages path")
+ 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
+ utils.system(cmd)
+
+
+ def setup(self):
+ logging.debug("Number of VMs this test will use: %d", self.vms)
+ logging.debug("Amount of memory used by each vm: %s", self.mem)
+ logging.debug("System setting for large memory page size: %s",
+ self.hugepage_size)
+ logging.debug("Number of large memory pages needed for this test: %s",
+ self.target_hugepages)
+ self.set_hugepages()
+ self.mount_hugepage_fs()
+
+
+ @error.context_aware
+ def cleanup(self):
+ error.base_context("Trying to dealocate hugepage memory")
+ try:
+ utils.system("umount %s" % self.hugepage_path)
+ except error.CmdError:
+ return
+ utils.system("echo 0 > %s" % self.kernel_hp_file)
+ logging.debug("Hugepage memory successfuly dealocated")
+
+
class PciAssignable(object):
"""
Request PCI assignable devices on host. It will check whether to request
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index 8b67256..b45d821 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -2378,8 +2378,7 @@ variants:
variants:
- @smallpages:
- hugepages:
- pre_command += " scripts/hugepage.py /mnt/kvm_hugepage;"
- post_command += " umount /mnt/kvm_hugepage && echo 0 > /proc/sys/vm/nr_hugepages;"
+ setup_hugepages = yes
extra_params += " -mem-path /mnt/kvm_hugepage"
--
1.7.3.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] KVM test: Removing scripts/hugepage.py
2011-01-19 1:56 [PATCH 0/2] Removing scripts/hugepage.py Lucas Meneghel Rodrigues
2011-01-19 1:56 ` [PATCH 1/2] KVM test: Turning hugepages setup into KVM autotest infrastructure Lucas Meneghel Rodrigues
@ 2011-01-19 1:56 ` Lucas Meneghel Rodrigues
1 sibling, 0 replies; 4+ messages in thread
From: Lucas Meneghel Rodrigues @ 2011-01-19 1:56 UTC (permalink / raw)
To: autotest; +Cc: kvm
Now that its functionality has been reimplemented as
KVM test infrastructure.
Signed-off-by: Lucas Meneghel Rodrigues <lmr@redhat.com>
---
client/tests/kvm/scripts/hugepage.py | 118 ----------------------------------
1 files changed, 0 insertions(+), 118 deletions(-)
delete mode 100755 client/tests/kvm/scripts/hugepage.py
diff --git a/client/tests/kvm/scripts/hugepage.py b/client/tests/kvm/scripts/hugepage.py
deleted file mode 100755
index 8a1b0f6..0000000
--- a/client/tests/kvm/scripts/hugepage.py
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/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()
- print "Number of VMs this test will use: %d" % self.vms
- print "Amount of memory used by each vm: %s" % self.mem
- print ("System setting for large memory page size: %s" %
- self.hugepage_size)
- print ("Number of large memory pages needed for this test: %s" %
- self.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
- # memory of all VMs plus qemu overhead of 64MB per guest
- 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()
- print ("Successfuly set %s large memory pages on host " %
- self.target_hugepages)
-
-
- 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()
--
1.7.3.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] KVM test: Turning hugepages setup into KVM autotest infrastructure
2011-01-19 1:56 ` [PATCH 1/2] KVM test: Turning hugepages setup into KVM autotest infrastructure Lucas Meneghel Rodrigues
@ 2011-01-19 9:33 ` Michael Goldish
0 siblings, 0 replies; 4+ messages in thread
From: Michael Goldish @ 2011-01-19 9:33 UTC (permalink / raw)
To: Lucas Meneghel Rodrigues; +Cc: autotest, kvm
On 01/19/2011 03:56 AM, Lucas Meneghel Rodrigues wrote:
> So we can get rid of scripts/hugepage.py. The implementation
> strategy is to have a kvm_utils.HugePageConfig class that
> can do both hugepages setup and cleanup, and call it during
> pre/postprocessing.
>
> Signed-off-by: Lucas Meneghel Rodrigues <lmr@redhat.com>
> ---
> client/tests/kvm/kvm_preprocessing.py | 8 +++
> client/tests/kvm/kvm_utils.py | 102 ++++++++++++++++++++++++++++++++
> client/tests/kvm/tests_base.cfg.sample | 3 +-
> 3 files changed, 111 insertions(+), 2 deletions(-)
>
> diff --git a/client/tests/kvm/kvm_preprocessing.py b/client/tests/kvm/kvm_preprocessing.py
> index 4a6e0f8..41455cf 100644
> --- a/client/tests/kvm/kvm_preprocessing.py
> +++ b/client/tests/kvm/kvm_preprocessing.py
> @@ -254,6 +254,10 @@ def preprocess(test, params, env):
> logging.debug("KVM userspace version: %s" % kvm_userspace_version)
> test.write_test_keyval({"kvm_userspace_version": kvm_userspace_version})
>
> + if params.get("setup_hugepages") == "yes":
> + h = kvm_utils.HugePageConfig(params)
> + h.setup()
> +
> # Execute any pre_commands
> if params.get("pre_command"):
> process_command(test, params, env, params.get("pre_command"),
> @@ -350,6 +354,10 @@ def postprocess(test, params, env):
> env["tcpdump"].close()
> del env["tcpdump"]
>
> + if params.get("setup_hugepages") == "yes":
> + h = kvm_utils.HugePageConfig(params)
> + h.cleanup()
> +
> # Execute any post_commands
> if params.get("post_command"):
> process_command(test, params, env, params.get("post_command"),
> diff --git a/client/tests/kvm/kvm_utils.py b/client/tests/kvm/kvm_utils.py
> index 78c9f25..b61ff94 100644
> --- a/client/tests/kvm/kvm_utils.py
> +++ b/client/tests/kvm/kvm_utils.py
> @@ -1265,6 +1265,108 @@ class KvmLoggingConfig(logging_config.LoggingConfig):
> verbose=verbose)
>
>
> +class HugePageConfig:
> + def __init__(self, params):
> + """
> + Gets environment variable values and calculates the target number
> + of huge memory pages.
> +
> + @param params: Dict like object containing parameters for the test.
> + """
> + self.vms = len(params.objects("vms"))
> + self.mem = int(params.get("mem"))
> + self.max_vms = int(params.get("max_vms", 0))
> + self.hugepage_path = '/mnt/kvm_hugepage'
> + self.hugepage_size = self.get_hugepage_size()
> + self.target_hugepages = self.get_target_hugepages()
> + self.kernel_hp_file = '/proc/sys/vm/nr_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 ValueError("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
> + # memory of all VMs plus qemu overhead of 64MB per guest
> + vmsm = (self.vms * self.mem) + (self.vms * 64)
> + return int(vmsm * 1024 / self.hugepage_size)
> +
> +
> + @error.context_aware
> + def set_hugepages(self):
> + """
> + Sets the hugepage limit to the target hugepage value calculated.
> + """
> + error.base_context("Setting hugepages limit to %s" %
> + self.target_hugepages)
> + hugepage_cfg = open(self.kernel_hp_file, "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 ValueError("Cannot set the kernel hugepage setting "
> + "to the target value of %d hugepages." %
> + self.target_hugepages)
> + hugepage_cfg.close()
> + logging.debug("Successfuly set %s large memory pages on host ",
> + self.target_hugepages)
> +
> +
> + @error.context_aware
> + 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.
> + """
> + error.base_context("Mounting hugepages path")
> + 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
> + utils.system(cmd)
> +
> +
> + def setup(self):
> + logging.debug("Number of VMs this test will use: %d", self.vms)
> + logging.debug("Amount of memory used by each vm: %s", self.mem)
> + logging.debug("System setting for large memory page size: %s",
> + self.hugepage_size)
> + logging.debug("Number of large memory pages needed for this test: %s",
> + self.target_hugepages)
> + self.set_hugepages()
> + self.mount_hugepage_fs()
> +
> +
> + @error.context_aware
> + def cleanup(self):
> + error.base_context("Trying to dealocate hugepage memory")
Since there's just 1 context level in these functions, context() and
base_context() do the same thing, and context() is shorter.
Style note: in my uses of context() I didn't capitalize the first letter
of the string because it's always followed by 'context:' or by an arrow
in the final output. If you think it's nicer to capitalize those
strings, we should be consistent and do it to all of them.
> + try:
> + utils.system("umount %s" % self.hugepage_path)
> + except error.CmdError:
> + return
> + utils.system("echo 0 > %s" % self.kernel_hp_file)
> + logging.debug("Hugepage memory successfuly dealocated")
> +
> +
> class PciAssignable(object):
> """
> Request PCI assignable devices on host. It will check whether to request
> diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
> index 8b67256..b45d821 100644
> --- a/client/tests/kvm/tests_base.cfg.sample
> +++ b/client/tests/kvm/tests_base.cfg.sample
> @@ -2378,8 +2378,7 @@ variants:
> variants:
> - @smallpages:
> - hugepages:
> - pre_command += " scripts/hugepage.py /mnt/kvm_hugepage;"
> - post_command += " umount /mnt/kvm_hugepage && echo 0 > /proc/sys/vm/nr_hugepages;"
> + setup_hugepages = yes
> extra_params += " -mem-path /mnt/kvm_hugepage"
>
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-01-19 9:33 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-19 1:56 [PATCH 0/2] Removing scripts/hugepage.py Lucas Meneghel Rodrigues
2011-01-19 1:56 ` [PATCH 1/2] KVM test: Turning hugepages setup into KVM autotest infrastructure Lucas Meneghel Rodrigues
2011-01-19 9:33 ` Michael Goldish
2011-01-19 1:56 ` [PATCH 2/2] KVM test: Removing scripts/hugepage.py Lucas Meneghel Rodrigues
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox