From f7366919b9d985b2b3d267750ea16667b636cdac Mon Sep 17 00:00:00 2001
From: Maryam Tahhan <maryam.tahhan@intel.com>
Date: Wed, 2 Mar 2016 13:01:41 +0000
Subject: dpdk: enable vfio_pci support

Enable vfio_pci support for DPDK in the case where the end user
doesn't want to use igb_uio.
Changes:
* Use generic functions to strip the path and .ko extension from the
  module to be inserted/removed.
* Removed debug line in Modules_Manager.
* Removed commented code.
* Fixed all pylint issues.
JIRA: VSPERF-249

Change-Id: I69c9077735879bcbf7ce5c970c1ec53c219e9f90
Signed-off-by: Maryam Tahhan <maryam.tahhan@intel.com>
Reviewed-by: Martin Klozik <martinx.klozik@intel.com>
Reviewed-by: Al Morton <acmorton@att.com>
Reviewed-by: Christian Trautman <ctrautma@redhat.com>
---
 tools/module_manager.py | 81 +++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 71 insertions(+), 10 deletions(-)

(limited to 'tools')

diff --git a/tools/module_manager.py b/tools/module_manager.py
index 39ad5cf4..565bac51 100644
--- a/tools/module_manager.py
+++ b/tools/module_manager.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.
@@ -14,11 +14,13 @@
 
 """Simple kernel module manager implementation.
 """
-
+import os
 import subprocess
 import logging
+
 from tools import tasks
 
+_LOGGER = logging.getLogger(__name__)
 class ModuleManager(object):
     """Simple module manager which acts as system wrapper for Kernel Modules.
     """
@@ -28,7 +30,7 @@ class ModuleManager(object):
     def __init__(self):
         """Initializes data
         """
-        self._modules = None
+        self._modules = []
 
     def insert_modules(self, modules):
         """Method inserts list of modules. In case that module name ends
@@ -37,9 +39,9 @@ class ModuleManager(object):
 
         :returns: None
         """
-        self._modules = modules
+
         for module in modules:
-            if ModuleManager.is_module_inserted(module):
+            if self.is_module_inserted(module):
                 continue
 
             try:
@@ -49,17 +51,39 @@ class ModuleManager(object):
                 else:
                     tasks.run_task(['sudo', 'modprobe', module], self._logger,
                                    'Modprobe module \'%s\'...' % module, True)
-
+                _LOGGER.info("Inserted Module %s", module)
+                self._modules.append(module)
             except subprocess.CalledProcessError:
                 self._logger.error('Unable to insert module \'%s\'.', module)
                 raise  # fail catastrophically
 
+    def insert_module_group(self, module_group, group_path_prefix):
+        """Ensure all modules in a group are inserted into the system.
+
+        :param module_group: A name of configuration item containing a list
+        of module names
+        """
+        for module in module_group:
+            # first check if module is loaded
+            if self.is_module_inserted(module[1]):
+                continue
+
+            try:
+                mod_path = os.path.join(group_path_prefix, module[0],
+                                        '%s.ko' % module[1])
+                tasks.run_task(['sudo', 'insmod', mod_path], _LOGGER,
+                               'Inserting module \'%s\'...' % module[1], True)
+                self._modules.append(module)
+            except subprocess.CalledProcessError:
+                _LOGGER.error('Unable to insert module \'%s\'.', module[1])
+                raise  # fail catastrophically
+
     def remove_modules(self):
-        """Removes all modules that have been previously instereted.
+        """Removes all modules that have been previously inserted.
         """
         for module in self._modules:
             # first check if module is loaded
-            if not ModuleManager.is_module_inserted(module):
+            if not self.is_module_inserted(module):
                 continue
 
             try:
@@ -67,16 +91,19 @@ class ModuleManager(object):
                 # with .ko suffix
                 tasks.run_task(['sudo', 'rmmod', module], self._logger,
                                'Removing module \'%s\'...' % module, True)
+                self._modules.remove(module)
             except subprocess.CalledProcessError:
                 self._logger.error('Unable to remove module \'%s\'.', module)
                 continue
-
     @staticmethod
     def is_module_inserted(module):
         """Check if a module is inserted on system.
         """
+        if module.endswith('.ko'):
         # get module base name, i.e strip path and .ko suffix if possible
-        module_base_name = module.split('.')[0].split('/').pop()
+            module_base_name = os.path.basename(os.path.splitext(module)[0])
+        else:
+            module_base_name = module
 
         # get list of modules from kernel
         with open('/proc/modules') as mod_file:
@@ -87,3 +114,37 @@ class ModuleManager(object):
             if line.startswith(module_base_name):
                 return True
         return False
+
+    def remove_module(self, module):
+        """Removes a single module.
+        """
+        if self.is_module_inserted(module):
+            # get module base name, i.e strip path and .ko suffix if possible
+            module_base_name = os.path.basename(os.path.splitext(module)[0])
+
+            try:
+                # rmmod supports both simple module name and full module path
+                # with .ko suffix
+                tasks.run_task(['sudo', 'rmmod', module_base_name], self._logger,
+                               'Removing module \'%s\'...' % module, True)
+                self._modules.remove(module)
+            except subprocess.CalledProcessError:
+                self._logger.error('Unable to remove module \'%s\'.', module_base_name)
+
+    def remove_module_group(self, module_group):
+        """Removes all modules in the modules group.
+        """
+        for module in module_group:
+            if not self.is_module_inserted(module[1]):
+                continue
+            # get module base name, i.e strip path and .ko suffix if possible
+            module_base_name = os.path.basename(os.path.splitext(module)[0])
+
+            try:
+                # rmmod supports both simple module name and full module path
+                # with .ko suffix
+                tasks.run_task(['sudo', 'rmmod', module_base_name], self._logger,
+                               'Removing module \'%s\'...' % module, True)
+                self._modules.remove(module)
+            except subprocess.CalledProcessError:
+                self._logger.error('Unable to remove module \'%s\'.', module_base_name)
-- 
cgit