brintos

brintos / linux-shallow public Read only

0
0
Text · 1.7 KiB · 3b1b532 Raw
79 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * hugepage-mmap:4 *5 * Example of using huge page memory in a user application using the mmap6 * system call.  Before running this application, make sure that the7 * administrator has mounted the hugetlbfs filesystem (on some directory8 * like /mnt) using the command mount -t hugetlbfs nodev /mnt. In this9 * example, the app is requesting memory of size 256MB that is backed by10 * huge pages.11 */12#define _GNU_SOURCE13#include <stdlib.h>14#include <stdio.h>15#include <unistd.h>16#include <sys/mman.h>17#include <fcntl.h>18#include "../kselftest.h"19 20#define LENGTH (256UL*1024*1024)21#define PROTECTION (PROT_READ | PROT_WRITE)22 23static void check_bytes(char *addr)24{25	ksft_print_msg("First hex is %x\n", *((unsigned int *)addr));26}27 28static void write_bytes(char *addr)29{30	unsigned long i;31 32	for (i = 0; i < LENGTH; i++)33		*(addr + i) = (char)i;34}35 36static int read_bytes(char *addr)37{38	unsigned long i;39 40	check_bytes(addr);41	for (i = 0; i < LENGTH; i++)42		if (*(addr + i) != (char)i) {43			ksft_print_msg("Error: Mismatch at %lu\n", i);44			return 1;45		}46	return 0;47}48 49int main(void)50{51	void *addr;52	int fd, ret;53 54	ksft_print_header();55	ksft_set_plan(1);56 57	fd = memfd_create("hugepage-mmap", MFD_HUGETLB);58	if (fd < 0)59		ksft_exit_fail_msg("memfd_create() failed: %s\n", strerror(errno));60 61	addr = mmap(NULL, LENGTH, PROTECTION, MAP_SHARED, fd, 0);62	if (addr == MAP_FAILED) {63		close(fd);64		ksft_exit_fail_msg("mmap(): %s\n", strerror(errno));65	}66 67	ksft_print_msg("Returned address is %p\n", addr);68	check_bytes(addr);69	write_bytes(addr);70	ret = read_bytes(addr);71 72	munmap(addr, LENGTH);73	close(fd);74 75	ksft_test_result(!ret, "Read same data\n");76 77	ksft_exit(!ret);78}79