CRYPTO: Octeon: always disable preemption when using crypto engine
Always disable preemption on behalf of the drivers when crypto engine is taken into use. This will simplify the usage. Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi> Cc: Herbert Xu <herbert@gondor.apana.org.au> Cc: David S. Miller <davem@davemloft.net> Cc: linux-crypto@vger.kernel.org Cc: linux-mips@linux-mips.org Cc: linux-kernel@vger.kernel.org Patchwork: https://patchwork.linux-mips.org/patch/9494/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
f7715e72f5
commit
e606ee200a
|
@ -17,7 +17,7 @@
|
||||||
* crypto operations in calls to octeon_crypto_enable/disable in order to make
|
* crypto operations in calls to octeon_crypto_enable/disable in order to make
|
||||||
* sure the state of COP2 isn't corrupted if userspace is also performing
|
* sure the state of COP2 isn't corrupted if userspace is also performing
|
||||||
* hardware crypto operations. Allocate the state parameter on the stack.
|
* hardware crypto operations. Allocate the state parameter on the stack.
|
||||||
* Preemption must be disabled to prevent context switches.
|
* Returns with preemption disabled.
|
||||||
*
|
*
|
||||||
* @state: Pointer to state structure to store current COP2 state in.
|
* @state: Pointer to state structure to store current COP2 state in.
|
||||||
*
|
*
|
||||||
|
@ -28,6 +28,7 @@ unsigned long octeon_crypto_enable(struct octeon_cop2_state *state)
|
||||||
int status;
|
int status;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
preempt_disable();
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
status = read_c0_status();
|
status = read_c0_status();
|
||||||
write_c0_status(status | ST0_CU2);
|
write_c0_status(status | ST0_CU2);
|
||||||
|
@ -62,5 +63,6 @@ void octeon_crypto_disable(struct octeon_cop2_state *state,
|
||||||
else
|
else
|
||||||
write_c0_status(read_c0_status() & ~ST0_CU2);
|
write_c0_status(read_c0_status() & ~ST0_CU2);
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
preempt_enable();
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(octeon_crypto_disable);
|
EXPORT_SYMBOL_GPL(octeon_crypto_disable);
|
||||||
|
|
|
@ -97,7 +97,6 @@ static int octeon_md5_update(struct shash_desc *desc, const u8 *data,
|
||||||
memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), data,
|
memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), data,
|
||||||
avail);
|
avail);
|
||||||
|
|
||||||
preempt_disable();
|
|
||||||
flags = octeon_crypto_enable(&state);
|
flags = octeon_crypto_enable(&state);
|
||||||
octeon_md5_store_hash(mctx);
|
octeon_md5_store_hash(mctx);
|
||||||
|
|
||||||
|
@ -113,7 +112,6 @@ static int octeon_md5_update(struct shash_desc *desc, const u8 *data,
|
||||||
|
|
||||||
octeon_md5_read_hash(mctx);
|
octeon_md5_read_hash(mctx);
|
||||||
octeon_crypto_disable(&state, flags);
|
octeon_crypto_disable(&state, flags);
|
||||||
preempt_enable();
|
|
||||||
|
|
||||||
memcpy(mctx->block, data, len);
|
memcpy(mctx->block, data, len);
|
||||||
|
|
||||||
|
@ -131,7 +129,6 @@ static int octeon_md5_final(struct shash_desc *desc, u8 *out)
|
||||||
|
|
||||||
*p++ = 0x80;
|
*p++ = 0x80;
|
||||||
|
|
||||||
preempt_disable();
|
|
||||||
flags = octeon_crypto_enable(&state);
|
flags = octeon_crypto_enable(&state);
|
||||||
octeon_md5_store_hash(mctx);
|
octeon_md5_store_hash(mctx);
|
||||||
|
|
||||||
|
@ -149,7 +146,6 @@ static int octeon_md5_final(struct shash_desc *desc, u8 *out)
|
||||||
|
|
||||||
octeon_md5_read_hash(mctx);
|
octeon_md5_read_hash(mctx);
|
||||||
octeon_crypto_disable(&state, flags);
|
octeon_crypto_disable(&state, flags);
|
||||||
preempt_enable();
|
|
||||||
|
|
||||||
memcpy(out, mctx->hash, sizeof(mctx->hash));
|
memcpy(out, mctx->hash, sizeof(mctx->hash));
|
||||||
memset(mctx, 0, sizeof(*mctx));
|
memset(mctx, 0, sizeof(*mctx));
|
||||||
|
|
Loading…
Reference in New Issue