1*ef777be9SPeter Holm#!/bin/sh 2*ef777be9SPeter Holm 3*ef777be9SPeter Holm# 4*ef777be9SPeter Holm# Copyright (c) 2025 Peter Holm <pho@FreeBSD.org> 5*ef777be9SPeter Holm# 6*ef777be9SPeter Holm# SPDX-License-Identifier: BSD-2-Clause 7*ef777be9SPeter Holm# 8*ef777be9SPeter Holm 9*ef777be9SPeter Holm# No problems observed 10*ef777be9SPeter Holm 11*ef777be9SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 12*ef777be9SPeter Holm 13*ef777be9SPeter Holm. ../default.cfg 14*ef777be9SPeter Holm 15*ef777be9SPeter Holmset -u 16*ef777be9SPeter Holmprog=$(basename "$0" .sh) 17*ef777be9SPeter Holmmount | grep -q "on $mntpoint " && umount $mntpoint 18*ef777be9SPeter Holm[ -c /dev/md$mdstart ] && mdconfig -d -u $mdstart 19*ef777be9SPeter Holm 20*ef777be9SPeter Holmmdconfig -a -t swap -s 1g -u $mdstart 21*ef777be9SPeter Holmgpart create -s bsd md$mdstart > /dev/null 22*ef777be9SPeter Holmgpart add -t freebsd-ufs md$mdstart > /dev/null 23*ef777be9SPeter Holmpart=a 24*ef777be9SPeter Holmnewfs_msdos -F 32 -b 8192 /dev/md${mdstart}$part > /dev/null || exit 1 25*ef777be9SPeter Holmmount -t msdosfs /dev/md${mdstart}$part $mntpoint 26*ef777be9SPeter Holm 27*ef777be9SPeter Holmhere=`pwd` 28*ef777be9SPeter Holmcd /tmp 29*ef777be9SPeter Holmcat > $prog.c <<EOF 30*ef777be9SPeter Holm#include <sys/param.h> 31*ef777be9SPeter Holm#include <sys/mman.h> 32*ef777be9SPeter Holm#include <sys/stat.h> 33*ef777be9SPeter Holm#include <sys/wait.h> 34*ef777be9SPeter Holm 35*ef777be9SPeter Holm#include <machine/atomic.h> 36*ef777be9SPeter Holm 37*ef777be9SPeter Holm#include <err.h> 38*ef777be9SPeter Holm#include <errno.h> 39*ef777be9SPeter Holm#include <fcntl.h> 40*ef777be9SPeter Holm#include <stdio.h> 41*ef777be9SPeter Holm#include <stdlib.h> 42*ef777be9SPeter Holm#include <unistd.h> 43*ef777be9SPeter Holm 44*ef777be9SPeter Holmstatic volatile u_int *share; 45*ef777be9SPeter Holmstatic char file1[80], file2[80]; 46*ef777be9SPeter Holm 47*ef777be9SPeter Holm#define SYNC 0 48*ef777be9SPeter Holm#define STOP 1 49*ef777be9SPeter Holm 50*ef777be9SPeter Holmstatic void 51*ef777be9SPeter Holmtest0(void) 52*ef777be9SPeter Holm{ 53*ef777be9SPeter Holm struct stat sb; 54*ef777be9SPeter Holm 55*ef777be9SPeter Holm while (share[STOP] == 0) { 56*ef777be9SPeter Holm while (share[SYNC] != 0) 57*ef777be9SPeter Holm usleep(100); 58*ef777be9SPeter Holm if (rename(file1, file2) == -1) 59*ef777be9SPeter Holm err(1, "rename(%s, %s)", file1, file2); 60*ef777be9SPeter Holm if (stat(file1, &sb) == 0) 61*ef777be9SPeter Holm err(1, "stat(%s)", file1); 62*ef777be9SPeter Holm atomic_add_int(&share[SYNC], 1); 63*ef777be9SPeter Holm } 64*ef777be9SPeter Holm 65*ef777be9SPeter Holm _exit(0); 66*ef777be9SPeter Holm} 67*ef777be9SPeter Holm 68*ef777be9SPeter Holmstatic void 69*ef777be9SPeter Holmtest1(void) 70*ef777be9SPeter Holm{ 71*ef777be9SPeter Holm struct stat sb; 72*ef777be9SPeter Holm 73*ef777be9SPeter Holm while (share[STOP] == 0) { 74*ef777be9SPeter Holm while (share[SYNC] != 1) 75*ef777be9SPeter Holm usleep(100); 76*ef777be9SPeter Holm if (rename(file2, file1) == -1) 77*ef777be9SPeter Holm err(1, "rename(%s, %s)", file2, file1); 78*ef777be9SPeter Holm if (stat(file2, &sb) == 0) 79*ef777be9SPeter Holm err(1, "stat(%s)", file2); 80*ef777be9SPeter Holm atomic_add_int(&share[SYNC], -1); 81*ef777be9SPeter Holm } 82*ef777be9SPeter Holm 83*ef777be9SPeter Holm _exit(0); 84*ef777be9SPeter Holm} 85*ef777be9SPeter Holm 86*ef777be9SPeter Holmint 87*ef777be9SPeter Holmmain(void) 88*ef777be9SPeter Holm{ 89*ef777be9SPeter Holm pid_t pids[2]; 90*ef777be9SPeter Holm size_t len; 91*ef777be9SPeter Holm int fd; 92*ef777be9SPeter Holm char cwd[80]; 93*ef777be9SPeter Holm 94*ef777be9SPeter Holm len = PAGE_SIZE; 95*ef777be9SPeter Holm if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE, 96*ef777be9SPeter Holm MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED) 97*ef777be9SPeter Holm err(1, "mmap"); 98*ef777be9SPeter Holm 99*ef777be9SPeter Holm if (getcwd(cwd, sizeof(cwd)) == NULL) 100*ef777be9SPeter Holm err(1, "getcwd()"); 101*ef777be9SPeter Holm snprintf(file1, sizeof(file1), "%s/a.%06d", cwd, getpid()); 102*ef777be9SPeter Holm snprintf(file2, sizeof(file2), "%s/b.%06d", cwd, getpid()); 103*ef777be9SPeter Holm if ((fd = open(file1, O_CREAT, 0640)) == -1) 104*ef777be9SPeter Holm err(1, "open(%s)", file1); 105*ef777be9SPeter Holm close(fd); 106*ef777be9SPeter Holm 107*ef777be9SPeter Holm if ((pids[0] = fork()) == 0) 108*ef777be9SPeter Holm test0(); 109*ef777be9SPeter Holm if ((pids[1] = fork()) == 0) 110*ef777be9SPeter Holm test1(); 111*ef777be9SPeter Holm 112*ef777be9SPeter Holm sleep(120); 113*ef777be9SPeter Holm share[STOP] = 1; 114*ef777be9SPeter Holm 115*ef777be9SPeter Holm if (waitpid(pids[0], NULL, 0) == -1) 116*ef777be9SPeter Holm err(1, "waitpid(%d)", pids[0]); 117*ef777be9SPeter Holm if (waitpid(pids[1], NULL, 0) == -1) 118*ef777be9SPeter Holm err(1, "waitpid(%d)", pids[1]); 119*ef777be9SPeter Holm unlink(file1); 120*ef777be9SPeter Holm unlink(file2); 121*ef777be9SPeter Holm} 122*ef777be9SPeter HolmEOF 123*ef777be9SPeter Holmmycc -o $prog -Wall $prog.c || exit 1 124*ef777be9SPeter Holmrm -f $prog.c 125*ef777be9SPeter Holmcd $here 126*ef777be9SPeter Holm 127*ef777be9SPeter Holm(cd ../testcases/swap; ./swap -t 5m -i 20 -l 100) & 128*ef777be9SPeter Holmcd $mntpoint 129*ef777be9SPeter Holmpids="" 130*ef777be9SPeter Holmfor i in `jot 30`; do 131*ef777be9SPeter Holm /tmp/$prog & 132*ef777be9SPeter Holm pids="$pids $!" 133*ef777be9SPeter Holmdone 134*ef777be9SPeter Holmfor pid in $pids; do 135*ef777be9SPeter Holm wait $pid 136*ef777be9SPeter Holmdone 137*ef777be9SPeter Holmcd $here 138*ef777be9SPeter Holmwhile pkill swap; do :; done 139*ef777be9SPeter Holmwait 140*ef777be9SPeter Holm 141*ef777be9SPeter Holmumount $mntpoint 142*ef777be9SPeter Holmmdconfig -d -u $mdstart 143*ef777be9SPeter Holmrm -f /tmp/$prog 144*ef777be9SPeter Holmexit 0 145