1*8a272653SPeter Holm#!/bin/sh 2*8a272653SPeter Holm 3*8a272653SPeter Holm# 4*8a272653SPeter Holm# Copyright (c) 2012 Peter Holm <pho@FreeBSD.org> 5*8a272653SPeter Holm# All rights reserved. 6*8a272653SPeter Holm# 7*8a272653SPeter Holm# Redistribution and use in source and binary forms, with or without 8*8a272653SPeter Holm# modification, are permitted provided that the following conditions 9*8a272653SPeter Holm# are met: 10*8a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright 11*8a272653SPeter Holm# notice, this list of conditions and the following disclaimer. 12*8a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright 13*8a272653SPeter Holm# notice, this list of conditions and the following disclaimer in the 14*8a272653SPeter Holm# documentation and/or other materials provided with the distribution. 15*8a272653SPeter Holm# 16*8a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17*8a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*8a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*8a272653SPeter Holm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20*8a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*8a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*8a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*8a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*8a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*8a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*8a272653SPeter Holm# SUCH DAMAGE. 27*8a272653SPeter Holm# 28*8a272653SPeter Holm 29*8a272653SPeter Holm# Variation of the datamove2.sh, using TMPFS 30*8a272653SPeter Holm# Deadlock seen 31*8a272653SPeter Holm# https://people.freebsd.org/~pho/stress/log/datamove4.txt 32*8a272653SPeter Holm 33*8a272653SPeter Holm# panic: elf32_putnote: Note type 10 changed as we read it (2236 > 2220)... 34*8a272653SPeter Holm# https://people.freebsd.org/~pho/stress/log/datamove4-2.txt 35*8a272653SPeter Holm# Fixed by r288944. 36*8a272653SPeter Holm 37*8a272653SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 38*8a272653SPeter Holm 39*8a272653SPeter Holm. ../default.cfg 40*8a272653SPeter Holm 41*8a272653SPeter Holmhere=`pwd` 42*8a272653SPeter Holmcd /tmp 43*8a272653SPeter Holmsed '1,/^EOF/d' < $here/$0 > datamove4.c 44*8a272653SPeter Holmmycc -o datamove4 -Wall -Wextra -O2 -g datamove4.c 45*8a272653SPeter Holmrm -f datamove4.c 46*8a272653SPeter Holm 47*8a272653SPeter Holmmount | grep -q "$mntpoint " && umount $mntpoint 48*8a272653SPeter Holmmount -t tmpfs tmpfs $mntpoint 49*8a272653SPeter Holmchmod 777 $mntpoint 50*8a272653SPeter Holm 51*8a272653SPeter Holmfor i in `jot 5`; do 52*8a272653SPeter Holm su $testuser -c "cd $mntpoint; /tmp/datamove4" 53*8a272653SPeter Holmdone 54*8a272653SPeter Holmwhile mount | grep -q $mntpoint; do 55*8a272653SPeter Holm umount -f $mntpoint > /dev/null 2>&1 56*8a272653SPeter Holmdone 57*8a272653SPeter Holm 58*8a272653SPeter Holmrm -rf /tmp/datamove4 59*8a272653SPeter Holmexit 0 60*8a272653SPeter HolmEOF 61*8a272653SPeter Holm/*- 62*8a272653SPeter Holm * Copyright (c) 2006, Stephan Uphoff <ups@freebsd.org> 63*8a272653SPeter Holm * All rights reserved. 64*8a272653SPeter Holm * 65*8a272653SPeter Holm * Redistribution and use in source and binary forms, with or without 66*8a272653SPeter Holm * modification, are permitted provided that the following conditions 67*8a272653SPeter Holm * are met: 68*8a272653SPeter Holm * 1. Redistributions of source code must retain the above copyright 69*8a272653SPeter Holm * notice unmodified, this list of conditions, and the following 70*8a272653SPeter Holm * disclaimer. 71*8a272653SPeter Holm * 2. Redistributions in binary form must reproduce the above copyright 72*8a272653SPeter Holm * notice, this list of conditions and the following disclaimer in the 73*8a272653SPeter Holm * documentation and/or other materials provided with the distribution. 74*8a272653SPeter Holm * 75*8a272653SPeter Holm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 76*8a272653SPeter Holm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 77*8a272653SPeter Holm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 78*8a272653SPeter Holm * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 79*8a272653SPeter Holm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 80*8a272653SPeter Holm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 81*8a272653SPeter Holm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 82*8a272653SPeter Holm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 83*8a272653SPeter Holm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 84*8a272653SPeter Holm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 85*8a272653SPeter Holm */ 86*8a272653SPeter Holm 87*8a272653SPeter Holm#include <err.h> 88*8a272653SPeter Holm#include <fcntl.h> 89*8a272653SPeter Holm#include <stdio.h> 90*8a272653SPeter Holm#include <stdlib.h> 91*8a272653SPeter Holm#include <sys/mman.h> 92*8a272653SPeter Holm#include <sys/stat.h> 93*8a272653SPeter Holm#include <sys/types.h> 94*8a272653SPeter Holm#include <sys/wait.h> 95*8a272653SPeter Holm#include <unistd.h> 96*8a272653SPeter Holm 97*8a272653SPeter Holmint prepareFile(char *filename, int *fdp); 98*8a272653SPeter Holmint mapBuffer (char **bufferp, int fd1, int fd2); 99*8a272653SPeter Holmint startIO (int fd, char *buffer); 100*8a272653SPeter Holm 101*8a272653SPeter Holmint pagesize; 102*8a272653SPeter Holm 103*8a272653SPeter Holm#define FILESIZE (32*1024) 104*8a272653SPeter Holmchar wbuffer [FILESIZE]; 105*8a272653SPeter Holm 106*8a272653SPeter Holm/* Create a FILESIZE sized file - then remove file data from the cache */ 107*8a272653SPeter Holmint 108*8a272653SPeter HolmprepareFile(char *filename, int *fdp) 109*8a272653SPeter Holm{ 110*8a272653SPeter Holm int fd; 111*8a272653SPeter Holm int len; 112*8a272653SPeter Holm int status; 113*8a272653SPeter Holm void *addr; 114*8a272653SPeter Holm 115*8a272653SPeter Holm fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, S_IRWXU); 116*8a272653SPeter Holm if (fd == -1) { 117*8a272653SPeter Holm perror(filename); 118*8a272653SPeter Holm return fd; 119*8a272653SPeter Holm } 120*8a272653SPeter Holm len = write(fd, wbuffer, FILESIZE); 121*8a272653SPeter Holm if (len < 0) { 122*8a272653SPeter Holm perror("Write failed"); 123*8a272653SPeter Holm return 1; 124*8a272653SPeter Holm } 125*8a272653SPeter Holm status = fsync(fd); 126*8a272653SPeter Holm if (status != 0) { 127*8a272653SPeter Holm perror("fsync failed"); 128*8a272653SPeter Holm return 1; 129*8a272653SPeter Holm } 130*8a272653SPeter Holm addr = mmap(NULL, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 131*8a272653SPeter Holm if (addr == MAP_FAILED) { 132*8a272653SPeter Holm perror("Mmap failed"); 133*8a272653SPeter Holm return 1; 134*8a272653SPeter Holm } 135*8a272653SPeter Holm status = msync(addr, FILESIZE, MS_INVALIDATE | MS_SYNC); 136*8a272653SPeter Holm if (status != 0) { 137*8a272653SPeter Holm perror("Msync failed"); 138*8a272653SPeter Holm return 1; 139*8a272653SPeter Holm } 140*8a272653SPeter Holm if (munmap(addr, FILESIZE) == -1) { 141*8a272653SPeter Holm perror("munmap failed"); 142*8a272653SPeter Holm return 1; 143*8a272653SPeter Holm } 144*8a272653SPeter Holm 145*8a272653SPeter Holm *fdp = fd; 146*8a272653SPeter Holm return 0; 147*8a272653SPeter Holm} 148*8a272653SPeter Holm 149*8a272653SPeter Holm/* mmap a 2 page buffer - first page is from fd1, second page from fd2 */ 150*8a272653SPeter Holmint 151*8a272653SPeter HolmmapBuffer(char **bufferp, int fd1, int fd2) 152*8a272653SPeter Holm{ 153*8a272653SPeter Holm void *addr; 154*8a272653SPeter Holm char *buffer; 155*8a272653SPeter Holm 156*8a272653SPeter Holm addr = mmap(NULL, pagesize * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd1, 0); 157*8a272653SPeter Holm if (addr == MAP_FAILED) { 158*8a272653SPeter Holm perror("Mmap failed"); 159*8a272653SPeter Holm return 1; 160*8a272653SPeter Holm } 161*8a272653SPeter Holm buffer = addr; 162*8a272653SPeter Holm addr = mmap(buffer + pagesize, pagesize, PROT_READ | PROT_WRITE, MAP_FIXED | 163*8a272653SPeter Holm MAP_SHARED, fd2, 0); 164*8a272653SPeter Holm 165*8a272653SPeter Holm if (addr == MAP_FAILED) { 166*8a272653SPeter Holm perror("Mmap2 failed"); 167*8a272653SPeter Holm return 1; 168*8a272653SPeter Holm } 169*8a272653SPeter Holm *bufferp = buffer; 170*8a272653SPeter Holm return 0; 171*8a272653SPeter Holm} 172*8a272653SPeter Holm 173*8a272653SPeter Holmvoid 174*8a272653SPeter HolmunmapBuffer(char *bufferp) 175*8a272653SPeter Holm{ 176*8a272653SPeter Holm if (munmap(bufferp, pagesize * 2) == -1) 177*8a272653SPeter Holm err(1, "unmap 1. buffer"); 178*8a272653SPeter Holm /* 179*8a272653SPeter Holm The following unmaps something random, which could trigger: 180*8a272653SPeter Holm Program received signal SIGSEGV, Segmentation fault. 181*8a272653SPeter Holm free (cp=0x28070000) at /usr/src/libexec/rtld-elf/malloc.c:311 182*8a272653SPeter Holm */ 183*8a272653SPeter Holm 184*8a272653SPeter Holm#if 0 185*8a272653SPeter Holm if (munmap(bufferp + pagesize * 2, pagesize * 2) == -1) 186*8a272653SPeter Holm err(1, "unmap 2. buffer"); 187*8a272653SPeter Holm#endif 188*8a272653SPeter Holm} 189*8a272653SPeter Holm 190*8a272653SPeter Holmint 191*8a272653SPeter HolmstartIO(int fd, char *buffer) 192*8a272653SPeter Holm{ 193*8a272653SPeter Holm ssize_t len; 194*8a272653SPeter Holm 195*8a272653SPeter Holm len = write(fd, buffer, 2 * pagesize); 196*8a272653SPeter Holm if (len == -1) { 197*8a272653SPeter Holm perror("write failed"); 198*8a272653SPeter Holm return 1; 199*8a272653SPeter Holm } 200*8a272653SPeter Holm return 0; 201*8a272653SPeter Holm} 202*8a272653SPeter Holm 203*8a272653SPeter Holmint 204*8a272653SPeter Holmmain() 205*8a272653SPeter Holm{ 206*8a272653SPeter Holm 207*8a272653SPeter Holm int fdA, fdB, fdDelayA, fdDelayB; 208*8a272653SPeter Holm int status; 209*8a272653SPeter Holm int i; 210*8a272653SPeter Holm char *bufferA, *bufferB; 211*8a272653SPeter Holm pid_t pid; 212*8a272653SPeter Holm 213*8a272653SPeter Holm pagesize = getpagesize(); 214*8a272653SPeter Holm 215*8a272653SPeter Holm for (i = 0; i < 1000; i++) { 216*8a272653SPeter Holm if ((prepareFile("A", &fdA)) 217*8a272653SPeter Holm || (prepareFile("B", &fdB)) 218*8a272653SPeter Holm || (prepareFile("DelayA", &fdDelayA)) 219*8a272653SPeter Holm || (prepareFile("DelayB", &fdDelayB)) 220*8a272653SPeter Holm || (mapBuffer(&bufferA, fdDelayA, fdB)) 221*8a272653SPeter Holm || (mapBuffer(&bufferB, fdDelayB, fdA))) 222*8a272653SPeter Holm exit(1); 223*8a272653SPeter Holm 224*8a272653SPeter Holm pid = fork(); 225*8a272653SPeter Holm 226*8a272653SPeter Holm if (pid == 0) { 227*8a272653SPeter Holm status = startIO(fdA, bufferA); 228*8a272653SPeter Holm exit(status); 229*8a272653SPeter Holm } 230*8a272653SPeter Holm if (pid == -1) { 231*8a272653SPeter Holm perror("fork"); 232*8a272653SPeter Holm exit(1); 233*8a272653SPeter Holm } 234*8a272653SPeter Holm status = startIO(fdB, bufferB); 235*8a272653SPeter Holm if (wait(&status) == -1) 236*8a272653SPeter Holm err(1, "wait"); 237*8a272653SPeter Holm 238*8a272653SPeter Holm close(fdA); 239*8a272653SPeter Holm close(fdB); 240*8a272653SPeter Holm close(fdDelayA); 241*8a272653SPeter Holm close(fdDelayB); 242*8a272653SPeter Holm unmapBuffer(bufferA); 243*8a272653SPeter Holm unmapBuffer(bufferB); 244*8a272653SPeter Holm unlink("A"); 245*8a272653SPeter Holm unlink("B"); 246*8a272653SPeter Holm unlink("DelayA"); 247*8a272653SPeter Holm unlink("DelayB"); 248*8a272653SPeter Holm } 249*8a272653SPeter Holm exit(status); 250*8a272653SPeter Holm 251*8a272653SPeter Holm} 252