mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 22:51:37 +00:00
net/tls: remove sock unlock/lock around strp_done()
The tls close() callback currently drops the sock lock to call strp_done(). Split up the RX cleanup into stopping the strparser and releasing most resources, syncing strparser and finally freeing the context. To avoid the need for a strp_done() call on the cleanup path of device offload make sure we don't arm the strparser until we are sure init will be successful. Signed-off-by: John Fastabend <john.fastabend@gmail.com> Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
This commit is contained in:
parent
f87e62d45e
commit
313ab00480
4 changed files with 64 additions and 45 deletions
|
@ -261,24 +261,9 @@ void tls_ctx_free(struct tls_context *ctx)
|
|||
kfree(ctx);
|
||||
}
|
||||
|
||||
static void tls_sk_proto_close(struct sock *sk, long timeout)
|
||||
static void tls_sk_proto_cleanup(struct sock *sk,
|
||||
struct tls_context *ctx, long timeo)
|
||||
{
|
||||
struct tls_context *ctx = tls_get_ctx(sk);
|
||||
long timeo = sock_sndtimeo(sk, 0);
|
||||
void (*sk_proto_close)(struct sock *sk, long timeout);
|
||||
bool free_ctx = false;
|
||||
|
||||
if (ctx->tx_conf == TLS_SW)
|
||||
tls_sw_cancel_work_tx(ctx);
|
||||
|
||||
lock_sock(sk);
|
||||
sk_proto_close = ctx->sk_proto_close;
|
||||
|
||||
if (ctx->tx_conf == TLS_BASE && ctx->rx_conf == TLS_BASE) {
|
||||
free_ctx = true;
|
||||
goto skip_tx_cleanup;
|
||||
}
|
||||
|
||||
if (unlikely(sk->sk_write_pending) &&
|
||||
!wait_on_pending_writer(sk, &timeo))
|
||||
tls_handle_open_record(sk, 0);
|
||||
|
@ -287,7 +272,7 @@ static void tls_sk_proto_close(struct sock *sk, long timeout)
|
|||
if (ctx->tx_conf == TLS_SW) {
|
||||
kfree(ctx->tx.rec_seq);
|
||||
kfree(ctx->tx.iv);
|
||||
tls_sw_free_resources_tx(sk);
|
||||
tls_sw_release_resources_tx(sk);
|
||||
#ifdef CONFIG_TLS_DEVICE
|
||||
} else if (ctx->tx_conf == TLS_HW) {
|
||||
tls_device_free_resources_tx(sk);
|
||||
|
@ -295,26 +280,40 @@ static void tls_sk_proto_close(struct sock *sk, long timeout)
|
|||
}
|
||||
|
||||
if (ctx->rx_conf == TLS_SW)
|
||||
tls_sw_free_resources_rx(sk);
|
||||
tls_sw_release_resources_rx(sk);
|
||||
|
||||
#ifdef CONFIG_TLS_DEVICE
|
||||
if (ctx->rx_conf == TLS_HW)
|
||||
tls_device_offload_cleanup_rx(sk);
|
||||
|
||||
if (ctx->tx_conf != TLS_HW && ctx->rx_conf != TLS_HW) {
|
||||
#else
|
||||
{
|
||||
#endif
|
||||
tls_ctx_free(ctx);
|
||||
ctx = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void tls_sk_proto_close(struct sock *sk, long timeout)
|
||||
{
|
||||
void (*sk_proto_close)(struct sock *sk, long timeout);
|
||||
struct tls_context *ctx = tls_get_ctx(sk);
|
||||
long timeo = sock_sndtimeo(sk, 0);
|
||||
bool free_ctx;
|
||||
|
||||
if (ctx->tx_conf == TLS_SW)
|
||||
tls_sw_cancel_work_tx(ctx);
|
||||
|
||||
lock_sock(sk);
|
||||
free_ctx = ctx->tx_conf != TLS_HW && ctx->rx_conf != TLS_HW;
|
||||
sk_proto_close = ctx->sk_proto_close;
|
||||
|
||||
if (ctx->tx_conf != TLS_BASE || ctx->rx_conf != TLS_BASE)
|
||||
tls_sk_proto_cleanup(sk, ctx, timeo);
|
||||
|
||||
skip_tx_cleanup:
|
||||
release_sock(sk);
|
||||
if (ctx->tx_conf == TLS_SW)
|
||||
tls_sw_free_ctx_tx(ctx);
|
||||
if (ctx->rx_conf == TLS_SW || ctx->rx_conf == TLS_HW)
|
||||
tls_sw_strparser_done(ctx);
|
||||
if (ctx->rx_conf == TLS_SW)
|
||||
tls_sw_free_ctx_rx(ctx);
|
||||
sk_proto_close(sk, timeout);
|
||||
/* free ctx for TLS_HW_RECORD, used by tcp_set_state
|
||||
* for sk->sk_prot->unhash [tls_hw_unhash]
|
||||
*/
|
||||
|
||||
if (free_ctx)
|
||||
tls_ctx_free(ctx);
|
||||
}
|
||||
|
@ -541,9 +540,9 @@ static int do_tls_setsockopt_conf(struct sock *sk, char __user *optval,
|
|||
rc = tls_set_sw_offload(sk, ctx, 0);
|
||||
if (rc)
|
||||
goto err_crypto_info;
|
||||
tls_sw_strparser_arm(sk, ctx);
|
||||
conf = TLS_SW;
|
||||
}
|
||||
tls_sw_strparser_arm(sk, ctx);
|
||||
}
|
||||
|
||||
if (tx)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue