On 5/22/25 14:16, Thomas Huth wrote:
On 22/05/2025 10.51, 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.

Yes, it seems to be another segment. After looking through the smaps a little bit longer, I also spotted this one here:

7f8fcc6a1000-7f8fcc6a2000 rw-p 00000000 00:00 0
Size:                  4 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Rss:                   4 kB
Pss:                   4 kB
Pss_Dirty:             4 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         4 kB
Referenced:            4 kB
Anonymous:             4 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

 HTH,
  Thomas


Can you, please, also provide QEMU package version or how you configure and build it?

Or maybe attach full smaps file, I think it would help me a lot. Thanks!


Best regards,

Alexandr


Reply via email to