From owner-svn-src-user@freebsd.org Wed Apr 3 07:28:51 2019 Return-Path: Delivered-To: svn-src-user@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 32B851561C9D for ; Wed, 3 Apr 2019 07:28:51 +0000 (UTC) (envelope-from freebsd@gndrsh.dnsmgr.net) Received: from gndrsh.dnsmgr.net (br1.CN84in.dnsmgr.net [69.59.192.140]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 499CF979AE; Wed, 3 Apr 2019 07:28:47 +0000 (UTC) (envelope-from freebsd@gndrsh.dnsmgr.net) Received: from gndrsh.dnsmgr.net (localhost [127.0.0.1]) by gndrsh.dnsmgr.net (8.13.3/8.13.3) with ESMTP id x337SjHu025423; Wed, 3 Apr 2019 00:28:45 -0700 (PDT) (envelope-from freebsd@gndrsh.dnsmgr.net) Received: (from freebsd@localhost) by gndrsh.dnsmgr.net (8.13.3/8.13.3/Submit) id x337Sjut025422; Wed, 3 Apr 2019 00:28:45 -0700 (PDT) (envelope-from freebsd) From: "Rodney W. Grimes" Message-Id: <201904030728.x337Sjut025422@gndrsh.dnsmgr.net> Subject: Re: svn commit: r345840 - user/pho/stress2/misc In-Reply-To: <201904030722.x337Mkt6049518@repo.freebsd.org> To: Peter Holm Date: Wed, 3 Apr 2019 00:28:45 -0700 (PDT) CC: src-committers@freebsd.org, svn-src-user@freebsd.org Reply-To: rgrimes@freebsd.org X-Mailer: ELM [version 2.4ME+ PL121h (25)] MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII X-Rspamd-Queue-Id: 499CF979AE X-Spamd-Bar: ------ Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [-6.99 / 15.00]; NEURAL_HAM_MEDIUM(-1.00)[-1.000,0]; NEURAL_HAM_SHORT(-0.99)[-0.989,0]; NEURAL_HAM_LONG(-1.00)[-1.000,0]; REPLY(-4.00)[] X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 03 Apr 2019 07:28:51 -0000 > Author: pho > Date: Wed Apr 3 07:22:46 2019 > New Revision: 345840 > URL: https://svnweb.freebsd.org/changeset/base/345840 > > Log: > Added tmpfs to the tested file systems. > Added showing file mapping for RW and RO mounts. > > Sponsored by: Dell EMC Isilon > > Modified: > user/pho/stress2/misc/mountu.sh > > Modified: user/pho/stress2/misc/mountu.sh > ============================================================================== > --- user/pho/stress2/misc/mountu.sh Wed Apr 3 07:09:28 2019 (r345839) > +++ user/pho/stress2/misc/mountu.sh Wed Apr 3 07:22:46 2019 (r345840) > @@ -1,9 +1,10 @@ > #!/bin/sh > > # > -# Copyright (c) 2012 Peter Holm > -# All rights reserved. > +# SPDX-License-Identifier: BSD-2-Clause-FreeBSD > # > +# Copyright (c) 2019 Dell EMC Isilon > +# Being on the record, it appears as if the date of original publication has been obliterated and replaced with a newer date. This is moving the date of expiration of the copyright forward and has case law that shows this to be the wrong thing to do. You can make it 2012, 2019 but you can not remove the original publication date. I am uncertain how the "you should never remove a copyright" rule apply here, so there is also that issue. > # Redistribution and use in source and binary forms, with or without > # modification, are permitted provided that the following conditions > # are met: > @@ -42,95 +43,198 @@ > here=`pwd` > cd /tmp > sed '1,/^EOF/d' < $here/$0 > mountu.c > -mycc -o mountu -Wall -Wextra -O2 mountu.c > +mycc -o mountu -Wall -Wextra -O2 mountu.c || exit 1 > rm -f mountu.c > > pstat() { > - pid=`ps a | grep -v grep | grep /tmp/mountu | awk '{print $1}'` > + local pid > + pid=`ps ax | grep -v grep | grep /tmp/mountu | awk '{print $1}'` > [ -n "$pid" ] && procstat -v $pid > } > > +ck() { > + if mount | grep $mntpoint | grep -q "read-only"; then > + if pstat $!| awk "\$2 == \"$map\"" | grep -q " rw-"; then > + echo > + echo "$1 difference" > + mount | grep $mntpoint > + printf "RW mount mapping and RO mount mapping:\n%s\n" "$r" > + pstat $! | awk "\$2 == \"$map\"" > + status=$((status + 1)) > + fi > + else > + echo "$1 mount point RO did not succeed" > + mount | grep $mntpoint > + status=$((status + 1)) > + fi > +} > + > +status=0 > +file=$mntpoint/mountu.sh.file > +mapfile=/tmp/mountu.sh.map > mount | grep -q "$mntpoint " && umount $mntpoint > -mdconfig -l | grep -q $mdstart && mdconfig -d -u $mdstart > +mdconfig -l | grep -q $mdstart && mdconfig -d -u $mdstart > mdconfig -a -t swap -s 100m -u $mdstart > -bsdlabel -w md${mdstart} auto > -newfs $newfs_flags md${mdstart}${part} > /dev/null > -mount /dev/md${mdstart}${part} $mntpoint > +bsdlabel -w md$mdstart auto > +newfs $newfs_flags md${mdstart}$part > /dev/null > +mount /dev/md${mdstart}$part $mntpoint > chmod 777 $mntpoint > > -/tmp/mountu $mntpoint/file & > - > +# ufs > +exec 5>$mapfile > +/tmp/mountu UFS $file & > +pid=$! > sleep 1 > -if ! mount -u -o ro $mntpoint 2>&1 | grep -q "Device busy"; then > - echo "UFS FAILED" > - pstat > -fi > -wait > +map=`cat $mapfile`; rm $mapfile; exec 5>&- > + > +r=`pstat $! | awk "\\$2 == \"$map\""` > +mount -u -o ro $mntpoint 2>/dev/null || mount -fu -o ro $mntpoint > +ck UFS > +mount -u -o rw $mntpoint > +rm -f $file > +wait $pid > +s=$? > +[ $s -ne 139 ] && { echo "UFS exit status is $s"; status=1; } > while mount | grep -q "$mntpoint "; do > umount $mntpoint || sleep 1 > done > - > mdconfig -d -u $mdstart > > +# nfs > if ping -c 2 `echo $nfs_export | sed 's/:.*//'` > /dev/null 2>&1; then > - mount -t nfs -o tcp -o retrycnt=3 -o intr -o soft -o rw $nfs_export \ > + mount -t nfs -o tcp -o retrycnt=3 -o intr,soft -o rw $nfs_export \ > $mntpoint > - rm -f /tmp/file > - /tmp/mountu $mntpoint/file & > + sleep .2 > + rm -f $file > + /tmp/mountu NFS $file & > + pid=$! > sleep 1 > > - if ! mount -u -o ro $mntpoint 2>&1 | grep -q "Device busy"; then > - echo "NFS FAILED" > - fi > - wait > - umount $mntpoint > + r=`pstat $! | awk "\\$2 == \"$map\""` > + mount -u -o ro $mntpoint 2>/dev/null || > + mount -fu -o ro $mntpoint 2>/dev/null > + ck NFS > + wait $pid > + s=$? > + [ $s -ne 139 ] && { echo "NFS exit status is $s"; status=1; } > + > + mount -u -o rw $mntpoint 2>/dev/null > + sleep .2 > + [ -f $file ] && rm -f $file > + umount $mntpoint || umount $mntpoint > fi > > +# msdos > if [ -x /sbin/mount_msdosfs ]; then > mdconfig -a -t swap -s 100m -u $mdstart > - bsdlabel -w md${mdstart} auto > + bsdlabel -w md$mdstart auto > newfs_msdos -F 16 -b 8192 /dev/md${mdstart}$part > /dev/null 2>&1 > mount_msdosfs -m 777 /dev/md${mdstart}$part $mntpoint > - /tmp/mountu $mntpoint/file & > + /tmp/mountu MSDOS $file & > + pid=$! > > sleep 1 > - if ! mount -u -o ro $mntpoint 2>&1 | grep -q "Device busy"; then > - echo "MSDOS FAILED" > - fi > - wait > + r=`pstat $! | awk "\\$2 == \"$map\""` > + mount -u -o ro $mntpoint 2>/dev/null || mount -fu -o ro $mntpoint > + ck MSDOS > + wait $pid > + s=$? > + [ $s -ne 139 ] && { echo "MSDOS exit status is $s"; status=1; } > + mount -u -o rw $mntpoint > + rm -f $file > > while mount | grep -q "$mntpoint "; do > umount $mntpoint || sleep 1 > done > + mdconfig -d -u $mdstart > fi > -rm -f /tmp/mountu /tmp/file > + > +# tmpfs > +mount -t tmpfs null $mntpoint > +chmod 777 $mntpoint > + > +/tmp/mountu TMPFS $file & > +pid=$! > + > +sleep 1 > +r=`pstat $! | awk "\\$2 == \"$map\""` > +mount -u -o ro $mntpoint 2>/dev/null || mount -fu -o ro $mntpoint > +ck TMPFS > +sleep 1 > +mount -u -o rw $mntpoint > +rm -f $file > +wait $pid > +s=$? > +[ $s -ne 139 ] && { echo "TMPFS exit status is $s"; status=1; } > +while mount | grep -q "$mntpoint "; do > + umount $mntpoint || sleep 1 > +done > + > +rm -f /tmp/mountu > exit 0 > EOF > -#include > +/* kib@ noted: > + UFS/NFS/msdosfs reclaim vnode on rw->ro forced remount, and > + change the type of the underying object to OBJT_DEAD, but leave > + the pages on the object queue and installed in the page tables. > + Applications can read/write already mapped pages, but cannot > + page in new pages, cannot observe possible further modifications > + to already mapped pages (if ro->rw remount happen later), and > + their updates to pages are not flushed to file. > + > + It is impossible to mimic this behaviour for tmpfs. > + */ > +#include > +#include > +#include > + > #include > -#include > -#include > -#include > +#include > #include > #include > -#include > -#include > +#include > +#include > +#include > #include > #include > -#include > > #define STARTADDR 0x0U > -#define ADRSPACE 0x0640000U > +#define ADRSPACE 0x0640000U > > +static void > +sighandler(int signo, siginfo_t *si, void *uc1) > +{ > + ucontext_t *uc; > + > + uc = uc1; > + printf("SIG%s at %p, addr %p\n", sys_signame[signo], si->si_addr, > +#if defined(__i386__) > + (void *)uc->uc_mcontext.mc_eip); > +#else > + (void *)uc->uc_mcontext.mc_rip); > +#endif > + exit(1); > +} > + > int > main(int argc __unused, char **argv) > { > - int fd, ps; > + struct passwd *pw; > + struct sigaction sa; > void *p; > size_t len; > - struct passwd *pw; > - char *c, *path; > + int fd; > + char *name, *path; > + volatile char *c; > > + memset(&sa, 0, sizeof(sa)); > + sa.sa_sigaction = sighandler; > + sa.sa_flags = SA_SIGINFO; > + if (sigaction(SIGSEGV, &sa, NULL) == -1) > + err(1, "sigaction(SIGSEGV)"); > + if (sigaction(SIGBUS, &sa, NULL) == -1) > + err(1, "sigaction(SIGBUS)"); > + > if ((pw = getpwnam("nobody")) == NULL) > err(1, "no such user: nobody"); > > @@ -143,7 +247,8 @@ main(int argc __unused, char **argv) > p = (void *)STARTADDR; > len = ADRSPACE; > > - path = argv[1]; > + name = argv[1]; > + path = argv[2]; > if ((fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0622)) == -1) > err(1,"open(%s)", path); > if (ftruncate(fd, len) == -1) > @@ -156,15 +261,25 @@ main(int argc __unused, char **argv) > } > err(1, "mmap(1)"); > } > + dprintf(5, "%p\n", p); > > - c = p; > - ps = getpagesize(); > - for (c = p; (void *)c < p + len; c += ps) { > + for (c = p; (void *)c < p + len; c += PAGE_SIZE) { > *c = 1; > } > > close(fd); > sleep(5); > + fprintf(stderr, "%s: Late read start.\n", name); > + for (c = p; (void *)c < p + len; c += PAGE_SIZE) { > + *c = 1; > + } > + fprintf(stderr, "%s: Late read complete.\n", name); > + > + fprintf(stderr, "%s: Late write start.\n", name); > + for (c = p; (void *)c < p + len; c += PAGE_SIZE) { > + *c = 1; > + } > + fprintf(stderr, "%s: Late write complete.\n", name); > > return (0); > } > > -- Rod Grimes rgrimes@freebsd.org