diff options
Diffstat (limited to 'crypto/tcrypt.c')
| -rw-r--r-- | crypto/tcrypt.c | 179 |
1 files changed, 178 insertions, 1 deletions
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index 49e344f00806..e52f56c5bd5e 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c | |||
| @@ -570,6 +570,122 @@ out: | |||
| 570 | crypto_free_tfm(tfm); | 570 | crypto_free_tfm(tfm); |
| 571 | } | 571 | } |
| 572 | 572 | ||
| 573 | static void test_digest_jiffies(struct crypto_tfm *tfm, char *p, int blen, | ||
| 574 | int plen, char *out, int sec) | ||
| 575 | { | ||
| 576 | struct scatterlist sg[1]; | ||
| 577 | unsigned long start, end; | ||
| 578 | int bcount, pcount; | ||
| 579 | |||
| 580 | for (start = jiffies, end = start + sec * HZ, bcount = 0; | ||
| 581 | time_before(jiffies, end); bcount++) { | ||
| 582 | crypto_digest_init(tfm); | ||
| 583 | for (pcount = 0; pcount < blen; pcount += plen) { | ||
| 584 | sg_set_buf(sg, p + pcount, plen); | ||
| 585 | crypto_digest_update(tfm, sg, 1); | ||
| 586 | } | ||
| 587 | /* we assume there is enough space in 'out' for the result */ | ||
| 588 | crypto_digest_final(tfm, out); | ||
| 589 | } | ||
| 590 | |||
| 591 | printk("%6u opers/sec, %9lu bytes/sec\n", | ||
| 592 | bcount / sec, ((long)bcount * blen) / sec); | ||
| 593 | |||
| 594 | return; | ||
| 595 | } | ||
| 596 | |||
| 597 | static void test_digest_cycles(struct crypto_tfm *tfm, char *p, int blen, | ||
| 598 | int plen, char *out) | ||
| 599 | { | ||
| 600 | struct scatterlist sg[1]; | ||
| 601 | unsigned long cycles = 0; | ||
| 602 | int i, pcount; | ||
| 603 | |||
| 604 | local_bh_disable(); | ||
| 605 | local_irq_disable(); | ||
| 606 | |||
| 607 | /* Warm-up run. */ | ||
| 608 | for (i = 0; i < 4; i++) { | ||
| 609 | crypto_digest_init(tfm); | ||
| 610 | for (pcount = 0; pcount < blen; pcount += plen) { | ||
| 611 | sg_set_buf(sg, p + pcount, plen); | ||
| 612 | crypto_digest_update(tfm, sg, 1); | ||
| 613 | } | ||
| 614 | crypto_digest_final(tfm, out); | ||
| 615 | } | ||
| 616 | |||
| 617 | /* The real thing. */ | ||
| 618 | for (i = 0; i < 8; i++) { | ||
| 619 | cycles_t start, end; | ||
| 620 | |||
| 621 | crypto_digest_init(tfm); | ||
| 622 | |||
| 623 | start = get_cycles(); | ||
| 624 | |||
| 625 | for (pcount = 0; pcount < blen; pcount += plen) { | ||
| 626 | sg_set_buf(sg, p + pcount, plen); | ||
| 627 | crypto_digest_update(tfm, sg, 1); | ||
| 628 | } | ||
| 629 | crypto_digest_final(tfm, out); | ||
| 630 | |||
| 631 | end = get_cycles(); | ||
| 632 | |||
| 633 | cycles += end - start; | ||
| 634 | } | ||
| 635 | |||
| 636 | local_irq_enable(); | ||
| 637 | local_bh_enable(); | ||
| 638 | |||
| 639 | printk("%6lu cycles/operation, %4lu cycles/byte\n", | ||
| 640 | cycles / 8, cycles / (8 * blen)); | ||
| 641 | |||
| 642 | return; | ||
| 643 | } | ||
| 644 | |||
| 645 | static void test_digest_speed(char *algo, unsigned int sec, | ||
| 646 | struct digest_speed *speed) | ||
| 647 | { | ||
| 648 | struct crypto_tfm *tfm; | ||
| 649 | char output[1024]; | ||
| 650 | int i; | ||
| 651 | |||
| 652 | printk("\ntesting speed of %s\n", algo); | ||
| 653 | |||
| 654 | tfm = crypto_alloc_tfm(algo, 0); | ||
| 655 | |||
| 656 | if (tfm == NULL) { | ||
| 657 | printk("failed to load transform for %s\n", algo); | ||
| 658 | return; | ||
| 659 | } | ||
| 660 | |||
| 661 | if (crypto_tfm_alg_digestsize(tfm) > sizeof(output)) { | ||
| 662 | printk("digestsize(%u) > outputbuffer(%zu)\n", | ||
| 663 | crypto_tfm_alg_digestsize(tfm), sizeof(output)); | ||
| 664 | goto out; | ||
| 665 | } | ||
| 666 | |||
| 667 | for (i = 0; speed[i].blen != 0; i++) { | ||
| 668 | if (speed[i].blen > TVMEMSIZE) { | ||
| 669 | printk("template (%u) too big for tvmem (%u)\n", | ||
| 670 | speed[i].blen, TVMEMSIZE); | ||
| 671 | goto out; | ||
| 672 | } | ||
| 673 | |||
| 674 | printk("test%3u (%5u byte blocks,%5u bytes per update,%4u updates): ", | ||
| 675 | i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen); | ||
| 676 | |||
| 677 | memset(tvmem, 0xff, speed[i].blen); | ||
| 678 | |||
| 679 | if (sec) | ||
| 680 | test_digest_jiffies(tfm, tvmem, speed[i].blen, speed[i].plen, output, sec); | ||
| 681 | else | ||
| 682 | test_digest_cycles(tfm, tvmem, speed[i].blen, speed[i].plen, output); | ||
| 683 | } | ||
| 684 | |||
| 685 | out: | ||
| 686 | crypto_free_tfm(tfm); | ||
| 687 | } | ||
| 688 | |||
| 573 | static void test_deflate(void) | 689 | static void test_deflate(void) |
| 574 | { | 690 | { |
| 575 | unsigned int i; | 691 | unsigned int i; |
| @@ -1086,6 +1202,60 @@ static void do_test(void) | |||
| 1086 | des_speed_template); | 1202 | des_speed_template); |
| 1087 | break; | 1203 | break; |
| 1088 | 1204 | ||
| 1205 | case 300: | ||
| 1206 | /* fall through */ | ||
| 1207 | |||
| 1208 | case 301: | ||
| 1209 | test_digest_speed("md4", sec, generic_digest_speed_template); | ||
| 1210 | if (mode > 300 && mode < 400) break; | ||
| 1211 | |||
| 1212 | case 302: | ||
| 1213 | test_digest_speed("md5", sec, generic_digest_speed_template); | ||
| 1214 | if (mode > 300 && mode < 400) break; | ||
| 1215 | |||
| 1216 | case 303: | ||
| 1217 | test_digest_speed("sha1", sec, generic_digest_speed_template); | ||
| 1218 | if (mode > 300 && mode < 400) break; | ||
| 1219 | |||
| 1220 | case 304: | ||
| 1221 | test_digest_speed("sha256", sec, generic_digest_speed_template); | ||
| 1222 | if (mode > 300 && mode < 400) break; | ||
| 1223 | |||
| 1224 | case 305: | ||
| 1225 | test_digest_speed("sha384", sec, generic_digest_speed_template); | ||
| 1226 | if (mode > 300 && mode < 400) break; | ||
| 1227 | |||
| 1228 | case 306: | ||
| 1229 | test_digest_speed("sha512", sec, generic_digest_speed_template); | ||
| 1230 | if (mode > 300 && mode < 400) break; | ||
| 1231 | |||
| 1232 | case 307: | ||
| 1233 | test_digest_speed("wp256", sec, generic_digest_speed_template); | ||
| 1234 | if (mode > 300 && mode < 400) break; | ||
| 1235 | |||
| 1236 | case 308: | ||
| 1237 | test_digest_speed("wp384", sec, generic_digest_speed_template); | ||
| 1238 | if (mode > 300 && mode < 400) break; | ||
| 1239 | |||
| 1240 | case 309: | ||
| 1241 | test_digest_speed("wp512", sec, generic_digest_speed_template); | ||
| 1242 | if (mode > 300 && mode < 400) break; | ||
| 1243 | |||
| 1244 | case 310: | ||
| 1245 | test_digest_speed("tgr128", sec, generic_digest_speed_template); | ||
| 1246 | if (mode > 300 && mode < 400) break; | ||
| 1247 | |||
| 1248 | case 311: | ||
| 1249 | test_digest_speed("tgr160", sec, generic_digest_speed_template); | ||
| 1250 | if (mode > 300 && mode < 400) break; | ||
| 1251 | |||
| 1252 | case 312: | ||
| 1253 | test_digest_speed("tgr192", sec, generic_digest_speed_template); | ||
| 1254 | if (mode > 300 && mode < 400) break; | ||
| 1255 | |||
| 1256 | case 399: | ||
| 1257 | break; | ||
| 1258 | |||
| 1089 | case 1000: | 1259 | case 1000: |
| 1090 | test_available(); | 1260 | test_available(); |
| 1091 | break; | 1261 | break; |
| @@ -1113,7 +1283,14 @@ static int __init init(void) | |||
| 1113 | 1283 | ||
| 1114 | kfree(xbuf); | 1284 | kfree(xbuf); |
| 1115 | kfree(tvmem); | 1285 | kfree(tvmem); |
| 1116 | return 0; | 1286 | |
| 1287 | /* We intentionaly return -EAGAIN to prevent keeping | ||
| 1288 | * the module. It does all its work from init() | ||
| 1289 | * and doesn't offer any runtime functionality | ||
| 1290 | * => we don't need it in the memory, do we? | ||
| 1291 | * -- mludvig | ||
| 1292 | */ | ||
| 1293 | return -EAGAIN; | ||
| 1117 | } | 1294 | } |
| 1118 | 1295 | ||
| 1119 | /* | 1296 | /* |
