tools/testing/selftests/mm/mkdirty.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/mm/mkdirty.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/mm/mkdirty.c- Extension
.c- Size
- 9064 bytes
- Lines
- 381
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
fcntl.hsignal.hunistd.hstring.herrno.hstdlib.hstdbool.hstdint.hsys/mman.hsetjmp.hsys/syscall.hsys/ioctl.hlinux/userfaultfd.hlinux/mempolicy.hkselftest.hvm_util.h
Detected Declarations
function signal_handlerfunction do_test_write_sigsegvfunction test_ptrace_writefunction test_ptrace_write_thpfunction test_page_migrationfunction test_page_migration_thpfunction test_pte_mapped_thpfunction test_uffdio_copyfunction main
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0-only
/*
* Test handling of code that might set PTE/PMD dirty in read-only VMAs.
* Setting a PTE/PMD dirty must not accidentally set the PTE/PMD writable.
*
* Copyright 2023, Red Hat, Inc.
*
* Author(s): David Hildenbrand <david@redhat.com>
*/
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include <sys/mman.h>
#include <setjmp.h>
#include <sys/syscall.h>
#include <sys/ioctl.h>
#include <linux/userfaultfd.h>
#include <linux/mempolicy.h>
#include "kselftest.h"
#include "vm_util.h"
static size_t pagesize;
static size_t thpsize;
static int mem_fd;
static int pagemap_fd;
static sigjmp_buf env;
static void signal_handler(int sig)
{
if (sig == SIGSEGV)
siglongjmp(env, 1);
siglongjmp(env, 2);
}
static void do_test_write_sigsegv(char *mem)
{
char orig = *mem;
int ret;
if (signal(SIGSEGV, signal_handler) == SIG_ERR) {
ksft_test_result_fail("signal() failed\n");
return;
}
ret = sigsetjmp(env, 1);
if (!ret)
*mem = orig + 1;
if (signal(SIGSEGV, SIG_DFL) == SIG_ERR)
ksft_test_result_fail("signal() failed\n");
ksft_test_result(ret == 1 && *mem == orig,
"SIGSEGV generated, page not modified\n");
}
static char *mmap_thp_range(int prot, char **_mmap_mem, size_t *_mmap_size)
{
const size_t mmap_size = 2 * thpsize;
char *mem, *mmap_mem;
mmap_mem = mmap(NULL, mmap_size, prot, MAP_PRIVATE|MAP_ANON,
-1, 0);
if (mmap_mem == MAP_FAILED) {
ksft_test_result_fail("mmap() failed\n");
return MAP_FAILED;
}
mem = (char *)(((uintptr_t)mmap_mem + thpsize) & ~(thpsize - 1));
if (madvise(mem, thpsize, MADV_HUGEPAGE)) {
ksft_test_result_skip("MADV_HUGEPAGE failed\n");
munmap(mmap_mem, mmap_size);
return MAP_FAILED;
}
*_mmap_mem = mmap_mem;
*_mmap_size = mmap_size;
return mem;
}
static void test_ptrace_write(void)
{
char data = 1;
char *mem;
int ret;
Annotation
- Immediate include surface: `fcntl.h`, `signal.h`, `unistd.h`, `string.h`, `errno.h`, `stdlib.h`, `stdbool.h`, `stdint.h`.
- Detected declarations: `function signal_handler`, `function do_test_write_sigsegv`, `function test_ptrace_write`, `function test_ptrace_write_thp`, `function test_page_migration`, `function test_page_migration_thp`, `function test_pte_mapped_thp`, `function test_uffdio_copy`, `function main`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.