Skip to content

Commit be6471a

Browse files
utils_kernel_module: filter out not applicable module parameters
When reading kernel module parameters from sysfs, some parameters may return the string "not required" if they are not applicable, for example module kvm_intel parameter vmentry_l1d_flush. Previously, these values were included in the parameter string passed to modprobe when retoring the module, which leads to module loading failure. This change introduces new parameters "kvm_module_ignore_vals_list" and "kvm_probe_module_ignore_vals_list" to skip parameters with the value in list. Signed-off-by: Liang Cong <lcong@redhat.com>
1 parent e66fdb3 commit be6471a

3 files changed

Lines changed: 37 additions & 7 deletions

File tree

virttest/shared/cfg/base.cfg

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,3 +1225,19 @@ uuid_dimm = ""
12251225
# enable_igvm = no
12261226
# igvm_path = /usr/share/coconut-svsm
12271227
# igvm_filename = coconut-qemu.igvm
1228+
1229+
# KVM Module Reload/Restore Settings for Test Pre-processing and Post-processing
1230+
# ---------------------------------------------------------
1231+
# Force reload KVM module
1232+
#kvm_module_force_load = yes
1233+
# Force reload vendor-specific module (kvm_intel/kvm_amd)
1234+
#kvm_probe_module_force_load = yes
1235+
# Parameters for KVM module (e.g., "nested=1")
1236+
#kvm_module_parameters = "nested=1"
1237+
# Parameters for vendor-specific module (e.g., "tdx=1")
1238+
#kvm_probe_module_parameters = "tdx=1"
1239+
# Values to ignore when backing up/restoring KVM module params
1240+
#kvm_module_ignore_vals_list = ["not required"]
1241+
# Values to ignore when backing up/restoring vendor-specific module (kvm_intel/kvm_amd) params
1242+
#kvm_probe_module_ignore_vals_list = ["not required"]
1243+

virttest/test_setup/kernel.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ def setup(self):
1717
module_parameters = self.params.get(
1818
"%s_module_parameters" % param_prefix, ""
1919
)
20+
module_ignore_vals_list = eval(
21+
self.params.get("%s_module_ignore_vals_list" % param_prefix, "[]")
22+
)
2023
module_handler = utils_kernel_module.reload(
21-
module, module_force_load, module_parameters
24+
module, module_force_load, module_parameters, module_ignore_vals_list
2225
)
2326
if module_handler is not None:
2427
self.kvm_module_handlers.append(module_handler)

virttest/utils_kernel_module.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,21 @@ def __init__(self, module_name, reason):
5353
super(KernelModuleRestoreError, self).__init__("restore", module_name, reason)
5454

5555

56-
def reload(module_name, force, params=""):
56+
def reload(module_name, force, params="", ignore_values=None):
5757
"""
5858
Convenience method that creates a KernelModuleHandler instance
5959
and reloads the module only if any action will is required.
6060
6161
:param module_name: name of kernel module to be handled
6262
:param force: if to force load with params in any case, e.g. True
6363
:param params: parameters to load with, e.g. 'key1=param1 ...'
64+
:param ignore_values: list of module parameter values to be ignored
6465
:return: instance if module was loaded
6566
"""
66-
67+
if ignore_values is None:
68+
ignore_values = []
6769
if params != "" or force:
68-
handler = KernelModuleHandler(module_name)
70+
handler = KernelModuleHandler(module_name, ignore_values)
6971
handler.reload_module(force, params)
7072
return handler
7173
return None
@@ -74,7 +76,7 @@ def reload(module_name, force, params=""):
7476
class KernelModuleHandler(object):
7577
"""Class handling Linux kernel modules"""
7678

77-
def __init__(self, module_name):
79+
def __init__(self, module_name, ignore_values):
7880
"""Create kernel module handler"""
7981

8082
self._module_name = module_name
@@ -86,6 +88,7 @@ def __init__(self, module_name):
8688
self._module_holders = self.module_holders
8789
self._was_loaded = None
8890
self._config_backup = None
91+
self._ignore_values = ignore_values
8992
self._backup_config()
9093

9194
def unload_module(self):
@@ -254,13 +257,21 @@ def _get_serialized_config(self):
254257
params = os.listdir(self._module_params_path)
255258
for param in params:
256259
with open(os.path.join(self._module_params_path, param), "r") as param_file:
257-
mod_params[param] = param_file.read().strip()
260+
mod_param_val = param_file.read().strip()
261+
if mod_param_val in self._ignore_values:
262+
LOG.debug(
263+
"Module param '%s' with value '%s' is ignored",
264+
param,
265+
mod_param_val,
266+
)
267+
continue
268+
mod_params[param] = mod_param_val
258269
return " ".join("%s=%s" % _ for _ in mod_params.items())
259270

260271
@property
261272
def module_holders(self):
262273
"""Find out which modules use this module."""
263274
if os.path.exists(self._module_holders_path):
264275
module_used_by = os.listdir(self._module_holders_path)
265-
return [KernelModuleHandler(module) for module in module_used_by]
276+
return [KernelModuleHandler(module, self._ignore_values) for module in module_used_by]
266277
return []

0 commit comments

Comments
 (0)