brintos

brintos / linux-shallow public Read only

0
0
Text · 1.1 KiB · f3d9ecf Raw
54 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright (C) 2024 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.4 */5 6#include <assert.h>7#include <stdbool.h>8#include <stdint.h>9#include <stdio.h>10#include <stdlib.h>11#include <unistd.h>12#include <signal.h>13#include <sys/mman.h>14#include <linux/mman.h>15 16#include "../kselftest.h"17 18int main(int argc, char *argv[])19{20	size_t alloc_size = 134217728;21	size_t page_size = getpagesize();22	void *alloc;23	pid_t child;24 25	ksft_print_header();26	ksft_set_plan(1);27 28	alloc = mmap(0, alloc_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_DROPPABLE, -1, 0);29	assert(alloc != MAP_FAILED);30	memset(alloc, 'A', alloc_size);31	for (size_t i = 0; i < alloc_size; i += page_size)32		assert(*(uint8_t *)(alloc + i));33 34	child = fork();35	assert(child >= 0);36	if (!child) {37		for (;;)38			*(char *)malloc(page_size) = 'B';39	}40 41	for (bool done = false; !done;) {42		for (size_t i = 0; i < alloc_size; i += page_size) {43			if (!*(uint8_t *)(alloc + i)) {44				done = true;45				break;46			}47		}48	}49	kill(child, SIGTERM);50 51	ksft_test_result_pass("MAP_DROPPABLE: PASS\n");52	exit(KSFT_PASS);53}54