2012-01-17 23:34:38

by Mark Brown

[permalink] [raw]
Subject: [PATCH] crypto: Add bulk algorithm registration interface

Hardware crypto engines frequently need to register a selection of
different algorithms with the core. Simplify their code slightly,
especially the error handling, by providing functions to register a
number of algorithms in a single call.

Signed-off-by: Mark Brown <[email protected]>
---
crypto/algapi.c | 35 +++++++++++++++++++++++++++++++++++
include/linux/crypto.h | 2 ++
2 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/crypto/algapi.c b/crypto/algapi.c
index 9d4a9fe..056571b 100644
--- a/crypto/algapi.c
+++ b/crypto/algapi.c
@@ -405,6 +405,41 @@ int crypto_unregister_alg(struct crypto_alg *alg)
}
EXPORT_SYMBOL_GPL(crypto_unregister_alg);

+int crypto_register_algs(struct crypto_alg *algs, int count)
+{
+ int i, ret;
+
+ for (i = 0; i < count; i++) {
+ ret = crypto_register_alg(&algs[i]);
+ if (ret)
+ goto err;
+ }
+
+ return 0;
+
+err:
+ for (--i; i >= 0; --i)
+ crypto_unregister_alg(&algs[i]);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(crypto_register_algs);
+
+int crypto_unregister_algs(struct crypto_alg *algs, int count)
+{
+ int i, ret;
+
+ for (i = 0; i < count; i++) {
+ ret = crypto_unregister_alg(&algs[i]);
+ if (ret)
+ pr_err("Failed to unregister %s %s: %d\n",
+ algs[i].cra_driver_name, algs[i].cra_name, ret);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(crypto_unregister_algs);
+
int crypto_register_template(struct crypto_template *tmpl)
{
struct crypto_template *q;
diff --git a/include/linux/crypto.h b/include/linux/crypto.h
index a8fa654..48ce547 100644
--- a/include/linux/crypto.h
+++ b/include/linux/crypto.h
@@ -314,6 +314,8 @@ struct crypto_alg {
*/
int crypto_register_alg(struct crypto_alg *alg);
int crypto_unregister_alg(struct crypto_alg *alg);
+int crypto_register_algs(struct crypto_alg *algs, int count);
+int crypto_unregister_algs(struct crypto_alg *algs, int count);

/*
* Algorithm query interface.
--
1.7.7.3


2012-01-18 06:33:51

by Jussi Kivilinna

[permalink] [raw]
Subject: Re: [PATCH] crypto: Add bulk algorithm registration interface

Quoting Mark Brown <[email protected]>:

> Hardware crypto engines frequently need to register a selection of
> different algorithms with the core. Simplify their code slightly,
> especially the error handling, by providing functions to register a
> number of algorithms in a single call.
>
> Signed-off-by: Mark Brown <[email protected]>
> ---
> crypto/algapi.c | 35 +++++++++++++++++++++++++++++++++++
> include/linux/crypto.h | 2 ++
> 2 files changed, 37 insertions(+), 0 deletions(-)
>
> diff --git a/crypto/algapi.c b/crypto/algapi.c
> index 9d4a9fe..056571b 100644
> --- a/crypto/algapi.c
> +++ b/crypto/algapi.c
> @@ -405,6 +405,41 @@ int crypto_unregister_alg(struct crypto_alg *alg)
> }
> EXPORT_SYMBOL_GPL(crypto_unregister_alg);
>
> +int crypto_register_algs(struct crypto_alg *algs, int count)
> +{
> + int i, ret;
> +
> + for (i = 0; i < count; i++) {
> + ret = crypto_register_alg(&algs[i]);
> + if (ret)
> + goto err;
> + }
> +
> + return 0;
> +
> +err:
> + for (--i; i >= 0; --i)
> + crypto_unregister_alg(&algs[i]);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(crypto_register_algs);
> +
> +int crypto_unregister_algs(struct crypto_alg *algs, int count)
> +{
> + int i, ret;
> +
> + for (i = 0; i < count; i++) {

Most crypto engines/modules appear to do unregistering in reverse
order, so I think this should too.

And if changed to reverse order, error case in crypto_register_algs
could be replaced with
err:
if (i > 0)
crypto_unregister_algs(algs, i);
return err;

> + ret = crypto_unregister_alg(&algs[i]);
> + if (ret)
> + pr_err("Failed to unregister %s %s: %d\n",
> + algs[i].cra_driver_name, algs[i].cra_name, ret);
> + }
> +
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(crypto_unregister_algs);
> +
> int crypto_register_template(struct crypto_template *tmpl)
> {
> struct crypto_template *q;
> diff --git a/include/linux/crypto.h b/include/linux/crypto.h
> index a8fa654..48ce547 100644
> --- a/include/linux/crypto.h
> +++ b/include/linux/crypto.h
> @@ -314,6 +314,8 @@ struct crypto_alg {
> */
> int crypto_register_alg(struct crypto_alg *alg);
> int crypto_unregister_alg(struct crypto_alg *alg);
> +int crypto_register_algs(struct crypto_alg *algs, int count);
> +int crypto_unregister_algs(struct crypto_alg *algs, int count);
>
> /*
> * Algorithm query interface.
> --
> 1.7.7.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>

2012-01-26 02:37:25

by Herbert Xu

[permalink] [raw]
Subject: Re: [PATCH] crypto: Add bulk algorithm registration interface

On Tue, Jan 17, 2012 at 11:34:26PM +0000, Mark Brown wrote:
> Hardware crypto engines frequently need to register a selection of
> different algorithms with the core. Simplify their code slightly,
> especially the error handling, by providing functions to register a
> number of algorithms in a single call.
>
> Signed-off-by: Mark Brown <[email protected]>

Patch applied. Thanks!
--
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt