From owner-svn-src-user@freebsd.org Tue Sep 3 14:06:07 2019 Return-Path: Delivered-To: svn-src-user@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 73808DC3A1 for ; Tue, 3 Sep 2019 14:06:07 +0000 (UTC) (envelope-from yuripv@freebsd.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2610:1c1:1:6074::16:84]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "freefall.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 46N7z30QBDz4PCr; Tue, 3 Sep 2019 14:06:07 +0000 (UTC) (envelope-from yuripv@freebsd.org) Received: by freefall.freebsd.org (Postfix, from userid 1452) id 6963F1A15F; Tue, 3 Sep 2019 14:05:58 +0000 (UTC) X-Original-To: yuripv@localmail.freebsd.org Delivered-To: yuripv@localmail.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [96.47.72.80]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client CN "mx1.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by freefall.freebsd.org (Postfix) with ESMTPS id C713B14B56; Wed, 3 Apr 2019 07:28:54 +0000 (UTC) (envelope-from owner-src-committers@freebsd.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2610:1c1:1:6074::16:84]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "freefall.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 5689D979BA; Wed, 3 Apr 2019 07:28:54 +0000 (UTC) (envelope-from owner-src-committers@freebsd.org) Received: by freefall.freebsd.org (Postfix, from userid 538) id 1460514B34; Wed, 3 Apr 2019 07:28:54 +0000 (UTC) Delivered-To: src-committers@localmail.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client CN "mx1.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by freefall.freebsd.org (Postfix) with ESMTPS id 0598814B2E; 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 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 Precedence: bulk X-Loop: FreeBSD.org Sender: owner-src-committers@freebsd.org X-Rspamd-Queue-Id: 5689D979BA 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.991,0]; REPLY(-4.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000,0] Status: O X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.29 List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Date: Tue, 03 Sep 2019 14:06:08 -0000 X-Original-Date: Wed, 3 Apr 2019 00:28:45 -0700 (PDT) X-List-Received-Date: Tue, 03 Sep 2019 14:06:08 -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