On Wed, Jul 16, 2025 at 3:50 AM Lorenzo Stoakes lorenzo.stoakes@oracle.com wrote:
On Wed, Jul 16, 2025 at 12:44:23PM +0200, David Hildenbrand wrote:
On 16.07.25 05:05, Suren Baghdasaryan wrote:
The /proc/pid/maps file is generated page by page, with the mmap_lock released between pages. This can lead to inconsistent reads if the underlying vmas are concurrently modified. For instance, if a vma split or merge occurs at a page boundary while /proc/pid/maps is being read, the same vma might be seen twice: once before and once after the change. This duplication is considered acceptable for userspace handling. However, observing a "hole" where a vma should be (e.g., due to a vma being replaced and the space temporarily being empty) is unacceptable.
Implement a test that:
- Forks a child process which continuously modifies its address space,
specifically targeting a vma at the boundary between two pages. 2. The parent process repeatedly reads the child's /proc/pid/maps. 3. The parent process checks the last vma of the first page and the first vma of the second page for consistency, looking for the effects of vma splits or merges.
The test duration is configurable via the -d command-line parameter in seconds to increase the likelihood of catching the race condition. The default test duration is 5 seconds.
Example Command: proc-maps-race -d 10
Signed-off-by: Suren Baghdasaryan surenb@google.com
Why is this selftest not making use of any kselftest framework?
I'm sure there is a very good reason :)
It used to be a part of proc-pid-vm.c and after the split I kept its overall structure. I'll look into using the kselftest framework. Thanks!
Reading assert() feels very weird compared to other selftests.
Sorry to meta-review via your review again David :P
But just to say tools/testing/selftests/kselftest_harness.h is really good, and makes life simple. See tools/testing/selftests/mm/guard-regions.c for an example of how they can be used - pretty straightforward and avoids a lot of kselftest boilerplate.
Thanks for the pointers. I need to figure out a way to pass command-line parameters to my test. Maybe I can use fixtures for that... Let me read more about it.
-- Cheers,
David / dhildenb