Skip to content

Commit

Permalink
crypto: algif - move to generic async completion
Browse files Browse the repository at this point in the history
algif starts several async crypto ops and waits for their completion.
Move it over to generic code doing the same.

Signed-off-by: Gilad Ben-Yossef <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
gby authored and herbertx committed Nov 3, 2017
1 parent ada69a1 commit 2c3f8b1
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 66 deletions.
27 changes: 0 additions & 27 deletions crypto/af_alg.c
Original file line number Diff line number Diff line change
Expand Up @@ -481,33 +481,6 @@ int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con)
}
EXPORT_SYMBOL_GPL(af_alg_cmsg_send);

int af_alg_wait_for_completion(int err, struct af_alg_completion *completion)
{
switch (err) {
case -EINPROGRESS:
case -EBUSY:
wait_for_completion(&completion->completion);
reinit_completion(&completion->completion);
err = completion->err;
break;
};

return err;
}
EXPORT_SYMBOL_GPL(af_alg_wait_for_completion);

void af_alg_complete(struct crypto_async_request *req, int err)
{
struct af_alg_completion *completion = req->data;

if (err == -EINPROGRESS)
return;

completion->err = err;
complete(&completion->completion);
}
EXPORT_SYMBOL_GPL(af_alg_complete);

/**
* af_alg_alloc_tsgl - allocate the TX SGL
*
Expand Down
8 changes: 4 additions & 4 deletions crypto/algif_aead.c
Original file line number Diff line number Diff line change
Expand Up @@ -278,11 +278,11 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
/* Synchronous operation */
aead_request_set_callback(&areq->cra_u.aead_req,
CRYPTO_TFM_REQ_MAY_BACKLOG,
af_alg_complete, &ctx->completion);
err = af_alg_wait_for_completion(ctx->enc ?
crypto_req_done, &ctx->wait);
err = crypto_wait_req(ctx->enc ?
crypto_aead_encrypt(&areq->cra_u.aead_req) :
crypto_aead_decrypt(&areq->cra_u.aead_req),
&ctx->completion);
&ctx->wait);
}

/* AIO operation in progress */
Expand Down Expand Up @@ -554,7 +554,7 @@ static int aead_accept_parent_nokey(void *private, struct sock *sk)
ctx->merge = 0;
ctx->enc = 0;
ctx->aead_assoclen = 0;
af_alg_init_completion(&ctx->completion);
crypto_init_wait(&ctx->wait);

ask->private = ctx;

