Message ID | 20200520195509.2215098-32-hch@lst.de (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | [01/33] dlm: use the tcp version of accept_from_sock for sctp as well | expand |
On Wed, May 20, 2020 at 09:55:07PM +0200, Christoph Hellwig wrote: > 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 | 7 +++++++ > 2 files changed, 9 insertions(+), 8 deletions(-) > > diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c > index 69333728d871b..9f1c3cdc9d653 100644 > --- a/fs/dlm/lowcomms.c > +++ b/fs/dlm/lowcomms.c > @@ -914,7 +914,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; > @@ -961,8 +960,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); > > /* > * Make sock->ops->connect() function return in specified time, > @@ -1176,7 +1174,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; > @@ -1191,10 +1188,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); > > 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 3ab5c6bbb90bd..f8bcb75bb0448 100644 > --- a/include/net/sctp/sctp.h > +++ b/include/net/sctp/sctp.h > @@ -615,4 +615,11 @@ static inline bool sctp_newsk_ready(const struct sock *sk) > return sock_flag(sk, SOCK_DEAD) || sk->sk_socket; > } > > +static inline void sctp_sock_set_nodelay(struct sock *sk) > +{ > + lock_sock(sk); > + sctp_sk(sk)->nodelay = true; > + release_sock(sk); > +} > + The duplication with sctp_setsockopt_nodelay() is quite silly/bad. Also, why have the 'true' hardcoded? It's what dlm uses, yes, but the API could be a bit more complete than that. Like for the other patch, this one could build on David's patch, do the ternary check before calling sctp_setsockopt_nodelay and then move sctp_setsockopt_nodelay to the header, or something like that.
From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Date: Wed, 20 May 2020 20:10:01 -0300 > The duplication with sctp_setsockopt_nodelay() is quite silly/bad. > Also, why have the 'true' hardcoded? It's what dlm uses, yes, but the > API could be a bit more complete than that. The APIs are being designed based upon what in-tree users actually make use of. We can expand things later if necessary.
On Wed, May 20, 2020 at 04:23:55PM -0700, David Miller wrote: > From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> > Date: Wed, 20 May 2020 20:10:01 -0300 > > > The duplication with sctp_setsockopt_nodelay() is quite silly/bad. > > Also, why have the 'true' hardcoded? It's what dlm uses, yes, but the > > API could be a bit more complete than that. > > The APIs are being designed based upon what in-tree users actually > make use of. We can expand things later if necessary. Sometimes expanding things later can be though, thus why the worry. But ok, I get it. Thanks. The comment still applies, though. (re the duplication)
On Wed, May 20, 2020 at 08:39:13PM -0300, Marcelo Ricardo Leitner wrote: > On Wed, May 20, 2020 at 04:23:55PM -0700, David Miller wrote: > > From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> > > Date: Wed, 20 May 2020 20:10:01 -0300 > > > > > The duplication with sctp_setsockopt_nodelay() is quite silly/bad. > > > Also, why have the 'true' hardcoded? It's what dlm uses, yes, but the > > > API could be a bit more complete than that. > > > > The APIs are being designed based upon what in-tree users actually > > make use of. We can expand things later if necessary. > > Sometimes expanding things later can be though, thus why the worry. > But ok, I get it. Thanks. > > The comment still applies, though. (re the duplication) Where do you see duplication? sctp_setsockopt_nodelay does the following things: - verifies optlen, returns -EINVAL if it doesn't match - calls get_user, returns -EFAULT on error - converts the value from get_user to a boolean and assigns it to sctp_sk(sk)->nodelay - returns 0. sctp_sock_set_nodelay does: - call lock_sock - assign true to sctp_sk(sk)->nodelay - call release_sock - does not return an error code
From: Christoph Hellwig > Sent: 21 May 2020 09:35 > On Wed, May 20, 2020 at 08:39:13PM -0300, Marcelo Ricardo Leitner wrote: > > On Wed, May 20, 2020 at 04:23:55PM -0700, David Miller wrote: > > > From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> > > > Date: Wed, 20 May 2020 20:10:01 -0300 > > > > > > > The duplication with sctp_setsockopt_nodelay() is quite silly/bad. > > > > Also, why have the 'true' hardcoded? It's what dlm uses, yes, but the > > > > API could be a bit more complete than that. > > > > > > The APIs are being designed based upon what in-tree users actually > > > make use of. We can expand things later if necessary. > > > > Sometimes expanding things later can be though, thus why the worry. > > But ok, I get it. Thanks. > > > > The comment still applies, though. (re the duplication) > > Where do you see duplication? The whole thing just doesn't scale. As soon as you get to the slightly more complex requests like SCTP_INITMSG (which should probably be called to set the required number of data streams) you've either got replicated code or nested wrappers. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
On Thu, May 21, 2020 at 09:06:19AM +0000, David Laight wrote: > > > The comment still applies, though. (re the duplication) > > > > Where do you see duplication? > > The whole thing just doesn't scale. > > As soon as you get to the slightly more complex requests > like SCTP_INITMSG (which should probably be called to > set the required number of data streams) you've either > got replicated code or nested wrappers. None of that is relevant to setting the nodelay option. If you actually read through the series you'd say that whenever there was non-trivial logic it is shared with getopt. However sharing just for purpose of sharing doesn't make sense, so where the kernel API ended up just setting a flag after taking the sock lock I did not opt for it.
On Thu, May 21, 2020 at 10:34:42AM +0200, Christoph Hellwig wrote: > On Wed, May 20, 2020 at 08:39:13PM -0300, Marcelo Ricardo Leitner wrote: > > On Wed, May 20, 2020 at 04:23:55PM -0700, David Miller wrote: > > > From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> > > > Date: Wed, 20 May 2020 20:10:01 -0300 > > > > > > > The duplication with sctp_setsockopt_nodelay() is quite silly/bad. > > > > Also, why have the 'true' hardcoded? It's what dlm uses, yes, but the > > > > API could be a bit more complete than that. > > > > > > The APIs are being designed based upon what in-tree users actually > > > make use of. We can expand things later if necessary. > > > > Sometimes expanding things later can be though, thus why the worry. > > But ok, I get it. Thanks. > > > > The comment still applies, though. (re the duplication) > > Where do you see duplication? > > sctp_setsockopt_nodelay does the following things: > > - verifies optlen, returns -EINVAL if it doesn't match > - calls get_user, returns -EFAULT on error > - converts the value from get_user to a boolean and assigns it > to sctp_sk(sk)->nodelay > - returns 0. > > sctp_sock_set_nodelay does: > > - call lock_sock > - assign true to sctp_sk(sk)->nodelay > - call release_sock > - does not return an error code With the patch there are now two ways of enabling nodelay. It may be just a boolean set today, but if one wants to probe on it or if we want to extend it with anything, say a debug msg, we have to do it in two (very different) places.
On Thu, May 21, 2020 at 10:33:48AM -0300, Marcelo Ricardo Leitner wrote:
> With the patch there are now two ways of enabling nodelay.
There is exactly one way to do for user applications, and one way
for kernel drivers. (actually they could just set the field directly,
which no one does for sctp, but for ipv4 a few do just that).
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index 69333728d871b..9f1c3cdc9d653 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c @@ -914,7 +914,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; @@ -961,8 +960,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); /* * Make sock->ops->connect() function return in specified time, @@ -1176,7 +1174,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; @@ -1191,10 +1188,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); 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 3ab5c6bbb90bd..f8bcb75bb0448 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h @@ -615,4 +615,11 @@ static inline bool sctp_newsk_ready(const struct sock *sk) return sock_flag(sk, SOCK_DEAD) || sk->sk_socket; } +static inline void sctp_sock_set_nodelay(struct sock *sk) +{ + lock_sock(sk); + sctp_sk(sk)->nodelay = true; + release_sock(sk); +} + #endif /* __net_sctp_h__ */
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 | 7 +++++++ 2 files changed, 9 insertions(+), 8 deletions(-)