mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-17 18:36:00 +00:00
crypto: sun8i-ss - Remove GFP_DMA and add DMA alignment padding
GFP_DMA does not guarantee that the returned memory is aligned for DMA. In fact for sun8i-ss it is superfluous and can be removed. However, kmalloc may start returning DMA-unaligned memory in future so fix this by adding the alignment by hand. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Tested-by: Corentin Labbe <clabbe.montjoie@gmail.com> Acked-by: Corentin Labbe <clabbe.montjoie@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
4f289826fe
commit
39a76cf1f5
@ -452,7 +452,7 @@ int sun8i_ss_aes_setkey(struct crypto_skcipher *tfm, const u8 *key,
|
||||
}
|
||||
kfree_sensitive(op->key);
|
||||
op->keylen = keylen;
|
||||
op->key = kmemdup(key, keylen, GFP_KERNEL | GFP_DMA);
|
||||
op->key = kmemdup(key, keylen, GFP_KERNEL);
|
||||
if (!op->key)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -475,7 +475,7 @@ int sun8i_ss_des3_setkey(struct crypto_skcipher *tfm, const u8 *key,
|
||||
|
||||
kfree_sensitive(op->key);
|
||||
op->keylen = keylen;
|
||||
op->key = kmemdup(key, keylen, GFP_KERNEL | GFP_DMA);
|
||||
op->key = kmemdup(key, keylen, GFP_KERNEL);
|
||||
if (!op->key)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
@ -527,7 +528,7 @@ static int allocate_flows(struct sun8i_ss_dev *ss)
|
||||
init_completion(&ss->flows[i].complete);
|
||||
|
||||
ss->flows[i].biv = devm_kmalloc(ss->dev, AES_BLOCK_SIZE,
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
GFP_KERNEL);
|
||||
if (!ss->flows[i].biv) {
|
||||
err = -ENOMEM;
|
||||
goto error_engine;
|
||||
@ -535,7 +536,7 @@ static int allocate_flows(struct sun8i_ss_dev *ss)
|
||||
|
||||
for (j = 0; j < MAX_SG; j++) {
|
||||
ss->flows[i].iv[j] = devm_kmalloc(ss->dev, AES_BLOCK_SIZE,
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
GFP_KERNEL);
|
||||
if (!ss->flows[i].iv[j]) {
|
||||
err = -ENOMEM;
|
||||
goto error_engine;
|
||||
@ -544,13 +545,15 @@ static int allocate_flows(struct sun8i_ss_dev *ss)
|
||||
|
||||
/* the padding could be up to two block. */
|
||||
ss->flows[i].pad = devm_kmalloc(ss->dev, MAX_PAD_SIZE,
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
GFP_KERNEL);
|
||||
if (!ss->flows[i].pad) {
|
||||
err = -ENOMEM;
|
||||
goto error_engine;
|
||||
}
|
||||
ss->flows[i].result = devm_kmalloc(ss->dev, SHA256_DIGEST_SIZE,
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
ss->flows[i].result =
|
||||
devm_kmalloc(ss->dev, max(SHA256_DIGEST_SIZE,
|
||||
dma_get_cache_alignment()),
|
||||
GFP_KERNEL);
|
||||
if (!ss->flows[i].result) {
|
||||
err = -ENOMEM;
|
||||
goto error_engine;
|
||||
|
@ -79,10 +79,10 @@ int sun8i_ss_hmac_setkey(struct crypto_ahash *ahash, const u8 *key,
|
||||
memcpy(tfmctx->key, key, keylen);
|
||||
}
|
||||
|
||||
tfmctx->ipad = kzalloc(bs, GFP_KERNEL | GFP_DMA);
|
||||
tfmctx->ipad = kzalloc(bs, GFP_KERNEL);
|
||||
if (!tfmctx->ipad)
|
||||
return -ENOMEM;
|
||||
tfmctx->opad = kzalloc(bs, GFP_KERNEL | GFP_DMA);
|
||||
tfmctx->opad = kzalloc(bs, GFP_KERNEL);
|
||||
if (!tfmctx->opad) {
|
||||
ret = -ENOMEM;
|
||||
goto err_opad;
|
||||
|
@ -11,6 +11,8 @@
|
||||
*/
|
||||
#include "sun8i-ss.h"
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <crypto/internal/rng.h>
|
||||
|
||||
@ -25,7 +27,7 @@ int sun8i_ss_prng_seed(struct crypto_rng *tfm, const u8 *seed,
|
||||
ctx->seed = NULL;
|
||||
}
|
||||
if (!ctx->seed)
|
||||
ctx->seed = kmalloc(slen, GFP_KERNEL | GFP_DMA);
|
||||
ctx->seed = kmalloc(slen, GFP_KERNEL);
|
||||
if (!ctx->seed)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -58,6 +60,7 @@ int sun8i_ss_prng_generate(struct crypto_rng *tfm, const u8 *src,
|
||||
struct sun8i_ss_rng_tfm_ctx *ctx = crypto_rng_ctx(tfm);
|
||||
struct rng_alg *alg = crypto_rng_alg(tfm);
|
||||
struct sun8i_ss_alg_template *algt;
|
||||
unsigned int todo_with_padding;
|
||||
struct sun8i_ss_dev *ss;
|
||||
dma_addr_t dma_iv, dma_dst;
|
||||
unsigned int todo;
|
||||
@ -81,7 +84,11 @@ int sun8i_ss_prng_generate(struct crypto_rng *tfm, const u8 *src,
|
||||
todo = dlen + PRNG_SEED_SIZE + PRNG_DATA_SIZE;
|
||||
todo -= todo % PRNG_DATA_SIZE;
|
||||
|
||||
d = kzalloc(todo, GFP_KERNEL | GFP_DMA);
|
||||
todo_with_padding = ALIGN(todo, dma_get_cache_alignment());
|
||||
if (todo_with_padding < todo || todo < dlen)
|
||||
return -EOVERFLOW;
|
||||
|
||||
d = kzalloc(todo_with_padding, GFP_KERNEL);
|
||||
if (!d)
|
||||
return -ENOMEM;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user