opencrypto: Introduce crypto_dispatch_async()
authorMark Johnston <markj@FreeBSD.org>
Mon, 8 Feb 2021 14:19:19 +0000 (09:19 -0500)
committerMark Johnston <markj@FreeBSD.org>
Mon, 8 Feb 2021 14:19:19 +0000 (09:19 -0500)
commit68f6800ce05c386ff045b4416d8595d09c4d8fdd
tree3bbac508acda51d8f5677fbb894bc7c74f8a76e0
parent7509b677b413b9551c15b483ec2ed9ce655d2455
opencrypto: Introduce crypto_dispatch_async()

Currently, OpenCrypto consumers can request asynchronous dispatch by
setting a flag in the cryptop.  (Currently only IPSec may do this.)   I
think this is a bit confusing: we (conditionally) set cryptop flags to
request async dispatch, and then crypto_dispatch() immediately examines
those flags to see if the consumer wants async dispatch. The flag names
are also confusing since they don't specify what "async" applies to:
dispatch or completion.

Add a new KPI, crypto_dispatch_async(), rather than encoding the
requested dispatch type in each cryptop. crypto_dispatch_async() falls
back to crypto_dispatch() if the session's driver provides asynchronous
dispatch. Get rid of CRYPTOP_ASYNC() and CRYPTOP_ASYNC_KEEPORDER().

Similarly, add crypto_dispatch_batch() to request processing of a tailq
of cryptops, rather than encoding the scheduling policy using cryptop
flags.  Convert GELI, the only user of this interface (disabled by
default) to use the new interface.

Add CRYPTO_SESS_SYNC(), which can be used by consumers to determine
whether crypto requests will be dispatched synchronously. This is just
a helper macro. Use it instead of looking at cap flags directly.

Fix style in crypto_done(). Also get rid of CRYPTO_RETW_EMPTY() and
just check the relevant queues directly. This could result in some
unnecessary wakeups but I think it's very uncommon to be using more than
one queue per worker in a given workload, so checking all three queues
is a waste of cycles.

Reviewed by: jhb
Sponsored by: Ampere Computing
Submitted by: Klara, Inc.
MFC after: 2 weeks
Differential Revision: https://reviews.freebsd.org/D28194
share/man/man9/crypto_request.9
sys/geom/eli/g_eli_integrity.c
sys/geom/eli/g_eli_privacy.c
sys/kgssapi/krb5/kcrypto_aes.c
sys/netipsec/xform_ah.c
sys/netipsec/xform_esp.c
sys/opencrypto/crypto.c
sys/opencrypto/cryptodev.h
sys/sys/param.h