crypto: octeon - always disable preemption when using crypto engine
authorAaro Koskinen <aaro.koskinen@iki.fi>
Sun, 8 Mar 2015 20:07:42 +0000 (22:07 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 10 Mar 2015 09:48:57 +0000 (20:48 +1100)
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>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/mips/cavium-octeon/crypto/octeon-crypto.c
arch/mips/cavium-octeon/crypto/octeon-md5.c

index 7c82ff463b65bef8e01cf517e503a632c3b43913..f66bd1adc7ff310880b27697cd0e83cd25a124b7 100644 (file)
@@ -17,7 +17,7 @@
  * 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
  * 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.
  *
@@ -28,6 +28,7 @@ unsigned long octeon_crypto_enable(struct octeon_cop2_state *state)
        int status;
        unsigned long flags;
 
+       preempt_disable();
        local_irq_save(flags);
        status = read_c0_status();
        write_c0_status(status | ST0_CU2);
@@ -62,5 +63,6 @@ void octeon_crypto_disable(struct octeon_cop2_state *state,
        else
                write_c0_status(read_c0_status() & ~ST0_CU2);
        local_irq_restore(flags);
+       preempt_enable();
 }
 EXPORT_SYMBOL_GPL(octeon_crypto_disable);
index 3dd88450d4405ec41693c7a8ac2f9e3dd840ee4a..12dccdb38286092e304224419d2c36ee18b2f88b 100644 (file)
@@ -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,
               avail);
 
-       preempt_disable();
        flags = octeon_crypto_enable(&state);
        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_crypto_disable(&state, flags);
-       preempt_enable();
 
        memcpy(mctx->block, data, len);
 
@@ -131,7 +129,6 @@ static int octeon_md5_final(struct shash_desc *desc, u8 *out)
 
        *p++ = 0x80;
 
-       preempt_disable();
        flags = octeon_crypto_enable(&state);
        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_crypto_disable(&state, flags);
-       preempt_enable();
 
        memcpy(out, mctx->hash, sizeof(mctx->hash));
        memset(mctx, 0, sizeof(*mctx));