Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Jul 2020 18:19:25 +0000 (UTC)
From:      Alan Somers <asomers@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r363486 - in stable/12: sys/geom/eli tests/sys/geom/class/eli
Message-ID:  <202007241819.06OIJPBT007115@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: asomers
Date: Fri Jul 24 18:19:25 2020
New Revision: 363486
URL: https://svnweb.freebsd.org/changeset/base/363486

Log:
  MFC r363014:
  
  geli: enable direct dispatch
  
  geli does all of its crypto operations in a separate thread pool, so
  g_eli_start, g_eli_read_done, and g_eli_write_done don't actually do very
  much work. Enabling direct dispatch eliminates the g_up/g_down bottlenecks,
  doubling IOPs on my system. This change does not affect the thread pool.
  
  Reviewed by:	markj
  Sponsored by:	Axcient
  Differential Revision:	https://reviews.freebsd.org/D25587

Added:
  stable/12/tests/sys/geom/class/eli/reentrancy_test.sh
     - copied unchanged from r363014, head/tests/sys/geom/class/eli/reentrancy_test.sh
Modified:
  stable/12/sys/geom/eli/g_eli.c
  stable/12/tests/sys/geom/class/eli/Makefile
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/geom/eli/g_eli.c
==============================================================================
--- stable/12/sys/geom/eli/g_eli.c	Fri Jul 24 17:56:17 2020	(r363485)
+++ stable/12/sys/geom/eli/g_eli.c	Fri Jul 24 18:19:25 2020	(r363486)
@@ -642,6 +642,7 @@ g_eli_read_metadata(struct g_class *mp, struct g_provi
 	gp->orphan = g_eli_orphan_spoil_assert;
 	gp->spoiled = g_eli_orphan_spoil_assert;
 	cp = g_new_consumer(gp);
+	cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE;
 	error = g_attach(cp, pp);
 	if (error != 0)
 		goto end;
@@ -778,6 +779,7 @@ g_eli_create(struct gctl_req *req, struct g_class *mp,
 
 	pp = NULL;
 	cp = g_new_consumer(gp);
+	cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE;
 	error = g_attach(cp, bpp);
 	if (error != 0) {
 		if (req != NULL) {
@@ -865,6 +867,7 @@ g_eli_create(struct gctl_req *req, struct g_class *mp,
 	 * Create decrypted provider.
 	 */
 	pp = g_new_providerf(gp, "%s%s", bpp->name, G_ELI_SUFFIX);
+	pp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE;
 	pp->mediasize = sc->sc_mediasize;
 	pp->sectorsize = sc->sc_sectorsize;
 

Modified: stable/12/tests/sys/geom/class/eli/Makefile
==============================================================================
--- stable/12/tests/sys/geom/class/eli/Makefile	Fri Jul 24 17:56:17 2020	(r363485)
+++ stable/12/tests/sys/geom/class/eli/Makefile	Fri Jul 24 18:19:25 2020	(r363486)
@@ -16,6 +16,7 @@ ATF_TESTS_SH+=	integrity_test
 ATF_TESTS_SH+=	kill_test
 ATF_TESTS_SH+=	misc_test
 ATF_TESTS_SH+=	onetime_test
+ATF_TESTS_SH+=	reentrancy_test
 ATF_TESTS_SH+=	resize_test
 ATF_TESTS_SH+=	setkey_test
 

Copied: stable/12/tests/sys/geom/class/eli/reentrancy_test.sh (from r363014, head/tests/sys/geom/class/eli/reentrancy_test.sh)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/tests/sys/geom/class/eli/reentrancy_test.sh	Fri Jul 24 18:19:25 2020	(r363486, copy of r363014, head/tests/sys/geom/class/eli/reentrancy_test.sh)
@@ -0,0 +1,69 @@
+# $FreeBSD$
+
+# Test various operations for geli-on-geli providers, to ensure that geli is
+# reentrant.
+
+. $(atf_get_srcdir)/conf.sh
+
+init_test()
+{
+	cipher=$1
+	aalgo=$2
+	secsize=$3
+	ealgo=${cipher%%:*}
+	keylen=${cipher##*:}
+
+	atf_check dd if=/dev/random of=testdata bs=$secsize count=1 status=none
+	atf_check dd if=/dev/random of=keyfile bs=$secsize count=16 status=none
+
+	# Create the lower geli device
+	atf_check -s exit:0 -e ignore \
+		geli init -B none -a $aalgo -e $ealgo -l $keylen -P -K keyfile \
+		-s $secsize ${md}
+	atf_check geli attach -p -k keyfile ${md}
+	# Create the upper geli device
+	atf_check -s exit:0 -e ignore \
+		geli init -B none -a $aalgo -e $ealgo -l $keylen -P -K keyfile \
+		-s $secsize ${md}.eli
+	atf_check geli attach -p -k keyfile ${md}.eli
+	echo ${md} > layered_md_device
+
+	# Ensure we can read and write.
+	atf_check dd if=testdata of=/dev/${md}.eli.eli bs=$secsize count=1 \
+		status=none
+	atf_check dd if=/dev/${md}.eli.eli of=cmpdata bs=$secsize count=1 \
+		status=none
+	atf_check cmp -s testdata cmpdata
+
+	geli detach ${md}.eli 2>/dev/null
+}
+
+atf_test_case init cleanup
+init_head()
+{
+	atf_set "descr" "Initialize a geli provider on top of another"
+	atf_set "require.user" "root"
+	atf_set "timeout" 600
+}
+init_body()
+{
+	sectors=2
+	geli_test_setup
+
+	for_each_geli_config init_test
+}
+init_cleanup()
+{
+	if [ -f layered_md_device ]; then
+		while read provider; do
+			[ -c /dev/${md}.eli.eli ] && \
+				geli detach $md.eli.eli 2>/dev/null
+		done < layered_md_device
+	fi
+	geli_test_cleanup
+}
+
+atf_init_test_cases()
+{
+	atf_add_test_case init
+}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202007241819.06OIJPBT007115>