Skip to content

Commit 1cb2333

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 1cb2333

3 files changed

Lines changed: 45 additions & 8 deletions

File tree

virttest/shared/cfg/base.cfg

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,3 +1225,18 @@ 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"]

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: 26 additions & 7 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,8 +76,13 @@ def reload(module_name, force, params=""):
7476
class KernelModuleHandler(object):
7577
"""Class handling Linux kernel modules"""
7678

77-
def __init__(self, module_name):
78-
"""Create kernel module handler"""
79+
def __init__(self, module_name, ignore_values):
80+
"""
81+
Create kernel module handler
82+
83+
:param module_name: name of kernel module to be handled
84+
:param ignore_values: list of module parameter values to be ignored
85+
"""
7986

8087
self._module_name = module_name
8188
self._module_path = os.path.join(
@@ -86,6 +93,7 @@ def __init__(self, module_name):
8693
self._module_holders = self.module_holders
8794
self._was_loaded = None
8895
self._config_backup = None
96+
self._ignore_values = ignore_values
8997
self._backup_config()
9098

9199
def unload_module(self):
@@ -254,13 +262,24 @@ def _get_serialized_config(self):
254262
params = os.listdir(self._module_params_path)
255263
for param in params:
256264
with open(os.path.join(self._module_params_path, param), "r") as param_file:
257-
mod_params[param] = param_file.read().strip()
265+
mod_param_val = param_file.read().strip()
266+
if mod_param_val in self._ignore_values:
267+
LOG.debug(
268+
"Module param '%s' with value '%s' is ignored",
269+
param,
270+
mod_param_val,
271+
)
272+
continue
273+
mod_params[param] = mod_param_val
258274
return " ".join("%s=%s" % _ for _ in mod_params.items())
259275

260276
@property
261277
def module_holders(self):
262278
"""Find out which modules use this module."""
263279
if os.path.exists(self._module_holders_path):
264280
module_used_by = os.listdir(self._module_holders_path)
265-
return [KernelModuleHandler(module) for module in module_used_by]
281+
return [
282+
KernelModuleHandler(module, self._ignore_values)
283+
for module in module_used_by
284+
]
266285
return []

0 commit comments

Comments
 (0)