diff options
author | Joel A Fernandes <joelagnel@ti.com> | 2013-05-28 20:02:55 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2013-06-05 04:43:05 -0400 |
commit | a3485e685faa37ba92462bec2f18b98c3c825c76 (patch) | |
tree | 7973c65bff28eeb3847e52a658f85fab561fa0f9 /drivers/crypto/omap-aes.c | |
parent | 67822649d7305caf3dd50ed46c27b99c94eff996 (diff) |
crypto: omap-aes - Don't idle/start AES device between Encrypt operations
Calling runtime PM API for every block causes serious perf hit to
crypto operations that are done on a long buffer.
As crypto is performed on a page boundary, encrypting large buffers can
cause a series of crypto operations divided by page. The runtime PM API
is also called those many times.
We call runtime_pm_get_sync only at beginning on the session (cra_init)
and runtime_pm_put at the end. This result in upto a 50% speedup as below.
This doesn't make the driver to keep the system awake as runtime get/put
is only called during a crypto session which completes usually quickly.
Before:
root@beagleboard:~# time -v openssl speed -evp aes-128-cbc
Doing aes-128-cbc for 3s on 16 size blocks: 13310 aes-128-cbc's in 0.01s
Doing aes-128-cbc for 3s on 64 size blocks: 13040 aes-128-cbc's in 0.04s
Doing aes-128-cbc for 3s on 256 size blocks: 9134 aes-128-cbc's in 0.03s
Doing aes-128-cbc for 3s on 1024 size blocks: 8939 aes-128-cbc's in 0.01s
Doing aes-128-cbc for 3s on 8192 size blocks: 4299 aes-128-cbc's in 0.00s
After:
root@beagleboard:~# time -v openssl speed -evp aes-128-cbc
Doing aes-128-cbc for 3s on 16 size blocks: 18911 aes-128-cbc's in 0.02s
Doing aes-128-cbc for 3s on 64 size blocks: 18878 aes-128-cbc's in 0.02s
Doing aes-128-cbc for 3s on 256 size blocks: 11878 aes-128-cbc's in 0.10s
Doing aes-128-cbc for 3s on 1024 size blocks: 11538 aes-128-cbc's in 0.05s
Doing aes-128-cbc for 3s on 8192 size blocks: 4857 aes-128-cbc's in 0.03s
While at it, also drop enter and exit pr_debugs, in related code. tracers
can be used for that.
Tested on a Beaglebone (AM335x SoC) board.
Signed-off-by: Joel A Fernandes <joelagnel@ti.com>
Acked-by: Kevin Hilman <khilman@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/omap-aes.c')
-rw-r--r-- | drivers/crypto/omap-aes.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/crypto/omap-aes.c b/drivers/crypto/omap-aes.c index 305a2aacf9b3..5f7980586850 100644 --- a/drivers/crypto/omap-aes.c +++ b/drivers/crypto/omap-aes.c | |||
@@ -203,13 +203,6 @@ static void omap_aes_write_n(struct omap_aes_dev *dd, u32 offset, | |||
203 | 203 | ||
204 | static int omap_aes_hw_init(struct omap_aes_dev *dd) | 204 | static int omap_aes_hw_init(struct omap_aes_dev *dd) |
205 | { | 205 | { |
206 | /* | ||
207 | * clocks are enabled when request starts and disabled when finished. | ||
208 | * It may be long delays between requests. | ||
209 | * Device might go to off mode to save power. | ||
210 | */ | ||
211 | pm_runtime_get_sync(dd->dev); | ||
212 | |||
213 | if (!(dd->flags & FLAGS_INIT)) { | 206 | if (!(dd->flags & FLAGS_INIT)) { |
214 | dd->flags |= FLAGS_INIT; | 207 | dd->flags |= FLAGS_INIT; |
215 | dd->err = 0; | 208 | dd->err = 0; |
@@ -636,7 +629,6 @@ static void omap_aes_finish_req(struct omap_aes_dev *dd, int err) | |||
636 | 629 | ||
637 | pr_debug("err: %d\n", err); | 630 | pr_debug("err: %d\n", err); |
638 | 631 | ||
639 | pm_runtime_put(dd->dev); | ||
640 | dd->flags &= ~FLAGS_BUSY; | 632 | dd->flags &= ~FLAGS_BUSY; |
641 | 633 | ||
642 | req->base.complete(&req->base, err); | 634 | req->base.complete(&req->base, err); |
@@ -837,8 +829,16 @@ static int omap_aes_ctr_decrypt(struct ablkcipher_request *req) | |||
837 | 829 | ||
838 | static int omap_aes_cra_init(struct crypto_tfm *tfm) | 830 | static int omap_aes_cra_init(struct crypto_tfm *tfm) |
839 | { | 831 | { |
840 | pr_debug("enter\n"); | 832 | struct omap_aes_dev *dd = NULL; |
833 | |||
834 | /* Find AES device, currently picks the first device */ | ||
835 | spin_lock_bh(&list_lock); | ||
836 | list_for_each_entry(dd, &dev_list, list) { | ||
837 | break; | ||
838 | } | ||
839 | spin_unlock_bh(&list_lock); | ||
841 | 840 | ||
841 | pm_runtime_get_sync(dd->dev); | ||
842 | tfm->crt_ablkcipher.reqsize = sizeof(struct omap_aes_reqctx); | 842 | tfm->crt_ablkcipher.reqsize = sizeof(struct omap_aes_reqctx); |
843 | 843 | ||
844 | return 0; | 844 | return 0; |
@@ -846,7 +846,16 @@ static int omap_aes_cra_init(struct crypto_tfm *tfm) | |||
846 | 846 | ||
847 | static void omap_aes_cra_exit(struct crypto_tfm *tfm) | 847 | static void omap_aes_cra_exit(struct crypto_tfm *tfm) |
848 | { | 848 | { |
849 | pr_debug("enter\n"); | 849 | struct omap_aes_dev *dd = NULL; |
850 | |||
851 | /* Find AES device, currently picks the first device */ | ||
852 | spin_lock_bh(&list_lock); | ||
853 | list_for_each_entry(dd, &dev_list, list) { | ||
854 | break; | ||
855 | } | ||
856 | spin_unlock_bh(&list_lock); | ||
857 | |||
858 | pm_runtime_put_sync(dd->dev); | ||
850 | } | 859 | } |
851 | 860 | ||
852 | /* ********************** ALGS ************************************ */ | 861 | /* ********************** ALGS ************************************ */ |