lkml.org 
[lkml]   [2020]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 028/252] net/mlx5e: Fix refcount leak on kTLS RX resync
    Date
    From: Maxim Mikityanskiy <maximmi@mellanox.com>

    [ Upstream commit ea63609857321c38fd4ad096388b413b66001c6c ]

    On resync, the driver calls inet_lookup_established
    (__inet6_lookup_established) that increases sk_refcnt of the socket. To
    decrease it, the driver set skb->destructor to sock_edemux. However, it
    didn't work well, because the TCP stack also sets this destructor for
    early demux, and the refcount gets decreased only once, while increased
    two times (in mlx5e and in the TCP stack). It leads to a socket leak, a
    TLS context leak, which in the end leads to calling tls_dev_del twice:
    on socket close and on driver unload, which in turn leads to a crash.

    This commit fixes the refcount leak by calling sock_gen_put right away
    after using the socket, thus fixing all the subsequent issues.

    Fixes: 0419d8c9d8f8 ("net/mlx5e: kTLS, Add kTLS RX resync support")
    Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com>
    Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c | 13 ++++++++-----
    1 file changed, 8 insertions(+), 5 deletions(-)

    --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c
    +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c
    @@ -476,19 +476,22 @@ static void resync_update_sn(struct mlx5

    depth += sizeof(struct tcphdr);

    - if (unlikely(!sk || sk->sk_state == TCP_TIME_WAIT))
    + if (unlikely(!sk))
    return;

    - if (unlikely(!resync_queue_get_psv(sk)))
    - return;
    + if (unlikely(sk->sk_state == TCP_TIME_WAIT))
    + goto unref;

    - skb->sk = sk;
    - skb->destructor = sock_edemux;
    + if (unlikely(!resync_queue_get_psv(sk)))
    + goto unref;

    seq = th->seq;
    datalen = skb->len - depth;
    tls_offload_rx_resync_async_request_start(sk, seq, datalen);
    rq->stats->tls_resync_req_start++;
    +
    +unref:
    + sock_gen_put(sk);
    }

    void mlx5e_ktls_rx_resync(struct net_device *netdev, struct sock *sk,

    \
     
     \ /
      Last update: 2020-11-23 14:09    [W:4.225 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site