diff options
author | Gilad Ben-Yossef <gilad@benyossef.com> | 2017-10-18 03:00:48 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2017-11-03 10:11:22 -0400 |
commit | 646710419a978c6f82342a2ad5eb28adb5f47bc4 (patch) | |
tree | 8a8748f5ffc6383827e4bd1e3fb1c105e26fbd9e /crypto/tcrypt.c | |
parent | 46f1414c8a92d85b4391bc324dd58eace8c48837 (diff) |
crypto: tcrypt - move to generic async completion
tcrypt starts several async crypto ops and waits for their completions.
Move it over to generic code doing the same.
Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/tcrypt.c')
-rw-r--r-- | crypto/tcrypt.c | 84 |
1 files changed, 25 insertions, 59 deletions
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index 65d191b27ecc..9267cbdb14d2 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c | |||
@@ -79,34 +79,11 @@ static char *check[] = { | |||
79 | NULL | 79 | NULL |
80 | }; | 80 | }; |
81 | 81 | ||
82 | struct tcrypt_result { | ||
83 | struct completion completion; | ||
84 | int err; | ||
85 | }; | ||
86 | |||
87 | static void tcrypt_complete(struct crypto_async_request *req, int err) | ||
88 | { | ||
89 | struct tcrypt_result *res = req->data; | ||
90 | |||
91 | if (err == -EINPROGRESS) | ||
92 | return; | ||
93 | |||
94 | res->err = err; | ||
95 | complete(&res->completion); | ||
96 | } | ||
97 | |||
98 | static inline int do_one_aead_op(struct aead_request *req, int ret) | 82 | static inline int do_one_aead_op(struct aead_request *req, int ret) |
99 | { | 83 | { |
100 | if (ret == -EINPROGRESS || ret == -EBUSY) { | 84 | struct crypto_wait *wait = req->base.data; |
101 | struct tcrypt_result *tr = req->base.data; | ||
102 | 85 | ||
103 | ret = wait_for_completion_interruptible(&tr->completion); | 86 | return crypto_wait_req(ret, wait); |
104 | if (!ret) | ||
105 | ret = tr->err; | ||
106 | reinit_completion(&tr->completion); | ||
107 | } | ||
108 | |||
109 | return ret; | ||
110 | } | 87 | } |
111 | 88 | ||
112 | static int test_aead_jiffies(struct aead_request *req, int enc, | 89 | static int test_aead_jiffies(struct aead_request *req, int enc, |
@@ -248,7 +225,7 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs, | |||
248 | char *axbuf[XBUFSIZE]; | 225 | char *axbuf[XBUFSIZE]; |
249 | unsigned int *b_size; | 226 | unsigned int *b_size; |
250 | unsigned int iv_len; | 227 | unsigned int iv_len; |
251 | struct tcrypt_result result; | 228 | struct crypto_wait wait; |
252 | 229 | ||
253 | iv = kzalloc(MAX_IVLEN, GFP_KERNEL); | 230 | iv = kzalloc(MAX_IVLEN, GFP_KERNEL); |
254 | if (!iv) | 231 | if (!iv) |
@@ -284,7 +261,7 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs, | |||
284 | goto out_notfm; | 261 | goto out_notfm; |
285 | } | 262 | } |
286 | 263 | ||
287 | init_completion(&result.completion); | 264 | crypto_init_wait(&wait); |
288 | printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo, | 265 | printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo, |
289 | get_driver_name(crypto_aead, tfm), e); | 266 | get_driver_name(crypto_aead, tfm), e); |
290 | 267 | ||
@@ -296,7 +273,7 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs, | |||
296 | } | 273 | } |
297 | 274 | ||
298 | aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, | 275 | aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, |
299 | tcrypt_complete, &result); | 276 | crypto_req_done, &wait); |
300 | 277 | ||
301 | i = 0; | 278 | i = 0; |
302 | do { | 279 | do { |
@@ -398,21 +375,16 @@ static void test_hash_sg_init(struct scatterlist *sg) | |||
398 | 375 | ||
399 | static inline int do_one_ahash_op(struct ahash_request *req, int ret) | 376 | static inline int do_one_ahash_op(struct ahash_request *req, int ret) |
400 | { | 377 | { |
401 | if (ret == -EINPROGRESS || ret == -EBUSY) { | 378 | struct crypto_wait *wait = req->base.data; |
402 | struct tcrypt_result *tr = req->base.data; | ||
403 | 379 | ||
404 | wait_for_completion(&tr->completion); | 380 | return crypto_wait_req(ret, wait); |
405 | reinit_completion(&tr->completion); | ||
406 | ret = tr->err; | ||
407 | } | ||
408 | return ret; | ||
409 | } | 381 | } |
410 | 382 | ||
411 | struct test_mb_ahash_data { | 383 | struct test_mb_ahash_data { |
412 | struct scatterlist sg[TVMEMSIZE]; | 384 | struct scatterlist sg[TVMEMSIZE]; |
413 | char result[64]; | 385 | char result[64]; |
414 | struct ahash_request *req; | 386 | struct ahash_request *req; |
415 | struct tcrypt_result tresult; | 387 | struct crypto_wait wait; |
416 | char *xbuf[XBUFSIZE]; | 388 | char *xbuf[XBUFSIZE]; |
417 | }; | 389 | }; |
418 | 390 | ||
@@ -441,7 +413,7 @@ static void test_mb_ahash_speed(const char *algo, unsigned int sec, | |||
441 | if (testmgr_alloc_buf(data[i].xbuf)) | 413 | if (testmgr_alloc_buf(data[i].xbuf)) |
442 | goto out; | 414 | goto out; |
443 | 415 | ||
444 | init_completion(&data[i].tresult.completion); | 416 | crypto_init_wait(&data[i].wait); |
445 | 417 | ||
446 | data[i].req = ahash_request_alloc(tfm, GFP_KERNEL); | 418 | data[i].req = ahash_request_alloc(tfm, GFP_KERNEL); |
447 | if (!data[i].req) { | 419 | if (!data[i].req) { |
@@ -450,8 +422,8 @@ static void test_mb_ahash_speed(const char *algo, unsigned int sec, | |||
450 | goto out; | 422 | goto out; |
451 | } | 423 | } |
452 | 424 | ||
453 | ahash_request_set_callback(data[i].req, 0, | 425 | ahash_request_set_callback(data[i].req, 0, crypto_req_done, |
454 | tcrypt_complete, &data[i].tresult); | 426 | &data[i].wait); |
455 | test_hash_sg_init(data[i].sg); | 427 | test_hash_sg_init(data[i].sg); |
456 | } | 428 | } |
457 | 429 | ||
@@ -493,16 +465,16 @@ static void test_mb_ahash_speed(const char *algo, unsigned int sec, | |||
493 | if (ret) | 465 | if (ret) |
494 | break; | 466 | break; |
495 | 467 | ||
496 | complete(&data[k].tresult.completion); | 468 | crypto_req_done(&data[k].req->base, 0); |
497 | data[k].tresult.err = 0; | ||
498 | } | 469 | } |
499 | 470 | ||
500 | for (j = 0; j < k; j++) { | 471 | for (j = 0; j < k; j++) { |
501 | struct tcrypt_result *tr = &data[j].tresult; | 472 | struct crypto_wait *wait = &data[j].wait; |
473 | int wait_ret; | ||
502 | 474 | ||
503 | wait_for_completion(&tr->completion); | 475 | wait_ret = crypto_wait_req(-EINPROGRESS, wait); |
504 | if (tr->err) | 476 | if (wait_ret) |
505 | ret = tr->err; | 477 | ret = wait_ret; |
506 | } | 478 | } |
507 | 479 | ||
508 | end = get_cycles(); | 480 | end = get_cycles(); |
@@ -680,7 +652,7 @@ static void test_ahash_speed_common(const char *algo, unsigned int secs, | |||
680 | struct hash_speed *speed, unsigned mask) | 652 | struct hash_speed *speed, unsigned mask) |
681 | { | 653 | { |
682 | struct scatterlist sg[TVMEMSIZE]; | 654 | struct scatterlist sg[TVMEMSIZE]; |
683 | struct tcrypt_result tresult; | 655 | struct crypto_wait wait; |
684 | struct ahash_request *req; | 656 | struct ahash_request *req; |
685 | struct crypto_ahash *tfm; | 657 | struct crypto_ahash *tfm; |
686 | char *output; | 658 | char *output; |
@@ -709,9 +681,9 @@ static void test_ahash_speed_common(const char *algo, unsigned int secs, | |||
709 | goto out; | 681 | goto out; |
710 | } | 682 | } |
711 | 683 | ||
712 | init_completion(&tresult.completion); | 684 | crypto_init_wait(&wait); |
713 | ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, | 685 | ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, |
714 | tcrypt_complete, &tresult); | 686 | crypto_req_done, &wait); |
715 | 687 | ||
716 | output = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL); | 688 | output = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL); |
717 | if (!output) | 689 | if (!output) |
@@ -766,15 +738,9 @@ static void test_hash_speed(const char *algo, unsigned int secs, | |||
766 | 738 | ||
767 | static inline int do_one_acipher_op(struct skcipher_request *req, int ret) | 739 | static inline int do_one_acipher_op(struct skcipher_request *req, int ret) |
768 | { | 740 | { |
769 | if (ret == -EINPROGRESS || ret == -EBUSY) { | 741 | struct crypto_wait *wait = req->base.data; |
770 | struct tcrypt_result *tr = req->base.data; | ||
771 | |||
772 | wait_for_completion(&tr->completion); | ||
773 | reinit_completion(&tr->completion); | ||
774 | ret = tr->err; | ||
775 | } | ||
776 | 742 | ||
777 | return ret; | 743 | return crypto_wait_req(ret, wait); |
778 | } | 744 | } |
779 | 745 | ||
780 | static int test_acipher_jiffies(struct skcipher_request *req, int enc, | 746 | static int test_acipher_jiffies(struct skcipher_request *req, int enc, |
@@ -854,7 +820,7 @@ static void test_skcipher_speed(const char *algo, int enc, unsigned int secs, | |||
854 | unsigned int tcount, u8 *keysize, bool async) | 820 | unsigned int tcount, u8 *keysize, bool async) |
855 | { | 821 | { |
856 | unsigned int ret, i, j, k, iv_len; | 822 | unsigned int ret, i, j, k, iv_len; |
857 | struct tcrypt_result tresult; | 823 | struct crypto_wait wait; |
858 | const char *key; | 824 | const char *key; |
859 | char iv[128]; | 825 | char iv[128]; |
860 | struct skcipher_request *req; | 826 | struct skcipher_request *req; |
@@ -867,7 +833,7 @@ static void test_skcipher_speed(const char *algo, int enc, unsigned int secs, | |||
867 | else | 833 | else |
868 | e = "decryption"; | 834 | e = "decryption"; |
869 | 835 | ||
870 | init_completion(&tresult.completion); | 836 | crypto_init_wait(&wait); |
871 | 837 | ||
872 | tfm = crypto_alloc_skcipher(algo, 0, async ? 0 : CRYPTO_ALG_ASYNC); | 838 | tfm = crypto_alloc_skcipher(algo, 0, async ? 0 : CRYPTO_ALG_ASYNC); |
873 | 839 | ||
@@ -888,7 +854,7 @@ static void test_skcipher_speed(const char *algo, int enc, unsigned int secs, | |||
888 | } | 854 | } |
889 | 855 | ||
890 | skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, | 856 | skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, |
891 | tcrypt_complete, &tresult); | 857 | crypto_req_done, &wait); |
892 | 858 | ||
893 | i = 0; | 859 | i = 0; |
894 | do { | 860 | do { |