Message ID | 20190603054551.6182-1-ebiggers@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Herbert Xu |
Headers | show |
Series | crypto: skcipher - un-inline encrypt and decrypt functions | expand |
On Mon, 3 Jun 2019 at 07:46, Eric Biggers <ebiggers@kernel.org> wrote: > > From: Eric Biggers <ebiggers@google.com> > > crypto_skcipher_encrypt() and crypto_skcipher_decrypt() have grown to be > more than a single indirect function call. They now also check whether > a key has been set, and with CONFIG_CRYPTO_STATS=y they also update the > crypto statistics. That can add up to a lot of bloat at every call > site. Moreover, these always involve a function call anyway, which > greatly limits the benefits of inlining. > > So change them to be non-inline. > > Signed-off-by: Eric Biggers <ebiggers@google.com> Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > --- > crypto/skcipher.c | 34 ++++++++++++++++++++++++++++++++++ > include/crypto/skcipher.h | 32 ++------------------------------ > 2 files changed, 36 insertions(+), 30 deletions(-) > > diff --git a/crypto/skcipher.c b/crypto/skcipher.c > index 2e66f312e2c4f..2828e27d7fbc0 100644 > --- a/crypto/skcipher.c > +++ b/crypto/skcipher.c > @@ -842,6 +842,40 @@ static int skcipher_setkey(struct crypto_skcipher *tfm, const u8 *key, > return 0; > } > > +int crypto_skcipher_encrypt(struct skcipher_request *req) > +{ > + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); > + struct crypto_alg *alg = tfm->base.__crt_alg; > + unsigned int cryptlen = req->cryptlen; > + int ret; > + > + crypto_stats_get(alg); > + if (crypto_skcipher_get_flags(tfm) & CRYPTO_TFM_NEED_KEY) > + ret = -ENOKEY; > + else > + ret = tfm->encrypt(req); > + crypto_stats_skcipher_encrypt(cryptlen, ret, alg); > + return ret; > +} > +EXPORT_SYMBOL_GPL(crypto_skcipher_encrypt); > + > +int crypto_skcipher_decrypt(struct skcipher_request *req) > +{ > + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); > + struct crypto_alg *alg = tfm->base.__crt_alg; > + unsigned int cryptlen = req->cryptlen; > + int ret; > + > + crypto_stats_get(alg); > + if (crypto_skcipher_get_flags(tfm) & CRYPTO_TFM_NEED_KEY) > + ret = -ENOKEY; > + else > + ret = tfm->decrypt(req); > + crypto_stats_skcipher_decrypt(cryptlen, ret, alg); > + return ret; > +} > +EXPORT_SYMBOL_GPL(crypto_skcipher_decrypt); > + > static void crypto_skcipher_exit_tfm(struct crypto_tfm *tfm) > { > struct crypto_skcipher *skcipher = __crypto_skcipher_cast(tfm); > diff --git a/include/crypto/skcipher.h b/include/crypto/skcipher.h > index e555294ed77fe..98547d1f18c53 100644 > --- a/include/crypto/skcipher.h > +++ b/include/crypto/skcipher.h > @@ -484,21 +484,7 @@ static inline struct crypto_sync_skcipher *crypto_sync_skcipher_reqtfm( > * > * Return: 0 if the cipher operation was successful; < 0 if an error occurred > */ > -static inline int crypto_skcipher_encrypt(struct skcipher_request *req) > -{ > - struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); > - struct crypto_alg *alg = tfm->base.__crt_alg; > - unsigned int cryptlen = req->cryptlen; > - int ret; > - > - crypto_stats_get(alg); > - if (crypto_skcipher_get_flags(tfm) & CRYPTO_TFM_NEED_KEY) > - ret = -ENOKEY; > - else > - ret = tfm->encrypt(req); > - crypto_stats_skcipher_encrypt(cryptlen, ret, alg); > - return ret; > -} > +int crypto_skcipher_encrypt(struct skcipher_request *req); > > /** > * crypto_skcipher_decrypt() - decrypt ciphertext > @@ -511,21 +497,7 @@ static inline int crypto_skcipher_encrypt(struct skcipher_request *req) > * > * Return: 0 if the cipher operation was successful; < 0 if an error occurred > */ > -static inline int crypto_skcipher_decrypt(struct skcipher_request *req) > -{ > - struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); > - struct crypto_alg *alg = tfm->base.__crt_alg; > - unsigned int cryptlen = req->cryptlen; > - int ret; > - > - crypto_stats_get(alg); > - if (crypto_skcipher_get_flags(tfm) & CRYPTO_TFM_NEED_KEY) > - ret = -ENOKEY; > - else > - ret = tfm->decrypt(req); > - crypto_stats_skcipher_decrypt(cryptlen, ret, alg); > - return ret; > -} > +int crypto_skcipher_decrypt(struct skcipher_request *req); > > /** > * DOC: Symmetric Key Cipher Request Handle > -- > 2.21.0 >
Eric Biggers <ebiggers@kernel.org> wrote: > From: Eric Biggers <ebiggers@google.com> > > crypto_skcipher_encrypt() and crypto_skcipher_decrypt() have grown to be > more than a single indirect function call. They now also check whether > a key has been set, and with CONFIG_CRYPTO_STATS=y they also update the > crypto statistics. That can add up to a lot of bloat at every call > site. Moreover, these always involve a function call anyway, which > greatly limits the benefits of inlining. > > So change them to be non-inline. > > Signed-off-by: Eric Biggers <ebiggers@google.com> > --- > crypto/skcipher.c | 34 ++++++++++++++++++++++++++++++++++ > include/crypto/skcipher.h | 32 ++------------------------------ > 2 files changed, 36 insertions(+), 30 deletions(-) Patch applied. Thanks.
diff --git a/crypto/skcipher.c b/crypto/skcipher.c index 2e66f312e2c4f..2828e27d7fbc0 100644 --- a/crypto/skcipher.c +++ b/crypto/skcipher.c @@ -842,6 +842,40 @@ static int skcipher_setkey(struct crypto_skcipher *tfm, const u8 *key, return 0; } +int crypto_skcipher_encrypt(struct skcipher_request *req) +{ + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); + struct crypto_alg *alg = tfm->base.__crt_alg; + unsigned int cryptlen = req->cryptlen; + int ret; + + crypto_stats_get(alg); + if (crypto_skcipher_get_flags(tfm) & CRYPTO_TFM_NEED_KEY) + ret = -ENOKEY; + else + ret = tfm->encrypt(req); + crypto_stats_skcipher_encrypt(cryptlen, ret, alg); + return ret; +} +EXPORT_SYMBOL_GPL(crypto_skcipher_encrypt); + +int crypto_skcipher_decrypt(struct skcipher_request *req) +{ + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); + struct crypto_alg *alg = tfm->base.__crt_alg; + unsigned int cryptlen = req->cryptlen; + int ret; + + crypto_stats_get(alg); + if (crypto_skcipher_get_flags(tfm) & CRYPTO_TFM_NEED_KEY) + ret = -ENOKEY; + else + ret = tfm->decrypt(req); + crypto_stats_skcipher_decrypt(cryptlen, ret, alg); + return ret; +} +EXPORT_SYMBOL_GPL(crypto_skcipher_decrypt); + static void crypto_skcipher_exit_tfm(struct crypto_tfm *tfm) { struct crypto_skcipher *skcipher = __crypto_skcipher_cast(tfm); diff --git a/include/crypto/skcipher.h b/include/crypto/skcipher.h index e555294ed77fe..98547d1f18c53 100644 --- a/include/crypto/skcipher.h +++ b/include/crypto/skcipher.h @@ -484,21 +484,7 @@ static inline struct crypto_sync_skcipher *crypto_sync_skcipher_reqtfm( * * Return: 0 if the cipher operation was successful; < 0 if an error occurred */ -static inline int crypto_skcipher_encrypt(struct skcipher_request *req) -{ - struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); - struct crypto_alg *alg = tfm->base.__crt_alg; - unsigned int cryptlen = req->cryptlen; - int ret; - - crypto_stats_get(alg); - if (crypto_skcipher_get_flags(tfm) & CRYPTO_TFM_NEED_KEY) - ret = -ENOKEY; - else - ret = tfm->encrypt(req); - crypto_stats_skcipher_encrypt(cryptlen, ret, alg); - return ret; -} +int crypto_skcipher_encrypt(struct skcipher_request *req); /** * crypto_skcipher_decrypt() - decrypt ciphertext @@ -511,21 +497,7 @@ static inline int crypto_skcipher_encrypt(struct skcipher_request *req) * * Return: 0 if the cipher operation was successful; < 0 if an error occurred */ -static inline int crypto_skcipher_decrypt(struct skcipher_request *req) -{ - struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); - struct crypto_alg *alg = tfm->base.__crt_alg; - unsigned int cryptlen = req->cryptlen; - int ret; - - crypto_stats_get(alg); - if (crypto_skcipher_get_flags(tfm) & CRYPTO_TFM_NEED_KEY) - ret = -ENOKEY; - else - ret = tfm->decrypt(req); - crypto_stats_skcipher_decrypt(cryptlen, ret, alg); - return ret; -} +int crypto_skcipher_decrypt(struct skcipher_request *req); /** * DOC: Symmetric Key Cipher Request Handle