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

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    ---
    fs/dlm/lowcomms.c | 10 ++--------
    include/net/sctp/sctp.h | 1 +
    net/sctp/socket.c | 8 ++++++++
    3 files changed, 11 insertions(+), 8 deletions(-)

    diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
    index e4939d770df53..6fa45365666a8 100644
    --- a/fs/dlm/lowcomms.c
    +++ b/fs/dlm/lowcomms.c
    @@ -1034,7 +1034,6 @@ static int sctp_bind_addrs(struct connection *con, uint16_t port)
    static void sctp_connect_to_sock(struct connection *con)
    {
    struct sockaddr_storage daddr;
    - int one = 1;
    int result;
    int addr_len;
    struct socket *sock;
    @@ -1081,8 +1080,7 @@ static void sctp_connect_to_sock(struct connection *con)
    log_print("connecting to %d", con->nodeid);

    /* Turn off Nagle's algorithm */
    - kernel_setsockopt(sock, SOL_SCTP, SCTP_NODELAY, (char *)&one,
    - sizeof(one));
    + sctp_sock_set_nodelay(sock->sk, true);

    /*
    * Make sock->ops->connect() function return in specified time,
    @@ -1296,7 +1294,6 @@ static int sctp_listen_for_all(void)
    struct socket *sock = NULL;
    int result = -EINVAL;
    struct connection *con = nodeid2con(0, GFP_NOFS);
    - int one = 1;

    if (!con)
    return -ENOMEM;
    @@ -1311,10 +1308,7 @@ static int sctp_listen_for_all(void)
    }

    sock_set_rcvbuf(sock->sk, NEEDED_RMEM);
    - result = kernel_setsockopt(sock, SOL_SCTP, SCTP_NODELAY, (char *)&one,
    - sizeof(one));
    - if (result < 0)
    - log_print("Could not set SCTP NODELAY error %d\n", result);
    + sctp_sock_set_nodelay(sock->sk, true);

    write_lock_bh(&sock->sk->sk_callback_lock);
    /* Init con struct */
    diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
    index f702b14d768ba..b505fa082f254 100644
    --- a/include/net/sctp/sctp.h
    +++ b/include/net/sctp/sctp.h
    @@ -617,5 +617,6 @@ static inline bool sctp_newsk_ready(const struct sock *sk)

    int sctp_setsockopt_bindx(struct sock *sk, struct sockaddr *kaddrs,
    int addrs_size, int op);
    +void sctp_sock_set_nodelay(struct sock *sk, bool val);

    #endif /* __net_sctp_h__ */
    diff --git a/net/sctp/socket.c b/net/sctp/socket.c
    index 30c981d9f6158..64c395f7a86d5 100644
    --- a/net/sctp/socket.c
    +++ b/net/sctp/socket.c
    @@ -3066,6 +3066,14 @@ static int sctp_setsockopt_nodelay(struct sock *sk, char __user *optval,
    return 0;
    }

    +void sctp_sock_set_nodelay(struct sock *sk, bool val)
    +{
    + lock_sock(sk);
    + sctp_sk(sk)->nodelay = val;
    + release_sock(sk);
    +}
    +EXPORT_SYMBOL(sctp_sock_set_nodelay);
    +
    /*
    *
    * 7.1.1 SCTP_RTOINFO
    --
    2.26.2
    \
     
     \ /
      Last update: 2020-05-13 08:31    [W:2.190 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site