xref: /freebsd/tools/test/stress2/misc/fpclone.sh (revision 8a272653)
18a272653SPeter Holm#!/bin/sh
28a272653SPeter Holm
38a272653SPeter Holm#
48a272653SPeter Holm# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
58a272653SPeter Holm# All rights reserved.
68a272653SPeter Holm#
78a272653SPeter Holm# Redistribution and use in source and binary forms, with or without
88a272653SPeter Holm# modification, are permitted provided that the following conditions
98a272653SPeter Holm# are met:
108a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright
118a272653SPeter Holm#    notice, this list of conditions and the following disclaimer.
128a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright
138a272653SPeter Holm#    notice, this list of conditions and the following disclaimer in the
148a272653SPeter Holm#    documentation and/or other materials provided with the distribution.
158a272653SPeter Holm#
168a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
178a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
188a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
198a272653SPeter Holm# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
208a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
218a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
228a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
238a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
248a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
258a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
268a272653SPeter Holm# SUCH DAMAGE.
278a272653SPeter Holm#
288a272653SPeter Holm
298a272653SPeter Holm# Test scenario by kib@freebsd.org
308a272653SPeter Holm
318a272653SPeter Holm# Test of patch for Giant trick in cdevsw
328a272653SPeter Holm
338a272653SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
348a272653SPeter Holm[ -d /usr/src/sys ] || exit 0
358a272653SPeter Holmbuilddir=`sysctl kern.version | grep @ | sed 's/.*://'`
368a272653SPeter Holm[ -d "$builddir" ] && export KERNBUILDDIR=$builddir || exit 0
378a272653SPeter Holmexport SYSDIR=`echo $builddir | sed 's#/sys.*#/sys#'`
388a272653SPeter Holmkldstat -v | grep -q pty || { kldload pty || exit 0; }
398a272653SPeter Holm
408a272653SPeter Holm. ../default.cfg
418a272653SPeter Holm
428a272653SPeter Holmodir=`pwd`
438a272653SPeter Holmdir=$RUNDIR/fpclone
448a272653SPeter Holm[ ! -d $dir ] && mkdir -p $dir
458a272653SPeter Holm
468a272653SPeter Holmcd $dir
478a272653SPeter Holmcat > Makefile <<EOF
488a272653SPeter HolmKMOD= fpclone
498a272653SPeter HolmSRCS= fpclone.c
508a272653SPeter Holm
518a272653SPeter Holm.include <bsd.kmod.mk>
528a272653SPeter HolmEOF
538a272653SPeter Holm
548a272653SPeter Holmsed '1,/^EOF2/d' < $odir/$0 > fpclone.c
558a272653SPeter Holmmake
568a272653SPeter Holmkldload $dir/fpclone.ko
578a272653SPeter Holm
588a272653SPeter Holmcd $odir
598a272653SPeter Holmfor i in `jot 10`; do
608a272653SPeter Holm	dd if=/dev/fpclone bs=1m count=10 > /dev/null 2>&1 &
618a272653SPeter Holmdone
628a272653SPeter Holm
638a272653SPeter Holmexport runRUNTIME=2m
648a272653SPeter Holmcd ..; ./run.sh pty.cfg
658a272653SPeter Holm
668a272653SPeter Holmfor i in `jot 10`; do
678a272653SPeter Holm	wait
688a272653SPeter Holmdone
698a272653SPeter Holmkldstat
708a272653SPeter Holmdd if=/dev/fpclone bs=1m count=1k > /dev/null 2>&1 &
718a272653SPeter Holmkldunload $dir/fpclone.ko
728a272653SPeter Holmrm -rf $dir
738a272653SPeter Holmexit
748a272653SPeter Holm
758a272653SPeter HolmEOF2
768a272653SPeter Holm#include <sys/param.h>
778a272653SPeter Holm#include <sys/systm.h>
788a272653SPeter Holm#include <sys/kernel.h>
798a272653SPeter Holm#include <sys/module.h>
808a272653SPeter Holm#include <sys/mutex.h>
818a272653SPeter Holm#include <sys/conf.h>
828a272653SPeter Holm#include <sys/uio.h>
838a272653SPeter Holm#include <sys/malloc.h>
848a272653SPeter Holm
858a272653SPeter Holmstatic d_open_t		fpclone_open;
868a272653SPeter Holmstatic d_close_t	fpclone_close;
878a272653SPeter Holmstatic d_read_t		fpclone_read;
888a272653SPeter Holm
898a272653SPeter Holmstatic struct cdevsw fpclone_cdevsw = {
908a272653SPeter Holm	.d_open =	fpclone_open,
918a272653SPeter Holm	.d_close =	fpclone_close,
928a272653SPeter Holm	.d_read =	fpclone_read,
938a272653SPeter Holm	.d_name =	"fpclone",
948a272653SPeter Holm	.d_version =	D_VERSION,
958a272653SPeter Holm	.d_flags =	D_TRACKCLOSE
968a272653SPeter Holm};
978a272653SPeter Holm
988a272653SPeter HolmMALLOC_DEFINE(M_FPCLONESC, "fpclone memory", "fpclone memory");
998a272653SPeter Holm
1008a272653SPeter Holmstruct fpclone_sc
1018a272653SPeter Holm{
1028a272653SPeter Holm	int pos;
1038a272653SPeter Holm};
1048a272653SPeter Holm
1058a272653SPeter Holmstatic struct cdev *fpclone_dev;
1068a272653SPeter Holmstatic struct mtx me;
1078a272653SPeter Holm
1088a272653SPeter Holmstatic void
1098a272653SPeter Holmfpclone_cdevpriv_dtr(void *data)
1108a272653SPeter Holm{
1118a272653SPeter Holm	free(data, M_FPCLONESC);
1128a272653SPeter Holm}
1138a272653SPeter Holm
1148a272653SPeter Holmstatic int
1158a272653SPeter Holmfpclone_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
1168a272653SPeter Holm{
1178a272653SPeter Holm	struct fpclone_sc *sc;
1188a272653SPeter Holm	int error;
1198a272653SPeter Holm
1208a272653SPeter Holm	sc = malloc(sizeof(struct fpclone_sc), M_FPCLONESC,
1218a272653SPeter Holm	         M_WAITOK | M_ZERO);
1228a272653SPeter Holm	error = devfs_set_cdevpriv(sc, fpclone_cdevpriv_dtr);
1238a272653SPeter Holm	if (error)
1248a272653SPeter Holm		fpclone_cdevpriv_dtr(sc);
1258a272653SPeter Holm	return (error);
1268a272653SPeter Holm}
1278a272653SPeter Holm
1288a272653SPeter Holmstatic int
1298a272653SPeter Holmfpclone_close(struct cdev *dev, int fflag, int devtype, struct thread *td)
1308a272653SPeter Holm{
1318a272653SPeter Holm
1328a272653SPeter Holm	devfs_clear_cdevpriv();
1338a272653SPeter Holm	return (0);
1348a272653SPeter Holm}
1358a272653SPeter Holm
1368a272653SPeter Holmstatic char rdata[] = "fpclone sample data string\n";
1378a272653SPeter Holm
1388a272653SPeter Holmstatic int
1398a272653SPeter Holmfpclone_read(struct cdev *dev, struct uio *uio, int ioflag)
1408a272653SPeter Holm{
1418a272653SPeter Holm	struct fpclone_sc *sc;
1428a272653SPeter Holm	int rv, amnt, svpos, error;
1438a272653SPeter Holm
1448a272653SPeter Holm	error = devfs_get_cdevpriv((void **)&sc);
1458a272653SPeter Holm	if (error)
1468a272653SPeter Holm		return (error);
1478a272653SPeter Holm
1488a272653SPeter Holm	rv = 0;
1498a272653SPeter Holm	while (uio->uio_resid > 0) {
1508a272653SPeter Holm		svpos = sc->pos;
1518a272653SPeter Holm		amnt = MIN(uio->uio_resid, sizeof(rdata) - svpos);
1528a272653SPeter Holm		rv = uiomove(rdata + svpos, amnt, uio);
1538a272653SPeter Holm		if (rv != 0)
1548a272653SPeter Holm			break;
1558a272653SPeter Holm		mtx_lock(&me);
1568a272653SPeter Holm		sc->pos += amnt;
1578a272653SPeter Holm		sc->pos %= sizeof(rdata);
1588a272653SPeter Holm		mtx_unlock(&me);
1598a272653SPeter Holm	}
1608a272653SPeter Holm	return (rv);
1618a272653SPeter Holm}
1628a272653SPeter Holm
1638a272653SPeter Holmstatic int
1648a272653SPeter Holmfpclone_modevent(module_t mod, int what, void *arg)
1658a272653SPeter Holm{
1668a272653SPeter Holm	switch (what) {
1678a272653SPeter Holm        case MOD_LOAD:
1688a272653SPeter Holm		mtx_init(&me, "fp_ref", NULL, MTX_DEF);
1698a272653SPeter Holm		fpclone_dev = make_dev(&fpclone_cdevsw, 0, 0, 0, 0666,
1708a272653SPeter Holm		    "fpclone");
1718a272653SPeter Holm		return(0);
1728a272653SPeter Holm
1738a272653SPeter Holm        case MOD_UNLOAD:
1748a272653SPeter Holm		destroy_dev(fpclone_dev);
1758a272653SPeter Holm		mtx_destroy(&me);
1768a272653SPeter Holm		return (0);
1778a272653SPeter Holm
1788a272653SPeter Holm        default:
1798a272653SPeter Holm		break;
1808a272653SPeter Holm	}
1818a272653SPeter Holm
1828a272653SPeter Holm	return (0);
1838a272653SPeter Holm}
1848a272653SPeter Holm
1858a272653SPeter Holmmoduledata_t fpclone_mdata = {
1868a272653SPeter Holm	"fpclone",
1878a272653SPeter Holm	fpclone_modevent,
1888a272653SPeter Holm	NULL
1898a272653SPeter Holm};
1908a272653SPeter Holm
1918a272653SPeter HolmDECLARE_MODULE(fpclone, fpclone_mdata, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
1928a272653SPeter HolmMODULE_VERSION(fpclone, 1);
193