aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/dpdk/dpdk.py78
-rw-r--r--testcases/testcase.py25
-rw-r--r--tools/hugepages.py102
3 files changed, 127 insertions, 78 deletions
diff --git a/src/dpdk/dpdk.py b/src/dpdk/dpdk.py
index 3f5333a0..f2f6ec9f 100644
--- a/src/dpdk/dpdk.py
+++ b/src/dpdk/dpdk.py
@@ -1,4 +1,4 @@
-# Copyright 2015 Intel Corporation.
+# Copyright 2015-2016 Intel Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -21,7 +21,6 @@ DPDK.
from sys import platform as _platform
import os
-import re
import subprocess
import logging
import locale
@@ -48,7 +47,6 @@ def init():
_LOGGER.error('Not running on a compatible Linux version. Exiting...')
return
- _mount_hugepages()
_insert_modules()
_remove_vhost_net()
_bind_nics()
@@ -63,7 +61,6 @@ def cleanup():
_unbind_nics()
_remove_modules()
- _umount_hugepages()
_vhost_user_cleanup()
@@ -102,79 +99,6 @@ def _is_linux():
return _platform.startswith('linux') and os.path.isdir('/proc')
#
-# hugepage management
-#
-
-
-def _is_hugepage_available():
- """Check if hugepages are available on the system.
- """
- hugepage_re = re.compile(r'^HugePages_Free:\s+(?P<num_hp>\d+)$')
-
- # read in meminfo
- with open('/proc/meminfo') as mem_file:
- mem_info = mem_file.readlines()
-
- # first check if module is loaded
- for line in mem_info:
- result = hugepage_re.match(line)
- if not result:
- continue
-
- num_huge = result.group('num_hp')
- if not num_huge:
- _LOGGER.info('No free hugepages.')
- else:
- _LOGGER.info('Found \'%s\' free hugepage(s).', num_huge)
- return True
-
- return False
-
-
-def _is_hugepage_mounted():
- """Check if hugepages are mounted.
- """
- output = subprocess.check_output(['mount'], shell=True)
- my_encoding = locale.getdefaultlocale()[1]
- for line in output.decode(my_encoding).split('\n'):
- if 'hugetlbfs' in line:
- return True
-
- return False
-
-
-def _mount_hugepages():
- """Ensure hugepages are mounted.
- """
- if not _is_hugepage_available():
- return
-
- if _is_hugepage_mounted():
- return
-
- if not os.path.exists(settings.getValue('HUGEPAGE_DIR')):
- os.makedirs(settings.getValue('HUGEPAGE_DIR'))
- try:
- tasks.run_task(['sudo', 'mount', '-t', 'hugetlbfs', 'nodev',
- settings.getValue('HUGEPAGE_DIR')],
- _LOGGER, 'Mounting hugepages...', True)
- except subprocess.CalledProcessError:
- _LOGGER.error('Unable to mount hugepages.')
-
-
-def _umount_hugepages():
- """Ensure hugepages are unmounted.
- """
- if not _is_hugepage_mounted():
- return
-
- try:
- tasks.run_task(['sudo', 'umount', settings.getValue('HUGEPAGE_DIR')],
- _LOGGER, 'Unmounting hugepages...', True)
- except subprocess.CalledProcessError:
- _LOGGER.error('Unable to umount hugepages.')
-
-#
# module management
#
diff --git a/testcases/testcase.py b/testcases/testcase.py
index 4b2751b5..7d5162e6 100644
--- a/testcases/testcase.py
+++ b/testcases/testcase.py
@@ -1,4 +1,4 @@
-# Copyright 2015 Intel Corporation.
+# Copyright 2015-2016 Intel Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@ from core.results.results_constants import ResultsConstants
import core.component_factory as component_factory
from core.loader import Loader
from tools import tasks
+from tools import hugepages
from tools.report import report
from conf import settings as S
from tools.pkt_gen.trafficgen.trafficgenhelper import TRAFFIC_DEFAULTS
@@ -43,6 +44,7 @@ class TestCase(object):
values.
:param results_dir: Where the csv formatted results are written.
"""
+ self._hugepages_mounted = False
self._logger = logging.getLogger(__name__)
self.name = cfg['Name']
self.desc = cfg.get('Description', 'No description given.')
@@ -113,6 +115,9 @@ class TestCase(object):
"""
self._logger.debug(self.name)
+ # mount hugepages if needed
+ self._mount_hugepages()
+
# copy sources of l2 forwarding tools into VM shared dir if needed
self._copy_fwd_tools_for_guest()
@@ -154,6 +159,9 @@ class TestCase(object):
if not self._vswitch_none:
vswitch_ctl.dump_vswitch_flows()
+ # umount hugepages if mounted
+ self._umount_hugepages()
+
self._logger.debug("Traffic Results:")
traffic_ctl.print_results()
@@ -222,6 +230,21 @@ class TestCase(object):
counter += 1
+ def _mount_hugepages(self):
+ """Mount hugepages if usage of DPDK or Qemu is detected
+ """
+ # hugepages are needed by DPDK and Qemu
+ if not self._hugepages_mounted and \
+ (self.deployment.count('v') or S.getValue('VSWITCH').lower().count('dpdk')):
+ hugepages.mount_hugepages()
+ self._hugepages_mounted = True
+
+ def _umount_hugepages(self):
+ """Umount hugepages if they were mounted before
+ """
+ if self._hugepages_mounted:
+ hugepages.umount_hugepages()
+ self._hugepages_mounted = False
@staticmethod
def _write_result_to_file(results, output):
diff --git a/tools/hugepages.py b/tools/hugepages.py
new file mode 100644
index 00000000..71535922
--- /dev/null
+++ b/tools/hugepages.py
@@ -0,0 +1,102 @@
+# Copyright 2015-2016 Intel Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Automation of hugepages management
+"""
+
+import os
+import re
+import subprocess
+import logging
+import locale
+
+from tools import tasks
+from conf import settings
+
+_LOGGER = logging.getLogger(__name__)
+
+#
+# hugepage management
+#
+
+
+def is_hugepage_available():
+ """Check if hugepages are available on the system.
+ """
+ hugepage_re = re.compile(r'^HugePages_Free:\s+(?P<num_hp>\d+)$')
+
+ # read in meminfo
+ with open('/proc/meminfo') as mem_file:
+ mem_info = mem_file.readlines()
+
+ # first check if module is loaded
+ for line in mem_info:
+ result = hugepage_re.match(line)
+ if not result:
+ continue
+
+ num_huge = result.group('num_hp')
+ if not num_huge:
+ _LOGGER.info('No free hugepages.')
+ else:
+ _LOGGER.info('Found \'%s\' free hugepage(s).', num_huge)
+ return True
+
+ return False
+
+
+def is_hugepage_mounted():
+ """Check if hugepages are mounted.
+ """
+ output = subprocess.check_output(['mount'], shell=True)
+ my_encoding = locale.getdefaultlocale()[1]
+ for line in output.decode(my_encoding).split('\n'):
+ if 'hugetlbfs' in line:
+ return True
+
+ return False
+
+
+def mount_hugepages():
+ """Ensure hugepages are mounted.
+ """
+ if not is_hugepage_available():
+ return
+
+ if is_hugepage_mounted():
+ return
+
+ if not os.path.exists(settings.getValue('HUGEPAGE_DIR')):
+ os.makedirs(settings.getValue('HUGEPAGE_DIR'))
+ try:
+ tasks.run_task(['sudo', 'mount', '-t', 'hugetlbfs', 'nodev',
+ settings.getValue('HUGEPAGE_DIR')],
+ _LOGGER, 'Mounting hugepages...', True)
+ except subprocess.CalledProcessError:
+ _LOGGER.error('Unable to mount hugepages.')
+
+
+def umount_hugepages():
+ """Ensure hugepages are unmounted.
+ """
+ if not is_hugepage_mounted():
+ return
+
+ try:
+ tasks.run_task(['sudo', 'umount', settings.getValue('HUGEPAGE_DIR')],
+ _LOGGER, 'Unmounting hugepages...', True)
+ except subprocess.CalledProcessError:
+ _LOGGER.error('Unable to umount hugepages.')
+
+