diff options
-rw-r--r-- | src/dpdk/dpdk.py | 78 | ||||
-rw-r--r-- | testcases/testcase.py | 25 | ||||
-rw-r--r-- | tools/hugepages.py | 102 |
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.') + + |