Revert "crypto: remove CONFIG_CRYPTO_STATS"
[linux-2.6-microblaze.git] / include / crypto / acompress.h
index d042c90..574cffc 100644 (file)
@@ -56,6 +56,35 @@ struct crypto_acomp {
        struct crypto_tfm base;
 };
 
+/*
+ * struct crypto_istat_compress - statistics for compress algorithm
+ * @compress_cnt:      number of compress requests
+ * @compress_tlen:     total data size handled by compress requests
+ * @decompress_cnt:    number of decompress requests
+ * @decompress_tlen:   total data size handled by decompress requests
+ * @err_cnt:           number of error for compress requests
+ */
+struct crypto_istat_compress {
+       atomic64_t compress_cnt;
+       atomic64_t compress_tlen;
+       atomic64_t decompress_cnt;
+       atomic64_t decompress_tlen;
+       atomic64_t err_cnt;
+};
+
+#ifdef CONFIG_CRYPTO_STATS
+#define COMP_ALG_COMMON_STATS struct crypto_istat_compress stat;
+#else
+#define COMP_ALG_COMMON_STATS
+#endif
+
+#define COMP_ALG_COMMON {                      \
+       COMP_ALG_COMMON_STATS                   \
+                                               \
+       struct crypto_alg base;                 \
+}
+struct comp_alg_common COMP_ALG_COMMON;
+
 /**
  * DOC: Asynchronous Compression API
  *
@@ -103,11 +132,23 @@ static inline struct crypto_tfm *crypto_acomp_tfm(struct crypto_acomp *tfm)
        return &tfm->base;
 }
 
+static inline struct comp_alg_common *__crypto_comp_alg_common(
+       struct crypto_alg *alg)
+{
+       return container_of(alg, struct comp_alg_common, base);
+}
+
 static inline struct crypto_acomp *__crypto_acomp_tfm(struct crypto_tfm *tfm)
 {
        return container_of(tfm, struct crypto_acomp, base);
 }
 
+static inline struct comp_alg_common *crypto_comp_alg_common(
+       struct crypto_acomp *tfm)
+{
+       return __crypto_comp_alg_common(crypto_acomp_tfm(tfm)->__crt_alg);
+}
+
 static inline unsigned int crypto_acomp_reqsize(struct crypto_acomp *tfm)
 {
        return tfm->reqsize;
@@ -214,6 +255,27 @@ static inline void acomp_request_set_params(struct acomp_req *req,
                req->flags |= CRYPTO_ACOMP_ALLOC_OUTPUT;
 }
 
+static inline struct crypto_istat_compress *comp_get_stat(
+       struct comp_alg_common *alg)
+{
+#ifdef CONFIG_CRYPTO_STATS
+       return &alg->stat;
+#else
+       return NULL;
+#endif
+}
+
+static inline int crypto_comp_errstat(struct comp_alg_common *alg, int err)
+{
+       if (!IS_ENABLED(CONFIG_CRYPTO_STATS))
+               return err;
+
+       if (err && err != -EINPROGRESS && err != -EBUSY)
+               atomic64_inc(&comp_get_stat(alg)->err_cnt);
+
+       return err;
+}
+
 /**
  * crypto_acomp_compress() -- Invoke asynchronous compress operation
  *
@@ -225,7 +287,19 @@ static inline void acomp_request_set_params(struct acomp_req *req,
  */
 static inline int crypto_acomp_compress(struct acomp_req *req)
 {
-       return crypto_acomp_reqtfm(req)->compress(req);
+       struct crypto_acomp *tfm = crypto_acomp_reqtfm(req);
+       struct comp_alg_common *alg;
+
+       alg = crypto_comp_alg_common(tfm);
+
+       if (IS_ENABLED(CONFIG_CRYPTO_STATS)) {
+               struct crypto_istat_compress *istat = comp_get_stat(alg);
+
+               atomic64_inc(&istat->compress_cnt);
+               atomic64_add(req->slen, &istat->compress_tlen);
+       }
+
+       return crypto_comp_errstat(alg, tfm->compress(req));
 }
 
 /**
@@ -239,7 +313,19 @@ static inline int crypto_acomp_compress(struct acomp_req *req)
  */
 static inline int crypto_acomp_decompress(struct acomp_req *req)
 {
-       return crypto_acomp_reqtfm(req)->decompress(req);
+       struct crypto_acomp *tfm = crypto_acomp_reqtfm(req);
+       struct comp_alg_common *alg;
+
+       alg = crypto_comp_alg_common(tfm);
+
+       if (IS_ENABLED(CONFIG_CRYPTO_STATS)) {
+               struct crypto_istat_compress *istat = comp_get_stat(alg);
+
+               atomic64_inc(&istat->decompress_cnt);
+               atomic64_add(req->slen, &istat->decompress_tlen);
+       }
+
+       return crypto_comp_errstat(alg, tfm->decompress(req));
 }
 
 #endif