lkml.org 
[lkml]   [2020]   [May]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 15/33] tcp: add tcp_sock_set_syncnt
    Date
    Add a helper to directly set the TCP_SYNCNT sockopt from kernel space
    without going through a fake uaccess.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Acked-by: Sagi Grimberg <sagi@grimberg.me>
    ---
    drivers/nvme/host/tcp.c | 9 +--------
    include/linux/tcp.h | 1 +
    net/ipv4/tcp.c | 12 ++++++++++++
    3 files changed, 14 insertions(+), 8 deletions(-)

    diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
    index 4e4a750ecdb97..2872584f52f63 100644
    --- a/drivers/nvme/host/tcp.c
    +++ b/drivers/nvme/host/tcp.c
    @@ -1336,14 +1336,7 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl,
    }

    /* Single syn retry */
    - opt = 1;
    - ret = kernel_setsockopt(queue->sock, IPPROTO_TCP, TCP_SYNCNT,
    - (char *)&opt, sizeof(opt));
    - if (ret) {
    - dev_err(nctrl->device,
    - "failed to set TCP_SYNCNT sock opt %d\n", ret);
    - goto err_sock;
    - }
    + tcp_sock_set_syncnt(queue->sock->sk, 1);

    /* Set TCP no delay */
    tcp_sock_set_nodelay(queue->sock->sk);
    diff --git a/include/linux/tcp.h b/include/linux/tcp.h
    index 2eaf8320b9db0..6aa4ae5ebf3d5 100644
    --- a/include/linux/tcp.h
    +++ b/include/linux/tcp.h
    @@ -500,5 +500,6 @@ int tcp_skb_shift(struct sk_buff *to, struct sk_buff *from, int pcount,
    void tcp_sock_set_cork(struct sock *sk, bool on);
    void tcp_sock_set_nodelay(struct sock *sk);
    void tcp_sock_set_quickack(struct sock *sk, int val);
    +int tcp_sock_set_syncnt(struct sock *sk, int val);

    #endif /* _LINUX_TCP_H */
    diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
    index 27b5e7a4e2ef9..d2c67ae1da07a 100644
    --- a/net/ipv4/tcp.c
    +++ b/net/ipv4/tcp.c
    @@ -2881,6 +2881,18 @@ void tcp_sock_set_quickack(struct sock *sk, int val)
    }
    EXPORT_SYMBOL(tcp_sock_set_quickack);

    +int tcp_sock_set_syncnt(struct sock *sk, int val)
    +{
    + if (val < 1 || val > MAX_TCP_SYNCNT)
    + return -EINVAL;
    +
    + lock_sock(sk);
    + inet_csk(sk)->icsk_syn_retries = val;
    + release_sock(sk);
    + return 0;
    +}
    +EXPORT_SYMBOL(tcp_sock_set_syncnt);
    +
    /*
    * Socket option code for TCP.
    */
    --
    2.26.2
    \
     
     \ /
      Last update: 2020-05-20 22:00    [W:4.234 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site