Page MenuHomeFreeBSD

D30949.id92829.diff
No OneTemporary

D30949.id92829.diff

diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist
--- a/etc/mtree/BSD.tests.dist
+++ b/etc/mtree/BSD.tests.dist
@@ -860,6 +860,8 @@
..
posixshm
..
+ racct
+ ..
sys
..
vfs
diff --git a/tests/sys/Makefile b/tests/sys/Makefile
--- a/tests/sys/Makefile
+++ b/tests/sys/Makefile
@@ -28,6 +28,7 @@
TESTS_SUBDIRS+= netpfil
TESTS_SUBDIRS+= opencrypto
TESTS_SUBDIRS+= posixshm
+TESTS_SUBDIRS+= racct
TESTS_SUBDIRS+= sys
TESTS_SUBDIRS+= vfs
TESTS_SUBDIRS+= vm
diff --git a/tests/sys/racct/Makefile b/tests/sys/racct/Makefile
new file mode 100644
--- /dev/null
+++ b/tests/sys/racct/Makefile
@@ -0,0 +1,16 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/sys/racct
+
+BINDIR= ${TESTSDIR}
+
+ATF_TESTS_SH+= racct_jail_shm \
+ racct_jail_cpu \
+ racct_jail_proc
+
+PROGS+= loop \
+ manyforks
+
+${PACKAGE}FILES+= utils.subr
+
+.include <bsd.test.mk>
diff --git a/tests/sys/racct/loop.c b/tests/sys/racct/loop.c
new file mode 100644
--- /dev/null
+++ b/tests/sys/racct/loop.c
@@ -0,0 +1,43 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2021 The FreeBSD Foundation
+ *
+ * This software was developed by Cyril Zhang under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/time.h>
+#include <stdlib.h>
+
+int
+main()
+{
+ struct timeval zero = { 0, 0 };
+ struct timeval three = { 3, 0 };
+ struct itimerval timer = { zero, three };
+ setitimer(ITIMER_REAL, &timer, NULL);
+ for (;;)
+ system("true");
+}
diff --git a/tests/sys/racct/manyforks.c b/tests/sys/racct/manyforks.c
new file mode 100644
--- /dev/null
+++ b/tests/sys/racct/manyforks.c
@@ -0,0 +1,61 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2021 The FreeBSD Foundation
+ *
+ * This software was developed by Cyril Zhang under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+
+static void
+fork_and_handle(int fail)
+{
+ pid_t pid = fork();
+ if (pid == 0) {
+ usleep(2000000);
+ exit(0);
+ }
+ else if (fail) {
+ exit(!(pid == -1));
+ }
+ else if (pid == -1) {
+ exit(1);
+ }
+}
+
+int
+main()
+{
+ /*
+ * Fork 5 times successfully,
+ * 1 time unsuccessfully.
+ */
+ for (int i = 0; i < 5; ++i) {
+ fork_and_handle(0);
+ }
+ fork_and_handle(1);
+}
diff --git a/tests/sys/racct/racct_jail_cpu.sh b/tests/sys/racct/racct_jail_cpu.sh
new file mode 100644
--- /dev/null
+++ b/tests/sys/racct/racct_jail_cpu.sh
@@ -0,0 +1,66 @@
+#-
+# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+#
+# Copyright (c) 2021 The FreeBSD Foundation
+#
+# This software was developed by Cyril Zhang under sponsorship from
+# the FreeBSD Foundation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+. $(atf_get_srcdir)/utils.subr
+
+atf_test_case racct_cpu cleanup
+racct_cpu_head()
+{
+ atf_set "descr" "Tests pcpu and cputime for a jail racct."
+ atf_set "require.user" "root"
+}
+racct_cpu_body()
+{
+ # This test checks pctcpu and cputime at once,
+ # in order to avoid running the 3s loop twice.
+ racct_mkjail myjail
+ jexec myjail $(atf_get_srcdir)/loop &
+ sleep 2
+ pcpu=$(rctl -u jail:myjail | grep "pcpu" | sed 's/.*=//')
+ sleep 2
+ cputime=$(rctl -u jail:myjail | grep "cputime" | sed 's/.*=//')
+ # We'll give a very large tolerance for pcpu,
+ # due to the decay factor involved in its calculation.
+ # cputime may be rounded down to 2 but should
+ # not exceed 3.
+ if [ $cputime -lt 2 ] || [ $cputime -gt 3 ] || [ $pcpu -lt 60 ] || [ $pcpu -gt 140 ]; then
+ atf_fail "expected pcpu: ~100, actual: $pcpu | expected cputime: ~3, actual: $cputime"
+ fi
+
+}
+racct_cpu_cleanup()
+{
+ racct_cleanup
+}
+
+atf_init_test_cases()
+{
+ atf_add_test_case racct_cpu
+}
diff --git a/tests/sys/racct/racct_jail_proc.sh b/tests/sys/racct/racct_jail_proc.sh
new file mode 100644
--- /dev/null
+++ b/tests/sys/racct/racct_jail_proc.sh
@@ -0,0 +1,55 @@
+#-
+# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+#
+# Copyright (c) 2021 The FreeBSD Foundation
+#
+# This software was developed by Cyril Zhang under sponsorship from
+# the FreeBSD Foundation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+. $(atf_get_srcdir)/utils.subr
+
+atf_test_case racct_max_proc cleanup
+racct_max_proc_head()
+{
+ atf_set "descr" "Tests maxproc for a jail racct."
+ atf_set "require.user" "root"
+}
+racct_max_proc_body()
+{
+ racct_mkjail myjail
+ rctl -a "jail:myjail:maxproc:deny=5"
+
+ atf_check -s exit:0 "$(atf_get_srcdir)/manyforks"
+}
+racct_max_proc_cleanup()
+{
+ rctl -r "jail:myjail:maxproc:deny=5"
+ racct_cleanup
+}
+
+atf_init_test_cases()
+{
+ atf_add_test_case racct_max_proc
+}
diff --git a/tests/sys/racct/racct_jail_shm.sh b/tests/sys/racct/racct_jail_shm.sh
new file mode 100644
--- /dev/null
+++ b/tests/sys/racct/racct_jail_shm.sh
@@ -0,0 +1,158 @@
+#-
+# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+#
+# Copyright (c) 2021 The FreeBSD Foundation
+#
+# This software was developed by Cyril Zhang under sponsorship from
+# the FreeBSD Foundation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+. $(atf_get_srcdir)/utils.subr
+
+atf_test_case racct_shm_count cleanup
+racct_shm_count_head()
+{
+ atf_set "descr" "Tests nshm for a jail racct."
+ atf_set "require.user" "root"
+}
+racct_shm_count_body()
+{
+ racct_mkjail myjail
+ rctl -a "jail:myjail:nshm:deny=20"
+
+ racct_make_objects myjail 20
+ racct_make_forbidden_object myjail 21
+ racct_remove_objects myjail 20
+ racct_make_objects myjail 20
+ racct_make_forbidden_object myjail 21
+}
+racct_shm_count_cleanup()
+{
+ rctl -r "jail:myjail:nshm:deny=20"
+ # This is due to a bug in posix shared memory objects, and
+ # is subject for removal.
+ # Removing the shared memory objects should not be necessary.
+ racct_remove_objects myjail 21
+ racct_cleanup
+}
+
+atf_test_case racct_shm_size cleanup
+racct_shm_size_head()
+{
+ atf_set "descr" "Tests shmsize for a jail racct."
+ atf_set "require.user" "root"
+}
+racct_shm_size_body()
+{
+ racct_mkjail myjail
+ rctl -a "jail:myjail:shmsize:deny=10000"
+
+ racct_make_objects myjail 20
+ racct_truncate_objects myjail 19 512
+ racct_truncate_forbidden_object myjail 20 512
+ racct_truncate_objects myjail 19 0
+ racct_truncate_objects myjail 19 512
+ racct_truncate_forbidden_object myjail 20 512
+}
+racct_shm_size_cleanup()
+{
+ rctl -r "jail:myjail:shmsize:deny=10000"
+ # This is due to a bug in posix shared memory objects, and
+ # is subject for removal.
+ # Removing the shared memory objects should not be necessary.
+ racct_remove_objects myjail 20
+ racct_cleanup
+}
+
+racct_mkjail()
+{
+ jailname=$1
+ jail -c name=${jailname} persist
+ echo $jailname >> created_jails.lst
+}
+racct_cleanup()
+{
+ if [ -f created_jails.lst ]
+ then
+ for jailname in `cat created_jails.lst`
+ do
+ jail -r ${jailname}
+ done
+ rm created_jails.lst
+ fi
+}
+
+racct_make_objects()
+{
+ local jailname max
+ jailname=$1
+ max=$2
+ for i in $(seq 1 $max); do
+ atf_check -s exit:0 jexec "$jailname" posixshmcontrol create "/$jailname$i"
+ done
+}
+
+racct_make_forbidden_object()
+{
+ local jailname i
+ jailname=$1
+ i=$2
+ atf_check -s exit:1 -e ignore jexec "$jailname" posixshmcontrol create "/$jailname$i"
+}
+
+racct_truncate_objects()
+{
+ local jailname max size
+ jailname=$1
+ max=$2
+ size=$3
+ for i in $(seq 1 $max); do
+ atf_check -s exit:0 jexec "$jailname" posixshmcontrol truncate -s "$size" "/$jailname$i"
+ done
+}
+
+racct_truncate_forbidden_object()
+{
+ local jailname i size
+ jailname=$1
+ i=$2
+ size=$3
+ atf_check -s exit:1 -e ignore jexec "$jailname" posixshmcontrol truncate -s "$size" "/$jailname$i"
+}
+
+racct_remove_objects()
+{
+ local jailname max
+ jailname=$1
+ max=$2
+ for i in $(seq 1 $max); do
+ jexec $jailname posixshmcontrol rm "/$jailname$i"
+ done
+}
+
+atf_init_test_cases()
+{
+ atf_add_test_case racct_shm_count
+ atf_add_test_case racct_shm_size
+}
diff --git a/tests/sys/racct/utils.subr b/tests/sys/racct/utils.subr
new file mode 100644
--- /dev/null
+++ b/tests/sys/racct/utils.subr
@@ -0,0 +1,47 @@
+#-
+# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+#
+# Copyright (c) 2021 The FreeBSD Foundation
+#
+# This software was developed by Cyril Zhang under sponsorship from
+# the FreeBSD Foundation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+racct_mkjail()
+{
+ jailname=$1
+ jail -c name=${jailname} persist
+ echo $jailname >> created_jails.lst
+}
+racct_cleanup()
+{
+ if [ -f created_jails.lst ]
+ then
+ for jailname in `cat created_jails.lst`
+ do
+ jail -r ${jailname}
+ done
+ rm created_jails.lst
+ fi
+}

File Metadata

Mime Type
text/plain
Expires
Thu, Aug 27, 11:41 AM (26 m, 55 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37322364
Default Alt Text
D30949.id92829.diff (15 KB)

Event Timeline