From 6fa5ec5a41184189fd83e8a90f900934a6473469 Mon Sep 17 00:00:00 2001 From: "Jonathan G. Underwood" Date: Tue, 22 Dec 2020 20:04:52 +0000 Subject: [PATCH] cryptsetup: add support for workqueue options This commit adds support for disabling the read and write workqueues with the new crypttab options no-read-workqueue and no-write-workqueue. These correspond to the cryptsetup options --perf-no_read_workqueue and --perf-no_write_workqueue respectively. (cherry picked from commit 227acf0009bde2cd7f8bc371615b05e84137847d) --- man/crypttab.xml | 19 +++++++++++++++++++ src/cryptsetup/cryptsetup.c | 12 ++++++++++++ src/shared/cryptsetup-util.h | 8 ++++++++ 3 files changed, 39 insertions(+) diff --git a/man/crypttab.xml b/man/crypttab.xml index 14bf93a0f7..05192422d4 100644 --- a/man/crypttab.xml +++ b/man/crypttab.xml @@ -277,6 +277,25 @@ + + + + Bypass dm-crypt internal workqueue and process read requests synchronously. The + default is to queue these requests and process them asynchronously. + + This requires kernel 5.9 or newer. + + + + + + Bypass dm-crypt internal workqueue and process write requests synchronously. The + default is to queue these requests and process them asynchronously. + + This requires kernel 5.9 or newer. + + + diff --git a/src/cryptsetup/cryptsetup.c b/src/cryptsetup/cryptsetup.c index 5f9d7bb3bb..129f5fc3f9 100644 --- a/src/cryptsetup/cryptsetup.c +++ b/src/cryptsetup/cryptsetup.c @@ -55,6 +55,8 @@ static bool arg_verify = false; static bool arg_discards = false; static bool arg_same_cpu_crypt = false; static bool arg_submit_from_crypt_cpus = false; +static bool arg_no_read_workqueue = false; +static bool arg_no_write_workqueue = false; static bool arg_tcrypt_hidden = false; static bool arg_tcrypt_system = false; static bool arg_tcrypt_veracrypt = false; @@ -218,6 +220,10 @@ static int parse_one_option(const char *option) { arg_same_cpu_crypt = true; else if (streq(option, "submit-from-crypt-cpus")) arg_submit_from_crypt_cpus = true; + else if (streq(option, "no-read-workqueue")) + arg_no_read_workqueue = true; + else if (streq(option, "no-write-workqueue")) + arg_no_write_workqueue = true; else if (streq(option, "luks")) arg_type = ANY_LUKS; /* since cryptsetup 2.3.0 (Feb 2020) */ @@ -805,6 +811,12 @@ static uint32_t determine_flags(void) { if (arg_submit_from_crypt_cpus) flags |= CRYPT_ACTIVATE_SUBMIT_FROM_CRYPT_CPUS; + if (arg_no_read_workqueue) + flags |= CRYPT_ACTIVATE_NO_READ_WORKQUEUE; + + if (arg_no_write_workqueue) + flags |= CRYPT_ACTIVATE_NO_WRITE_WORKQUEUE; + #ifdef CRYPT_ACTIVATE_SERIALIZE_MEMORY_HARD_PBKDF /* Try to decrease the risk of OOM event if memory hard key derivation function is in use */ /* https://gitlab.com/cryptsetup/cryptsetup/issues/446/ */ diff --git a/src/shared/cryptsetup-util.h b/src/shared/cryptsetup-util.h index b96ffc74e3..e7d885d2aa 100644 --- a/src/shared/cryptsetup-util.h +++ b/src/shared/cryptsetup-util.h @@ -6,6 +6,14 @@ #if HAVE_LIBCRYPTSETUP #include +/* These next two are defined in libcryptsetup.h from cryptsetup version 2.3.4 forwards. */ +#ifndef CRYPT_ACTIVATE_NO_READ_WORKQUEUE +#define CRYPT_ACTIVATE_NO_READ_WORKQUEUE (1 << 24) +#endif +#ifndef CRYPT_ACTIVATE_NO_WRITE_WORKQUEUE +#define CRYPT_ACTIVATE_NO_WRITE_WORKQUEUE (1 << 25) +#endif + extern int (*sym_crypt_activate_by_passphrase)(struct crypt_device *cd, const char *name, int keyslot, const char *passphrase, size_t passphrase_size, uint32_t flags); #if HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY extern int (*sym_crypt_activate_by_signed_key)(struct crypt_device *cd, const char *name, const char *volume_key, size_t volume_key_size, const char *signature, size_t signature_size, uint32_t flags); -- 2.25.1