summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Breunig <christian@breunig.cc>2025-08-21 16:16:07 +0200
committerGitHub <noreply@github.com>2025-08-21 16:16:07 +0200
commitc6da1089d762d5e561cc3db1c2d35fc5bf1fe397 (patch)
tree2b3b206070eb5628080f51d7a44996a57c0616c4
parentd104ac2c0c5e94316f3d5825df73b93c639ec0cc (diff)
parentc273672867b7ca4e462d2c1898260b132c64ca8e (diff)
downloadvyos-1x-c6da1089d762d5e561cc3db1c2d35fc5bf1fe397.tar.gz
vyos-1x-c6da1089d762d5e561cc3db1c2d35fc5bf1fe397.zip
Merge pull request #4667 from sever-sever/T7732
T7732: VPP add modprobe vfio modules
-rwxr-xr-xsrc/conf_mode/vpp.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/conf_mode/vpp.py b/src/conf_mode/vpp.py
index 966158ab7..d20f5800e 100755
--- a/src/conf_mode/vpp.py
+++ b/src/conf_mode/vpp.py
@@ -32,8 +32,12 @@ from vyos.config import Config, config_dict_merge
from vyos.configdep import set_dependents, call_dependents
from vyos.configdict import node_changed, leaf_node_changed
from vyos.ifconfig import Section
+from vyos.logger import getLogger
from vyos.template import render
from vyos.utils.boot import boot_configuration_complete
+from vyos.utils.kernel import check_kmod
+from vyos.utils.kernel import unload_kmod
+from vyos.utils.kernel import list_loaded_modules
from vyos.utils.process import call
from vyos.vpp import VPPControl
@@ -64,6 +68,10 @@ service_name = 'vpp'
service_conf = Path(f'/run/vpp/{service_name}.conf')
systemd_override = '/run/systemd/system/vpp.service.d/10-override.conf'
+vpp_log = getLogger(
+ service_name, format='%(filename)s[%(process)d]: %(message)s', address='/dev/log'
+)
+
dependency_interface_type_map = {
'vpp_interfaces_bonding': 'bonding',
'vpp_interfaces_bridge': 'bridge',
@@ -102,6 +110,42 @@ drivers_support_interrupt: dict[str, list] = {
}
+def _load_module(module_name: str):
+ """
+ Load a kernel module
+
+ Args:
+ module_name (str): Name of the module to load.
+ """
+ if module_name in list_loaded_modules():
+ vpp_log.info(f"Module '{module_name}' is alrady loaded")
+ return
+ try:
+ check_kmod(module_name)
+ vpp_log.info(f"Module '{module_name}' loaded successfully")
+ except Exception as e:
+ vpp_log.error(f"Failed to load module '{module_name}': {e}")
+ raise
+
+
+def _unload_module(module_name: str):
+ """
+ Unload a kernel module
+
+ Args:
+ module_name (str): Name of the module to unload.
+ """
+ if module_name not in list_loaded_modules():
+ vpp_log.info(f"Module '{module_name}' is not loaded")
+ return
+ try:
+ unload_kmod(module_name)
+ vpp_log.info(f"Module '{module_name}' unloaded successfully")
+ except Exception as e:
+ vpp_log.error(f"Failed to unload module '{module_name}': {e}")
+ raise
+
+
def get_config(config=None):
# use persistent config to store interfaces data between executions
# this is required because some interfaces after they are connected
@@ -505,6 +549,8 @@ def initialize_interface(iface, driver, iface_config) -> None:
def apply(config):
+ # modrpobe modules
+ modules = ('vfio_iommu_type1', 'vfio_pci', 'vfio_pci_core', 'vfio')
# Open persistent config
# It is required for operations with interfaces
persist_config = JSONStorage('vpp_conf')
@@ -513,9 +559,20 @@ def apply(config):
persist_config.delete()
# And stop the service
call(f'systemctl stop {service_name}.service')
+ # Unlod modules (modprobe -r)
+ for module in modules:
+ _unload_module(module)
else:
# Some interfaces required extra preparation before VPP can be started
if 'settings' in config and 'interface' in config.get('settings'):
+ # modprobe vfio
+ if any(
+ iface_config.get('driver') == 'dpdk'
+ for iface_config in config['settings']['interface'].values()
+ ):
+ for module in modules:
+ _load_module(module)
+
for iface, iface_config in config['settings']['interface'].items():
if iface_config['driver'] == 'dpdk':
# ena interfaces require noiommu mode