mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
tests/functional: add memlock tests
Add new tests to check the correctness of the `-overcommit memlock` option (possible values: off, on, on-fault) by using `/proc/{qemu_pid}/status` file to check in VmSize, VmRSS and VmLck values: * if `memlock=off`, then VmLck = 0; * if `memlock=on`, then VmLck > 0 and almost all memory is resident; * if `memlock=on-fault`, then VmLck > 0 and only few memory is resident. Signed-off-by: Alexandr Moshkov <dtalexundeer@yandex-team.ru> Message-ID: <20250605065908.299979-3-dtalexundeer@yandex-team.ru> Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
parent
23c90999f6
commit
ec3a7a7150
2 changed files with 80 additions and 0 deletions
|
@ -312,6 +312,7 @@ tests_x86_64_system_quick = [
|
|||
'virtio_version',
|
||||
'x86_cpu_model_versions',
|
||||
'vnc',
|
||||
'memlock',
|
||||
]
|
||||
|
||||
tests_x86_64_system_thorough = [
|
||||
|
|
79
tests/functional/test_memlock.py
Executable file
79
tests/functional/test_memlock.py
Executable file
|
@ -0,0 +1,79 @@
|
|||
#!/usr/bin/env python3
|
||||
#
|
||||
# Functional test that check overcommit memlock options
|
||||
#
|
||||
# Copyright (c) Yandex Technologies LLC, 2025
|
||||
#
|
||||
# Author:
|
||||
# Alexandr Moshkov <dtalexundeer@yandex-team.ru>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import re
|
||||
|
||||
from typing import Dict
|
||||
|
||||
from qemu_test import QemuSystemTest
|
||||
from qemu_test import skipLockedMemoryTest
|
||||
|
||||
|
||||
STATUS_VALUE_PATTERN = re.compile(r'^(\w+):\s+(\d+) kB', re.MULTILINE)
|
||||
|
||||
|
||||
@skipLockedMemoryTest(2_097_152) # 2GB
|
||||
class MemlockTest(QemuSystemTest):
|
||||
"""
|
||||
Runs a guest with memlock options.
|
||||
Then verify, that this options is working correctly
|
||||
by checking the status file of the QEMU process.
|
||||
"""
|
||||
|
||||
def common_vm_setup_with_memlock(self, memlock):
|
||||
self.vm.add_args('-overcommit', f'mem-lock={memlock}')
|
||||
self.vm.launch()
|
||||
|
||||
def test_memlock_off(self):
|
||||
self.common_vm_setup_with_memlock('off')
|
||||
|
||||
status = self.get_process_status_values(self.vm.get_pid())
|
||||
|
||||
self.assertTrue(status['VmLck'] == 0)
|
||||
|
||||
def test_memlock_on(self):
|
||||
self.common_vm_setup_with_memlock('on')
|
||||
|
||||
status = self.get_process_status_values(self.vm.get_pid())
|
||||
|
||||
# VmLck > 0 kB and almost all memory is resident
|
||||
self.assertTrue(status['VmLck'] > 0)
|
||||
self.assertTrue(status['VmRSS'] >= status['VmSize'] * 0.70)
|
||||
|
||||
def test_memlock_onfault(self):
|
||||
self.common_vm_setup_with_memlock('on-fault')
|
||||
|
||||
status = self.get_process_status_values(self.vm.get_pid())
|
||||
|
||||
# VmLck > 0 kB and only few memory is resident
|
||||
self.assertTrue(status['VmLck'] > 0)
|
||||
self.assertTrue(status['VmRSS'] <= status['VmSize'] * 0.30)
|
||||
|
||||
def get_process_status_values(self, pid: int) -> Dict[str, int]:
|
||||
result = {}
|
||||
raw_status = self._get_raw_process_status(pid)
|
||||
|
||||
for line in raw_status.split('\n'):
|
||||
if m := STATUS_VALUE_PATTERN.match(line):
|
||||
result[m.group(1)] = int(m.group(2))
|
||||
|
||||
return result
|
||||
|
||||
def _get_raw_process_status(self, pid: int) -> str:
|
||||
try:
|
||||
with open(f'/proc/{pid}/status', 'r') as f:
|
||||
return f.read()
|
||||
except FileNotFoundError:
|
||||
self.skipTest("Can't open status file of the process")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
MemlockTest.main()
|
Loading…
Add table
Add a link
Reference in a new issue