On 22/05/2025 14.40, Alexandr Moshkov wrote:
On 5/22/25 16:13, Daniel P. Berrangé wrote:
On Thu, May 22, 2025 at 01:51:44PM +0500, Alexandr Moshkov wrote:
On 5/22/25 12:49, Thomas Huth wrote:
On 21/05/2025 15.55, Alexandr Moshkov wrote:
Add new tests to check the correctness of the `-overcommit memlock`
option (possible values: off, on, on-fault) by using
`/proc/{qemu_pid}/smaps` file to check in Size, Rss and Locked fields of
anonymous segments:
* if `memlock=off`, then Locked = 0 on every anonymous smaps;
* if `memlock=on`, then Size, Rss and Locked values must be equal for
every anon smaps where Rss is not 0;
* if `memlock=on-fault`, then Rss and Locked must be equal on every anon
smaps and anonymous segment with Rss < Size must exists.
Signed-off-by: Alexandr Moshkov <dtalexund...@yandex-team.ru>
---
...
diff --git a/tests/functional/test_memlock.py
b/tests/functional/test_memlock.py
new file mode 100755
index 0000000000..a090e7f9ad
--- /dev/null
+++ b/tests/functional/test_memlock.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python3
+#
+# Functional test that check overcommit memlock options
+#
+# Copyright (c) Yandex Technologies LLC, 2025
+#
+# Author:
+# Alexandr Moshkov <dtalexund...@yandex-team.ru>
+#
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later. See the COPYING file in the top-level directory.
I just noticed: New file need a SPDX identifier nowadays to keep
scripts/check_patch.pl happy.
Hello, thanks for reply, i fix that in a moment!
Anyway, I now also tested the patch, but for me, it's not working: After
setting ulimit -l to 2G and running the test, I get:
$ ~/devel/qemu/tests/functional/test_memlock.py
TAP version 13
ok 1 test_memlock.MemlockTest.test_memlock_off
Traceback (most recent call last):
File "~/devel/qemu/tests/functional/test_memlock.py", line 60, in
test_memlock_on
self.assertTrue(smap['Size'] == smap['Rss'] == smap['Locked'])
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: False is not true
not ok 2 test_memlock.MemlockTest.test_memlock_on
Traceback (most recent call last):
File "~/devel/qemu/tests/functional/test_memlock.py", line 70, in
test_memlock_onfault
self.assertTrue(smap['Rss'] == smap['Locked'])
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: False is not true
not ok 3 test_memlock.MemlockTest.test_memlock_onfault
I added two print statements right in front of the asserts to see the
values, and for the first one it shows (after many successfully
comparisons):
line 60: 4 == 4 == 0
And similar for the second one:
line 70: 4 == 0
FWIW, this is on Fedora 41.
Looking at the smaps file, it seems like this comes from a shared
library:
7ff16c7c9000-7ff16c7ca000 r--p 00000000 00:2a 29149631
/usr/lib64/spa-0.2/support/libspa-support.so
Size: 4 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 4 kB
Pss: 0 kB
Pss_Dirty: 0 kB
Shared_Clean: 4 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 4 kB
Anonymous: 0 kB
KSM: 0 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
FilePmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
THPeligible: 0
ProtectionKey: 0
So maybe you've got to ignore the mappings of .so files in your test?
Oh, this segments are already ignored in _parse_anonymous_smaps(), so this
segment should not have returned from it.
Maybe it comes from another segment? Or i have bug in anon segments
parsing.. I'll take a closer look, thanks.
It is strange that smaps reports regioons as not locked, despite
being resident, as mlockall() claims that it locks *everything*.
Yes it is. Maybe its just segment from mlock=off test case?
I've taken it from a QEMU that I ran like this:
./qemu-system-x86_64 -overcommit mem-lock=on -display none
By the way, the information from the status file looks like this:
VmSize: 1580432 kB
VmLck: 1580404 kB
So looks like almost all got locked, except for some few kilobytes.
I guess your test likely just has to take into account some wiggle room...?
Thomas