Skip to content

Commit

Permalink
[CRYPTO]: Added CRYPTO_TFM_REQ_MAY_SLEEP flag
Browse files Browse the repository at this point in the history
The crypto layer currently uses in_atomic() to determine whether it is
allowed to sleep.  This is incorrect since spin locks don't always cause
in_atomic() to return true.

Instead of that, this patch returns to an earlier idea of a per-tfm flag
which determines whether sleeping is allowed.  Unlike the earlier version,
the default is to not allow sleeping.  This ensures that no existing code
can break.

As usual, this flag may either be set through crypto_alloc_tfm(), or
just before a specific crypto operation.

Signed-off-by: Herbert Xu <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
herbertx authored and davem330 committed Sep 2, 2005
1 parent fb4f10e commit 64baf3c
Show file tree
Hide file tree
Showing 4 changed files with 5 additions and 6 deletions.
3 changes: 2 additions & 1 deletion crypto/api.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ static inline struct crypto_alg *crypto_alg_mod_lookup(const char *name)

static int crypto_init_flags(struct crypto_tfm *tfm, u32 flags)
{
tfm->crt_flags = 0;
tfm->crt_flags = flags & CRYPTO_TFM_REQ_MASK;
flags &= ~CRYPTO_TFM_REQ_MASK;

switch (crypto_tfm_alg_type(tfm)) {
case CRYPTO_ALG_TYPE_CIPHER:
Expand Down
4 changes: 0 additions & 4 deletions crypto/cipher.c
Original file line number Diff line number Diff line change
Expand Up @@ -377,11 +377,7 @@ static int nocrypt_iv(struct crypto_tfm *tfm,
int crypto_init_cipher_flags(struct crypto_tfm *tfm, u32 flags)
{
u32 mode = flags & CRYPTO_TFM_MODE_MASK;

tfm->crt_cipher.cit_mode = mode ? mode : CRYPTO_TFM_MODE_ECB;
if (flags & CRYPTO_TFM_REQ_WEAK_KEY)
tfm->crt_flags = CRYPTO_TFM_REQ_WEAK_KEY;

return 0;
}

Expand Down
3 changes: 2 additions & 1 deletion crypto/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <asm/kmap_types.h>

extern enum km_type crypto_km_types[];
Expand All @@ -38,7 +39,7 @@ static inline void crypto_kunmap(void *vaddr, int out)

static inline void crypto_yield(struct crypto_tfm *tfm)
{
if (!in_atomic())
if (tfm->crt_flags & CRYPTO_TFM_REQ_MAY_SLEEP)
cond_resched();
}

Expand Down
1 change: 1 addition & 0 deletions include/linux/crypto.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
#define CRYPTO_TFM_MODE_CTR 0x00000008

#define CRYPTO_TFM_REQ_WEAK_KEY 0x00000100
#define CRYPTO_TFM_REQ_MAY_SLEEP 0x00000200
#define CRYPTO_TFM_RES_WEAK_KEY 0x00100000
#define CRYPTO_TFM_RES_BAD_KEY_LEN 0x00200000
#define CRYPTO_TFM_RES_BAD_KEY_SCHED 0x00400000
Expand Down

0 comments on commit 64baf3c

Please sign in to comment.