]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: api - Add cra_type->destroy hook
authorHerbert Xu <herbert@gondor.apana.org.au>
Sun, 9 Mar 2025 02:43:12 +0000 (10:43 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 15 Mar 2025 08:21:22 +0000 (16:21 +0800)
Add a cra_type->destroy hook so that resources can be freed after
the last user of a registered algorithm is gone.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/api.c
crypto/internal.h

index c2c4eb14ef955f0761ea442b399307a44933daa5..91957bb52f3fc5ee3e8cdfc9ff87b618ab45d49d 100644 (file)
@@ -707,5 +707,15 @@ void crypto_req_done(void *data, int err)
 }
 EXPORT_SYMBOL_GPL(crypto_req_done);
 
+void crypto_destroy_alg(struct crypto_alg *alg)
+{
+       if (alg->cra_type && alg->cra_type->destroy)
+               alg->cra_type->destroy(alg);
+
+       if (alg->cra_destroy)
+               alg->cra_destroy(alg);
+}
+EXPORT_SYMBOL_GPL(crypto_destroy_alg);
+
 MODULE_DESCRIPTION("Cryptographic core API");
 MODULE_LICENSE("GPL");
index 08d43b40e7db1f99ba6bb91aebbf79cd7a3303a1..11567ea24fc337388412fb91f20481dc4f03b3b4 100644 (file)
@@ -40,6 +40,7 @@ struct crypto_type {
        void (*show)(struct seq_file *m, struct crypto_alg *alg);
        int (*report)(struct sk_buff *skb, struct crypto_alg *alg);
        void (*free)(struct crypto_instance *inst);
+       void (*destroy)(struct crypto_alg *alg);
 
        unsigned int type;
        unsigned int maskclear;
@@ -127,6 +128,7 @@ void *crypto_create_tfm_node(struct crypto_alg *alg,
                        const struct crypto_type *frontend, int node);
 void *crypto_clone_tfm(const struct crypto_type *frontend,
                       struct crypto_tfm *otfm);
+void crypto_destroy_alg(struct crypto_alg *alg);
 
 static inline void *crypto_create_tfm(struct crypto_alg *alg,
                        const struct crypto_type *frontend)
@@ -163,8 +165,8 @@ static inline struct crypto_alg *crypto_alg_get(struct crypto_alg *alg)
 
 static inline void crypto_alg_put(struct crypto_alg *alg)
 {
-       if (refcount_dec_and_test(&alg->cra_refcnt) && alg->cra_destroy)
-               alg->cra_destroy(alg);
+       if (refcount_dec_and_test(&alg->cra_refcnt))
+               crypto_destroy_alg(alg);
 }
 
 static inline int crypto_tmpl_get(struct crypto_template *tmpl)