From: Christoph Hellwig <hch@lst.de>
To: "David S. Miller" <davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>,
Jakub Kicinski <kuba-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
rds-devel-N0ozoZBvEnrZJqsBc5GL+g@public.gmane.org,
cluster-devel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
Hideaki YOSHIFUJI
<yoshfuji-VfPWfsRibaP+Ru+s062T9g@public.gmane.org>,
netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-nvme-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
Jon Maloy <jmaloy-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Eric Dumazet <edumazet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
target-devel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
tipc-discussion-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Ying Xue <ying.xue-CWA4WttNNZF54TAoqtyWWQ@public.gmane.org>,
Alexey Kuznetsov <kuznet-v/Mj1YrvjDBInbfyfbPRSQ@public.gmane.org>,
ceph-devel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-afs-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
ocfs2-devel-N0ozoZBvEnrZJqsBc5GL+g@public.gmane.org,
drbd-dev-cunTk1MwBs8qoQakbn7OcQ@public.gmane.org
Subject: [Ocfs2-devel] [PATCH 08/28] net: add sock_set_rcvbuf
Date: Thu, 28 May 2020 07:12:16 +0200 [thread overview]
Message-ID: <20200528051236.620353-9-hch@lst.de> (raw)
In-Reply-To: <20200528051236.620353-1-hch@lst.de>
Add a helper to directly set the SO_RCVBUFFORCE sockopt from kernel space
without going through a fake uaccess.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/dlm/lowcomms.c | 7 +-----
include/net/sock.h | 1 +
net/core/sock.c | 59 +++++++++++++++++++++++++---------------------
3 files changed, 34 insertions(+), 33 deletions(-)
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index 138009c6a2ee1..45c37f572c9d2 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -1297,7 +1297,6 @@ static int sctp_listen_for_all(void)
struct socket *sock = NULL;
int result = -EINVAL;
struct connection *con = nodeid2con(0, GFP_NOFS);
- int bufsize = NEEDED_RMEM;
int one = 1;
if (!con)
@@ -1312,11 +1311,7 @@ static int sctp_listen_for_all(void)
goto out;
}
- result = kernel_setsockopt(sock, SOL_SOCKET, SO_RCVBUFFORCE,
- (char *)&bufsize, sizeof(bufsize));
- if (result)
- log_print("Error increasing buffer space on socket %d", result);
-
+ sock_set_rcvbuf(sock->sk, NEEDED_RMEM);
result = kernel_setsockopt(sock, SOL_SCTP, SCTP_NODELAY, (char *)&one,
sizeof(one));
if (result < 0)
diff --git a/include/net/sock.h b/include/net/sock.h
index dc08c176238fd..c997289aabbf9 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -2693,6 +2693,7 @@ void sock_enable_timestamps(struct sock *sk);
void sock_no_linger(struct sock *sk);
void sock_set_keepalive(struct sock *sk);
void sock_set_priority(struct sock *sk, u32 priority);
+void sock_set_rcvbuf(struct sock *sk, int val);
void sock_set_reuseaddr(struct sock *sk);
void sock_set_sndtimeo(struct sock *sk, s64 secs);
diff --git a/net/core/sock.c b/net/core/sock.c
index 728f5fb156a0c..3c6ebf952e9ad 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -789,6 +789,35 @@ void sock_set_keepalive(struct sock *sk)
}
EXPORT_SYMBOL(sock_set_keepalive);
+static void __sock_set_rcvbuf(struct sock *sk, int val)
+{
+ /* Ensure val * 2 fits into an int, to prevent max_t() from treating it
+ * as a negative value.
+ */
+ val = min_t(int, val, INT_MAX / 2);
+ sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
+
+ /* We double it on the way in to account for "struct sk_buff" etc.
+ * overhead. Applications assume that the SO_RCVBUF setting they make
+ * will allow that much actual data to be received on that socket.
+ *
+ * Applications are unaware that "struct sk_buff" and other overheads
+ * allocate from the receive buffer during socket buffer allocation.
+ *
+ * And after considering the possible alternatives, returning the value
+ * we actually used in getsockopt is the most desirable behavior.
+ */
+ WRITE_ONCE(sk->sk_rcvbuf, max_t(int, val * 2, SOCK_MIN_RCVBUF));
+}
+
+void sock_set_rcvbuf(struct sock *sk, int val)
+{
+ lock_sock(sk);
+ __sock_set_rcvbuf(sk, val);
+ release_sock(sk);
+}
+EXPORT_SYMBOL(sock_set_rcvbuf);
+
/*
* This is meant for all protocols to use and covers goings on
* at the socket level. Everything here is generic.
@@ -885,30 +914,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
* play 'guess the biggest size' games. RCVBUF/SNDBUF
* are treated in BSD as hints
*/
- val = min_t(u32, val, sysctl_rmem_max);
-set_rcvbuf:
- /* Ensure val * 2 fits into an int, to prevent max_t()
- * from treating it as a negative value.
- */
- val = min_t(int, val, INT_MAX / 2);
- sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
- /*
- * We double it on the way in to account for
- * "struct sk_buff" etc. overhead. Applications
- * assume that the SO_RCVBUF setting they make will
- * allow that much actual data to be received on that
- * socket.
- *
- * Applications are unaware that "struct sk_buff" and
- * other overheads allocate from the receive buffer
- * during socket buffer allocation.
- *
- * And after considering the possible alternatives,
- * returning the value we actually used in getsockopt
- * is the most desirable behavior.
- */
- WRITE_ONCE(sk->sk_rcvbuf,
- max_t(int, val * 2, SOCK_MIN_RCVBUF));
+ __sock_set_rcvbuf(sk, min_t(u32, val, sysctl_rmem_max));
break;
case SO_RCVBUFFORCE:
@@ -920,9 +926,8 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
/* No negative values (to prevent underflow, as val will be
* multiplied by 2).
*/
- if (val < 0)
- val = 0;
- goto set_rcvbuf;
+ __sock_set_rcvbuf(sk, max(val, 0));
+ break;
case SO_KEEPALIVE:
if (sk->sk_prot->keepalive)
--
2.26.2
next prev parent reply other threads:[~2020-05-28 5:12 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-28 5:12 [Ocfs2-devel] remove most callers of kernel_setsockopt v3 Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 01/28] net: add sock_set_reuseaddr Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 02/28] net: add sock_no_linger Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 03/28] net: add sock_set_priority Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 04/28] net: add sock_set_sndtimeo Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 05/28] net: add sock_bindtoindex Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 06/28] net: add sock_enable_timestamps Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 07/28] net: add sock_set_keepalive Christoph Hellwig
2020-05-28 5:12 ` Christoph Hellwig [this message]
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 09/28] net: add sock_set_reuseport Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 10/28] tcp: add tcp_sock_set_cork Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 11/28] tcp: add tcp_sock_set_nodelay Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 12/28] tcp: add tcp_sock_set_quickack Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 13/28] tcp: add tcp_sock_set_syncnt Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 14/28] tcp: add tcp_sock_set_user_timeout Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 15/28] tcp: add tcp_sock_set_keepidle Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 16/28] tcp: add tcp_sock_set_keepintvl Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 17/28] tcp: add tcp_sock_set_keepcnt Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 18/28] ipv4: add ip_sock_set_tos Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 19/28] ipv4: add ip_sock_set_freebind Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 20/28] ipv4: add ip_sock_set_recverr Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 21/28] ipv4: add ip_sock_set_mtu_discover Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 22/28] ipv4: add ip_sock_set_pktinfo Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 23/28] ipv6: add ip6_sock_set_v6only Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 24/28] ipv6: add ip6_sock_set_recverr Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 25/28] ipv6: add ip6_sock_set_addr_preferences Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 26/28] ipv6: add ip6_sock_set_recvpktinfo Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 27/28] rxrpc: add rxrpc_sock_set_min_security_level Christoph Hellwig
2020-05-28 5:12 ` [Ocfs2-devel] [PATCH 28/28] tipc: call tsk_set_importance from tipc_topsrv_create_listener Christoph Hellwig
2020-05-28 18:12 ` [Ocfs2-devel] remove most callers of kernel_setsockopt v3 David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200528051236.620353-9-hch@lst.de \
--to=hch@lst.de \
--cc=ceph-devel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=cluster-devel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org \
--cc=drbd-dev-cunTk1MwBs8qoQakbn7OcQ@public.gmane.org \
--cc=edumazet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=jmaloy-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=kuba-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=kuznet-v/Mj1YrvjDBInbfyfbPRSQ@public.gmane.org \
--cc=linux-afs-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-nvme-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=ocfs2-devel-N0ozoZBvEnrZJqsBc5GL+g@public.gmane.org \
--cc=rds-devel-N0ozoZBvEnrZJqsBc5GL+g@public.gmane.org \
--cc=target-devel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=tipc-discussion-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
--cc=ying.xue-CWA4WttNNZF54TAoqtyWWQ@public.gmane.org \
--cc=yoshfuji-VfPWfsRibaP+Ru+s062T9g@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).