Revert "crypto: remove CONFIG_CRYPTO_STATS"
[linux-2.6-microblaze.git] / include / crypto / kpp.h
index 2d9c4de..1988e24 100644 (file)
@@ -51,6 +51,20 @@ struct crypto_kpp {
        struct crypto_tfm base;
 };
 
+/*
+ * struct crypto_istat_kpp - statistics for KPP algorithm
+ * @setsecret_cnt:             number of setsecrey operation
+ * @generate_public_key_cnt:   number of generate_public_key operation
+ * @compute_shared_secret_cnt: number of compute_shared_secret operation
+ * @err_cnt:                   number of error for KPP requests
+ */
+struct crypto_istat_kpp {
+       atomic64_t setsecret_cnt;
+       atomic64_t generate_public_key_cnt;
+       atomic64_t compute_shared_secret_cnt;
+       atomic64_t err_cnt;
+};
+
 /**
  * struct kpp_alg - generic key-agreement protocol primitives
  *
@@ -73,6 +87,7 @@ struct crypto_kpp {
  * @exit:              Undo everything @init did.
  *
  * @base:              Common crypto API algorithm data structure
+ * @stat:              Statistics for KPP algorithm
  */
 struct kpp_alg {
        int (*set_secret)(struct crypto_kpp *tfm, const void *buffer,
@@ -85,6 +100,10 @@ struct kpp_alg {
        int (*init)(struct crypto_kpp *tfm);
        void (*exit)(struct crypto_kpp *tfm);
 
+#ifdef CONFIG_CRYPTO_STATS
+       struct crypto_istat_kpp stat;
+#endif
+
        struct crypto_alg base;
 };
 
@@ -272,6 +291,26 @@ struct kpp_secret {
        unsigned short len;
 };
 
+static inline struct crypto_istat_kpp *kpp_get_stat(struct kpp_alg *alg)
+{
+#ifdef CONFIG_CRYPTO_STATS
+       return &alg->stat;
+#else
+       return NULL;
+#endif
+}
+
+static inline int crypto_kpp_errstat(struct kpp_alg *alg, int err)
+{
+       if (!IS_ENABLED(CONFIG_CRYPTO_STATS))
+               return err;
+
+       if (err && err != -EINPROGRESS && err != -EBUSY)
+               atomic64_inc(&kpp_get_stat(alg)->err_cnt);
+
+       return err;
+}
+
 /**
  * crypto_kpp_set_secret() - Invoke kpp operation
  *
@@ -290,7 +329,12 @@ struct kpp_secret {
 static inline int crypto_kpp_set_secret(struct crypto_kpp *tfm,
                                        const void *buffer, unsigned int len)
 {
-       return crypto_kpp_alg(tfm)->set_secret(tfm, buffer, len);
+       struct kpp_alg *alg = crypto_kpp_alg(tfm);
+
+       if (IS_ENABLED(CONFIG_CRYPTO_STATS))
+               atomic64_inc(&kpp_get_stat(alg)->setsecret_cnt);
+
+       return crypto_kpp_errstat(alg, alg->set_secret(tfm, buffer, len));
 }
 
 /**
@@ -309,8 +353,12 @@ static inline int crypto_kpp_set_secret(struct crypto_kpp *tfm,
 static inline int crypto_kpp_generate_public_key(struct kpp_request *req)
 {
        struct crypto_kpp *tfm = crypto_kpp_reqtfm(req);
+       struct kpp_alg *alg = crypto_kpp_alg(tfm);
+
+       if (IS_ENABLED(CONFIG_CRYPTO_STATS))
+               atomic64_inc(&kpp_get_stat(alg)->generate_public_key_cnt);
 
-       return crypto_kpp_alg(tfm)->generate_public_key(req);
+       return crypto_kpp_errstat(alg, alg->generate_public_key(req));
 }
 
 /**
@@ -326,8 +374,12 @@ static inline int crypto_kpp_generate_public_key(struct kpp_request *req)
 static inline int crypto_kpp_compute_shared_secret(struct kpp_request *req)
 {
        struct crypto_kpp *tfm = crypto_kpp_reqtfm(req);
+       struct kpp_alg *alg = crypto_kpp_alg(tfm);
+
+       if (IS_ENABLED(CONFIG_CRYPTO_STATS))
+               atomic64_inc(&kpp_get_stat(alg)->compute_shared_secret_cnt);
 
-       return crypto_kpp_alg(tfm)->compute_shared_secret(req);
+       return crypto_kpp_errstat(alg, alg->compute_shared_secret(req));
 }
 
 /**