def test_kedr_memleak_load_cas_module(module, unload_modules, install_kedr): """ title: Loading modules with kedr started with 'memleak' configuration description: Load and unload modules with kedr started to watch for memory leaks pass_criteria: - No memory leaks observed after loading and unloading module """ with TestRun.step(f"Starting kedr against {module}"): Kedr.start(module.value) with TestRun.step(f"Loading {module}"): os_utils.load_kernel_module(module.value) with TestRun.step(f"Unloading {module}"): os_utils.unload_kernel_module(module.value, os_utils.ModuleRemoveMethod.modprobe) with TestRun.step(f"Checking for memory leaks for {module}"): try: Kedr.check_for_mem_leaks(module.value) except Exception as e: TestRun.LOGGER.error(f"{e}") with TestRun.step(f"Stopping kedr"): Kedr.stop()
def test_insufficient_memory_for_cas_module(): """ title: Negative test of ability to load OpenCAS kernel module with insufficient memory. description: | Check that OpenCAS kernel module won’t be loaded in case not enough memory is available. pass_criteria: - Loading OpenCAS kernel module returns error. """ with TestRun.step("Disable caching and memory over-committing."): disable_memory_affecting_functions() drop_caches() with TestRun.step("Measure memory usage without OpenCAS module."): if is_kernel_module_loaded(CasModule.cache.value): unload_kernel_module(CasModule.cache.value) unload_kernel_module(CasModule.disk.value) available_mem_before_cas = get_free_memory() with TestRun.step("Load OpenCAS module"): output = load_kernel_module(CasModule.cache.value) if output.exit_code != 0: TestRun.fail("Cannot load OpenCAS module!") with TestRun.step("Measure memory usage with OpenCAS module."): available_mem_with_cas = get_free_memory() memory_used_by_cas = available_mem_before_cas - available_mem_with_cas TestRun.LOGGER.info( f"OpenCAS module uses {memory_used_by_cas.get_value(Unit.MiB):.2f} MiB of DRAM." ) with TestRun.step("Unload OpenCAS module."): unload_kernel_module(CasModule.cache.value) unload_kernel_module(CasModule.disk.value) with TestRun.step("Allocate memory leaving not enough memory for OpenCAS module."): memory_to_leave = memory_used_by_cas * (3 / 4) try: allocate_memory(get_free_memory() - memory_to_leave) except Exception as ex: TestRun.LOGGER.error(f"{ex}") with TestRun.step( "Try to load OpenCAS module and check if error message is printed on failure." ): output = load_kernel_module(CasModule.cache.value) if output.stderr and output.exit_code != 0: memory_left = get_free_memory() TestRun.LOGGER.info( f"Memory left for OpenCAS module: {memory_left.get_value(Unit.MiB):0.2f} MiB." ) TestRun.LOGGER.info(f"Cannot load OpenCAS module as expected.\n{output.stderr}") else: TestRun.LOGGER.error("Loading OpenCAS module successfully finished, but should fail.") with TestRun.step("Set memory options to default"): unmount_ramfs() defaultize_memory_affecting_functions()
def unload_all_cas_modules(): os_utils.unload_kernel_module(CasModule.cache.value, os_utils.ModuleRemoveMethod.rmmod) os_utils.unload_kernel_module(CasModule.disk.value, os_utils.ModuleRemoveMethod.rmmod)
def reload_all_cas_modules(): os_utils.unload_kernel_module(CasModule.cache.value, ModuleRemoveMethod.modprobe) os_utils.load_kernel_module(CasModule.cache.value)
def teardown(self): unload_output = os_utils.unload_kernel_module(self.module_name) if unload_output.exit_code != 0 \ and "is not currently loaded" not in unload_output.stderr: TestRun.LOGGER.info( f"Failed to unload {self.module_name} module\n{unload_output}")
def teardown(self): if os_utils.is_kernel_module_loaded(self.module_name): os_utils.unload_kernel_module(self.module_name)