Expand Down
30 changes: 14 additions & 16 deletions crypto/algif_hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ struct hash_ctx {

u8 *result;

struct af_alg_completion completion;
struct crypto_wait wait;

unsigned int len;
bool more;
Expand Down Expand Up @@ -88,8 +88,7 @@ static int hash_sendmsg(struct socket *sock, struct msghdr *msg,
if ((msg->msg_flags & MSG_MORE))
hash_free_result(sk, ctx);

err = af_alg_wait_for_completion(crypto_ahash_init(&ctx->req),
&ctx->completion);
err = crypto_wait_req(crypto_ahash_init(&ctx->req), &ctx->wait);
if (err)
goto unlock;
}
Expand All @@ -110,8 +109,8 @@ static int hash_sendmsg(struct socket *sock, struct msghdr *msg,

ahash_request_set_crypt(&ctx->req, ctx->sgl.sg, NULL, len);

err = af_alg_wait_for_completion(crypto_ahash_update(&ctx->req),
&ctx->completion);
err = crypto_wait_req(crypto_ahash_update(&ctx->req),
&ctx->wait);
af_alg_free_sg(&ctx->sgl);
if (err)
goto unlock;
Expand All @@ -129,8 +128,8 @@ static int hash_sendmsg(struct socket *sock, struct msghdr *msg,
goto unlock;

ahash_request_set_crypt(&ctx->req, NULL, ctx->result, 0);
err = af_alg_wait_for_completion(crypto_ahash_final(&ctx->req),
&ctx->completion);
err = crypto_wait_req(crypto_ahash_final(&ctx->req),
&ctx->wait);
}

unlock:
Expand Down Expand Up @@ -171,15 +170,15 @@ static ssize_t hash_sendpage(struct socket *sock, struct page *page,
} else {
if (!ctx->more) {
err = crypto_ahash_init(&ctx->req);
err = af_alg_wait_for_completion(err, &ctx->completion);
err = crypto_wait_req(err, &ctx->wait);
if (err)
goto unlock;
}

err = crypto_ahash_update(&ctx->req);
}

err = af_alg_wait_for_completion(err, &ctx->completion);
err = crypto_wait_req(err, &ctx->wait);
if (err)
goto unlock;

Expand Down Expand Up @@ -215,17 +214,16 @@ static int hash_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
ahash_request_set_crypt(&ctx->req, NULL, ctx->result, 0);

if (!result && !ctx->more) {
err = af_alg_wait_for_completion(
crypto_ahash_init(&ctx->req),
&ctx->completion);
err = crypto_wait_req(crypto_ahash_init(&ctx->req),
&ctx->wait);
if (err)
goto unlock;
}

if (!result || ctx->more) {
ctx->more = 0;
err = af_alg_wait_for_completion(crypto_ahash_final(&ctx->req),
&ctx->completion);
err = crypto_wait_req(crypto_ahash_final(&ctx->req),
&ctx->wait);
if (err)
goto unlock;
}
Expand Down Expand Up @@ -476,13 +474,13 @@ static int hash_accept_parent_nokey(void *private, struct sock *sk)
ctx->result = NULL;
ctx->len = len;
ctx->more = 0;
af_alg_init_completion(&ctx->completion);
crypto_init_wait(&ctx->wait);

ask->private = ctx;

ahash_request_set_tfm(&ctx->req, hash);
ahash_request_set_callback(&ctx->req, CRYPTO_TFM_REQ_MAY_BACKLOG,
af_alg_complete, &ctx->completion);
crypto_req_done, &ctx->wait);

sk->sk_destruct = hash_sock_destruct;

Expand Down
9 changes: 4 additions & 5 deletions crypto/algif_skcipher.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,12 +129,11 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
skcipher_request_set_callback(&areq->cra_u.skcipher_req,
CRYPTO_TFM_REQ_MAY_SLEEP |
CRYPTO_TFM_REQ_MAY_BACKLOG,
af_alg_complete,
&ctx->completion);
err = af_alg_wait_for_completion(ctx->enc ?
crypto_req_done, &ctx->wait);
err = crypto_wait_req(ctx->enc ?
crypto_skcipher_encrypt(&areq->cra_u.skcipher_req) :
crypto_skcipher_decrypt(&areq->cra_u.skcipher_req),
&ctx->completion);
&ctx->wait);
}

/* AIO operation in progress */
Expand Down Expand Up @@ -388,7 +387,7 @@ static int skcipher_accept_parent_nokey(void *private, struct sock *sk)
ctx->more = 0;
ctx->merge = 0;
ctx->enc = 0;
af_alg_init_completion(&ctx->completion);
crypto_init_wait(&ctx->wait);

ask->private = ctx;

Expand Down
15 changes: 1 addition & 14 deletions include/crypto/if_alg.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,6 @@ struct alg_sock {
void *private;
};

struct af_alg_completion {
struct completion completion;
int err;
};

struct af_alg_control {
struct af_alg_iv *iv;
int op;
Expand Down Expand Up @@ -152,7 +147,7 @@ struct af_alg_ctx {
void *iv;
size_t aead_assoclen;

struct af_alg_completion completion;
struct crypto_wait wait;

size_t used;
size_t rcvused;
Expand All @@ -177,19 +172,11 @@ void af_alg_link_sg(struct af_alg_sgl *sgl_prev, struct af_alg_sgl *sgl_new);

int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con);

int af_alg_wait_for_completion(int err, struct af_alg_completion *completion);
void af_alg_complete(struct crypto_async_request *req, int err);

static inline struct alg_sock *alg_sk(struct sock *sk)
{
return (struct alg_sock *)sk;
}

static inline void af_alg_init_completion(struct af_alg_completion *completion)
{
init_completion(&completion->completion);
}

/**
* Size of available buffer for sending data from user space to kernel.
*
Expand Down

0 comments on commit 2c3f8b1

Please sign in to comment.