-static void test_digest_jiffies(struct crypto_tfm *tfm, char *p, int blen,
- int plen, char *out, int sec)
-{
- struct scatterlist sg[1];
- unsigned long start, end;
- int bcount, pcount;
-
- for (start = jiffies, end = start + sec * HZ, bcount = 0;
- time_before(jiffies, end); bcount++) {
- crypto_digest_init(tfm);
- for (pcount = 0; pcount < blen; pcount += plen) {
- sg_set_buf(sg, p + pcount, plen);
- crypto_digest_update(tfm, sg, 1);
- }
- /* we assume there is enough space in 'out' for the result */
- crypto_digest_final(tfm, out);
- }
-
- printk("%6u opers/sec, %9lu bytes/sec\n",
- bcount / sec, ((long)bcount * blen) / sec);
-
- return;
-}
-
-static void test_digest_cycles(struct crypto_tfm *tfm, char *p, int blen,
- int plen, char *out)
-{
- struct scatterlist sg[1];
- unsigned long cycles = 0;
- int i, pcount;
-
- local_bh_disable();
- local_irq_disable();
-
- /* Warm-up run. */
- for (i = 0; i < 4; i++) {
- crypto_digest_init(tfm);
- for (pcount = 0; pcount < blen; pcount += plen) {
- sg_set_buf(sg, p + pcount, plen);
- crypto_digest_update(tfm, sg, 1);
- }
- crypto_digest_final(tfm, out);
- }
-
- /* The real thing. */
- for (i = 0; i < 8; i++) {
- cycles_t start, end;
-
- crypto_digest_init(tfm);
-
- start = get_cycles();
-
- for (pcount = 0; pcount < blen; pcount += plen) {
- sg_set_buf(sg, p + pcount, plen);
- crypto_digest_update(tfm, sg, 1);
- }
- crypto_digest_final(tfm, out);
-
- end = get_cycles();
-
- cycles += end - start;
- }
-
- local_irq_enable();
- local_bh_enable();
-
- printk("%6lu cycles/operation, %4lu cycles/byte\n",
- cycles / 8, cycles / (8 * blen));
-
- return;
-}
-
-static void test_digest_speed(char *algo, unsigned int sec,
- struct digest_speed *speed)
-{
- struct crypto_tfm *tfm;
- char output[1024];
- int i;
-
- printk("\ntesting speed of %s\n", algo);
-
- tfm = crypto_alloc_tfm(algo, 0);
-
- if (tfm == NULL) {
- printk("failed to load transform for %s\n", algo);
- return;
- }
-
- if (crypto_tfm_alg_digestsize(tfm) > sizeof(output)) {
- printk("digestsize(%u) > outputbuffer(%zu)\n",
- crypto_tfm_alg_digestsize(tfm), sizeof(output));
- goto out;
- }
-
- for (i = 0; speed[i].blen != 0; i++) {
- if (speed[i].blen > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n",
- speed[i].blen, TVMEMSIZE);
- goto out;
- }
-
- printk("test%3u (%5u byte blocks,%5u bytes per update,%4u updates): ",
- i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
-
- memset(tvmem, 0xff, speed[i].blen);
-
- if (sec)
- test_digest_jiffies(tfm, tvmem, speed[i].blen, speed[i].plen, output, sec);
- else
- test_digest_cycles(tfm, tvmem, speed[i].blen, speed[i].plen, output);
- }
-
-out:
- crypto_free_tfm(tfm);
-}
-