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 MFC after: 2 weeks Sponsored by: Axcient Differential Revision: https://reviews.freebsd.org/D25587
This commit is contained in:
parent
bf4c102a45
commit
bd9a5e4721
@ -734,6 +734,7 @@ g_eli_read_metadata_offset(struct g_class *mp, struct g_provider *pp,
|
||||
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;
|
||||
@ -882,6 +883,7 @@ g_eli_create(struct gctl_req *req, struct g_class *mp, struct g_provider *bpp,
|
||||
|
||||
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) {
|
||||
@ -969,6 +971,7 @@ g_eli_create(struct gctl_req *req, struct g_class *mp, struct g_provider *bpp,
|
||||
* 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;
|
||||
LIST_FOREACH(gap, &bpp->aliases, ga_next)
|
||||
|
@ -17,6 +17,7 @@ ATF_TESTS_SH+= kill_test
|
||||
ATF_TESTS_SH+= misc_test
|
||||
ATF_TESTS_SH+= onetime_test
|
||||
ATF_TESTS_SH+= online_resize_test
|
||||
ATF_TESTS_SH+= reentrancy_test
|
||||
ATF_TESTS_SH+= resize_test
|
||||
ATF_TESTS_SH+= setkey_test
|
||||
|
||||
|
69
tests/sys/geom/class/eli/reentrancy_test.sh
Executable file
69
tests/sys/geom/class/eli/reentrancy_test.sh
Executable file
@ -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
|
||||
}
|
Loading…
Reference in New Issue
Block a user