1#!/bin/sh
2
3# File-backed shared memory performance
4# https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=222356
5
6# For unlinked files, do not msync(2) or sync on inactivation.
7# https://reviews.freebsd.org/D12411
8
9# Original test scenario by: tijl@FreeBSD.org
10
11# Fixed by r323768
12
13. ../default.cfg
14
15cat > /tmp/unlink.c <<EOF
16#include <sys/mman.h>
17#include <sys/time.h>
18
19#include <err.h>
20#include <fcntl.h>
21#include <stdio.h>
22#include <string.h>
23#include <unistd.h>
24
25int
26main(void) {
27	struct timeval diff, start, stop;
28	size_t sz;
29	void *base;
30	uint64_t usec;
31	int fd;
32
33	sz = 128 * 1024 * 1024;
34	fd = open("nosync.data", O_RDWR | O_CREAT, 0600);
35	if (fd == -1)
36		err(1, "open");
37	if (unlink("nosync.data") == -1)
38		err(1, "unlink");
39	if (ftruncate(fd, sz) == -1)
40		err(1, "ftruncate");
41	base = mmap(NULL, sz, PROT_READ | PROT_WRITE,
42		     MAP_SHARED | MAP_NOSYNC, fd, 0);
43	if (base == MAP_FAILED)
44		err(1, "mmap");
45	memset(base, '0', sz);
46	if (munmap(base, sz) == -1)
47		err(1, "unmap");
48	gettimeofday(&start, NULL);
49	close(fd);
50	gettimeofday(&stop, NULL);
51	timersub(&stop, &start, &diff);
52	usec  = ((uint64_t)1000000 * diff.tv_sec + diff.tv_usec);
53	if (usec > 500000) {
54		fprintf(stdout, "%.3f seconds elapsed\n",
55		    (double)usec / 1000000);
56		return (0); /* Ignore error for now */
57	} else
58		return(0);
59}
60EOF
61
62mycc -o /tmp/unlink -Wall -Wextra -O2 -g /tmp/unlink.c || exit 1
63rm /tmp/unlink.c
64
65cd $RUNDIR
66/tmp/unlink; s=$?
67
68rm /tmp/unlink
69exit $s
70