-# 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.
from sys import platform as _platform
import os
-import re
import subprocess
import logging
import locale
_LOGGER.error('Not running on a compatible Linux version. Exiting...')
return
- _mount_hugepages()
_insert_modules()
_remove_vhost_net()
_bind_nics()
- _copy_dpdk_for_guest()
def cleanup():
_unbind_nics()
_remove_modules()
- _umount_hugepages()
_vhost_user_cleanup()
"""
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
#
after unbinding them from DPDK.
"""
_driver_list = []
- _output = subprocess.check_output([RTE_PCI_TOOL, '--status'])
+ _output = subprocess.check_output([os.path.expanduser(RTE_PCI_TOOL), '--status'])
_my_encoding = locale.getdefaultlocale()[1]
for line in _output.decode(_my_encoding).split('\n'):
for nic in settings.getValue('WHITELIST_NICS'):
except subprocess.CalledProcessError:
_LOGGER.error('Unable to unbind NICs %s',
str(settings.getValue('WHITELIST_NICS')))
- '''Rebind NICs to their original drivers
- using the Intel DPDK ``dpdk_nic_bind.py`` tool.
- '''
+ # Rebind NICs to their original drivers
+ # using the Intel DPDK ``dpdk_nic_bind.py`` tool.
for i, nic in enumerate(settings.getValue('WHITELIST_NICS')):
try:
if nic_drivers[i] != '':
nic_drivers)
-def _copy_dpdk_for_guest():
- """Copy dpdk code to GUEST_SHARE_DIR[s] for use by guests.
- """
- for guest_dir in settings.getValue('GUEST_SHARE_DIR'):
- guest_share_dir = os.path.join(guest_dir, 'DPDK')
-
- if not os.path.exists(guest_share_dir):
- os.makedirs(guest_share_dir)
-
- try:
- tasks.run_task(['rsync', '-a', '-r', '-l', r'--exclude="\.git"',
- os.path.join(settings.getValue('RTE_SDK'), ''),
- guest_share_dir],
- _LOGGER,
- 'Copying DPDK to shared directory...',
- True)
- except subprocess.CalledProcessError:
- _LOGGER.error('Unable to copy DPDK to shared directory')
-
#
# Vhost-user cleanup