tls: extract context alloc/initialization out of tls_set_sw_offload
commit 615580cbc99af0da2d1c7226fab43a3d5003eb97 upstream. Simplify tls_set_sw_offload a bit. Signed-off-by: Sabrina Dubroca <sd@queasysnail.net> Signed-off-by: David S. Miller <davem@davemloft.net> Stable-dep-of: aec7961916f3 ("tls: fix race between async notify and socket close") [v5.15: fixed contextual conflicts from unavailable init_waitqueue_head and skb_queue_head_init calls in tls_set_sw_offload and init_ctx_rx] Cc: <stable@vger.kernel.org> # 5.15 Signed-off-by: Shaoying Xu <shaoyi@amazon.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
704402f913
commit
fb782814bf
@ -2291,6 +2291,46 @@ void tls_sw_strparser_arm(struct sock *sk, struct tls_context *tls_ctx)
|
||||
strp_check_rcv(&rx_ctx->strp);
|
||||
}
|
||||
|
||||
static struct tls_sw_context_tx *init_ctx_tx(struct tls_context *ctx, struct sock *sk)
|
||||
{
|
||||
struct tls_sw_context_tx *sw_ctx_tx;
|
||||
|
||||
if (!ctx->priv_ctx_tx) {
|
||||
sw_ctx_tx = kzalloc(sizeof(*sw_ctx_tx), GFP_KERNEL);
|
||||
if (!sw_ctx_tx)
|
||||
return NULL;
|
||||
} else {
|
||||
sw_ctx_tx = ctx->priv_ctx_tx;
|
||||
}
|
||||
|
||||
crypto_init_wait(&sw_ctx_tx->async_wait);
|
||||
spin_lock_init(&sw_ctx_tx->encrypt_compl_lock);
|
||||
INIT_LIST_HEAD(&sw_ctx_tx->tx_list);
|
||||
INIT_DELAYED_WORK(&sw_ctx_tx->tx_work.work, tx_work_handler);
|
||||
sw_ctx_tx->tx_work.sk = sk;
|
||||
|
||||
return sw_ctx_tx;
|
||||
}
|
||||
|
||||
static struct tls_sw_context_rx *init_ctx_rx(struct tls_context *ctx)
|
||||
{
|
||||
struct tls_sw_context_rx *sw_ctx_rx;
|
||||
|
||||
if (!ctx->priv_ctx_rx) {
|
||||
sw_ctx_rx = kzalloc(sizeof(*sw_ctx_rx), GFP_KERNEL);
|
||||
if (!sw_ctx_rx)
|
||||
return NULL;
|
||||
} else {
|
||||
sw_ctx_rx = ctx->priv_ctx_rx;
|
||||
}
|
||||
|
||||
crypto_init_wait(&sw_ctx_rx->async_wait);
|
||||
spin_lock_init(&sw_ctx_rx->decrypt_compl_lock);
|
||||
skb_queue_head_init(&sw_ctx_rx->rx_list);
|
||||
|
||||
return sw_ctx_rx;
|
||||
}
|
||||
|
||||
int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
|
||||
{
|
||||
struct tls_context *tls_ctx = tls_get_ctx(sk);
|
||||
@ -2317,46 +2357,22 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
|
||||
}
|
||||
|
||||
if (tx) {
|
||||
if (!ctx->priv_ctx_tx) {
|
||||
sw_ctx_tx = kzalloc(sizeof(*sw_ctx_tx), GFP_KERNEL);
|
||||
if (!sw_ctx_tx) {
|
||||
rc = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
ctx->priv_ctx_tx = sw_ctx_tx;
|
||||
} else {
|
||||
sw_ctx_tx =
|
||||
(struct tls_sw_context_tx *)ctx->priv_ctx_tx;
|
||||
}
|
||||
} else {
|
||||
if (!ctx->priv_ctx_rx) {
|
||||
sw_ctx_rx = kzalloc(sizeof(*sw_ctx_rx), GFP_KERNEL);
|
||||
if (!sw_ctx_rx) {
|
||||
rc = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
ctx->priv_ctx_rx = sw_ctx_rx;
|
||||
} else {
|
||||
sw_ctx_rx =
|
||||
(struct tls_sw_context_rx *)ctx->priv_ctx_rx;
|
||||
}
|
||||
}
|
||||
ctx->priv_ctx_tx = init_ctx_tx(ctx, sk);
|
||||
if (!ctx->priv_ctx_tx)
|
||||
return -ENOMEM;
|
||||
|
||||
if (tx) {
|
||||
crypto_init_wait(&sw_ctx_tx->async_wait);
|
||||
spin_lock_init(&sw_ctx_tx->encrypt_compl_lock);
|
||||
sw_ctx_tx = ctx->priv_ctx_tx;
|
||||
crypto_info = &ctx->crypto_send.info;
|
||||
cctx = &ctx->tx;
|
||||
aead = &sw_ctx_tx->aead_send;
|
||||
INIT_LIST_HEAD(&sw_ctx_tx->tx_list);
|
||||
INIT_DELAYED_WORK(&sw_ctx_tx->tx_work.work, tx_work_handler);
|
||||
sw_ctx_tx->tx_work.sk = sk;
|
||||
} else {
|
||||
crypto_init_wait(&sw_ctx_rx->async_wait);
|
||||
spin_lock_init(&sw_ctx_rx->decrypt_compl_lock);
|
||||
ctx->priv_ctx_rx = init_ctx_rx(ctx);
|
||||
if (!ctx->priv_ctx_rx)
|
||||
return -ENOMEM;
|
||||
|
||||
sw_ctx_rx = ctx->priv_ctx_rx;
|
||||
crypto_info = &ctx->crypto_recv.info;
|
||||
cctx = &ctx->rx;
|
||||
skb_queue_head_init(&sw_ctx_rx->rx_list);
|
||||
aead = &sw_ctx_rx->aead_recv;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user