diff options
Diffstat (limited to 'crypto/algapi.c')
| -rw-r--r-- | crypto/algapi.c | 16 | 
1 files changed, 14 insertions, 2 deletions
| diff --git a/crypto/algapi.c b/crypto/algapi.c index 5e7cd603d489..4fe95c448047 100644 --- a/crypto/algapi.c +++ b/crypto/algapi.c @@ -17,6 +17,7 @@  #include <linux/rtnetlink.h>  #include <linux/slab.h>  #include <linux/string.h> +#include <linux/workqueue.h>  #include "internal.h" @@ -74,15 +75,26 @@ static void crypto_free_instance(struct crypto_instance *inst)  	inst->alg.cra_type->free(inst);  } -static void crypto_destroy_instance(struct crypto_alg *alg) +static void crypto_destroy_instance_workfn(struct work_struct *w)  { -	struct crypto_instance *inst = (void *)alg; +	struct crypto_instance *inst = container_of(w, struct crypto_instance, +						    free_work);  	struct crypto_template *tmpl = inst->tmpl;  	crypto_free_instance(inst);  	crypto_tmpl_put(tmpl);  } +static void crypto_destroy_instance(struct crypto_alg *alg) +{ +	struct crypto_instance *inst = container_of(alg, +						    struct crypto_instance, +						    alg); + +	INIT_WORK(&inst->free_work, crypto_destroy_instance_workfn); +	schedule_work(&inst->free_work); +} +  /*   * This function adds a spawn to the list secondary_spawns which   * will be used at the end of crypto_remove_spawns to unregister | 
