tools/testing/selftests/mm/soft-dirty.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/mm/soft-dirty.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/mm/soft-dirty.c- Extension
.c- Size
- 9292 bytes
- Lines
- 351
- 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.
Dependency Surface
stdio.hstring.hstdbool.hfcntl.hstdint.hmalloc.hsys/mman.hkselftest.hvm_util.hthp_settings.h
Detected Declarations
function test_simplefunction test_vma_reusefunction test_hugepagefunction test_mprotectfunction test_mergefunction test_mprotect_anonfunction test_mprotect_filefunction main
Annotated Snippet
if (pagemap_is_softdirty(pagemap_fd, map) == 1) {
ksft_print_msg("dirty bit was 1, but should be 0 (i=%d)\n", i);
break;
}
clear_softdirty();
// Write something to the page to get the dirty bit enabled on the page
map[0]++;
if (pagemap_is_softdirty(pagemap_fd, map) == 0) {
ksft_print_msg("dirty bit was 0, but should be 1 (i=%d)\n", i);
break;
}
clear_softdirty();
}
free(map);
ksft_test_result(i == TEST_ITERATIONS, "Test %s\n", __func__);
}
static void test_vma_reuse(int pagemap_fd, int pagesize)
{
char *map, *map2;
map = mmap(NULL, pagesize, (PROT_READ | PROT_WRITE), (MAP_PRIVATE | MAP_ANON), -1, 0);
if (map == MAP_FAILED)
ksft_exit_fail_msg("mmap failed");
// The kernel always marks new regions as soft dirty
ksft_test_result(pagemap_is_softdirty(pagemap_fd, map) == 1,
"Test %s dirty bit of allocated page\n", __func__);
clear_softdirty();
munmap(map, pagesize);
map2 = mmap(NULL, pagesize, (PROT_READ | PROT_WRITE), (MAP_PRIVATE | MAP_ANON), -1, 0);
if (map2 == MAP_FAILED)
ksft_exit_fail_msg("mmap failed");
// Dirty bit is set for new regions even if they are reused
if (map == map2)
ksft_test_result(pagemap_is_softdirty(pagemap_fd, map2) == 1,
"Test %s dirty bit of reused address page\n", __func__);
else
ksft_test_result_skip("Test %s dirty bit of reused address page\n", __func__);
munmap(map2, pagesize);
}
static void test_hugepage(int pagemap_fd, int pagesize)
{
char *map;
int i, ret;
if (!thp_is_enabled()) {
ksft_print_msg("Transparent Hugepages not available\n");
ksft_test_result_skip("Test %s huge page allocation\n", __func__);
ksft_test_result_skip("Test %s huge page dirty bit\n", __func__);
return;
}
size_t hpage_len = read_pmd_pagesize();
if (!hpage_len)
ksft_exit_fail_msg("Reading PMD pagesize failed");
map = memalign(hpage_len, hpage_len);
if (!map)
ksft_exit_fail_msg("memalign failed\n");
ret = madvise(map, hpage_len, MADV_HUGEPAGE);
if (ret)
ksft_exit_fail_msg("madvise failed %d\n", ret);
for (i = 0; i < hpage_len; i++)
map[i] = (char)i;
if (check_huge_anon(map, 1, hpage_len)) {
ksft_test_result_pass("Test %s huge page allocation\n", __func__);
clear_softdirty();
for (i = 0 ; i < TEST_ITERATIONS ; i++) {
if (pagemap_is_softdirty(pagemap_fd, map) == 1) {
ksft_print_msg("dirty bit was 1, but should be 0 (i=%d)\n", i);
break;
}
clear_softdirty();
// Write something to the page to get the dirty bit enabled on the page
map[0]++;
Annotation
- Immediate include surface: `stdio.h`, `string.h`, `stdbool.h`, `fcntl.h`, `stdint.h`, `malloc.h`, `sys/mman.h`, `kselftest.h`.
- Detected declarations: `function test_simple`, `function test_vma_reuse`, `function test_hugepage`, `function test_mprotect`, `function test_merge`, `function test_mprotect_anon`, `function test_mprotect_file`, `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.