LVS
lvs-devel
Google
 
Web LinuxVirtualServer.org

[PATCH 02/26] net/bpfilter: split __bpfilter_process_sockopt

To: "David S. Miller" <davem@xxxxxxxxxxxxx>, Jakub Kicinski <kuba@xxxxxxxxxx>, Alexei Starovoitov <ast@xxxxxxxxxx>, Daniel Borkmann <daniel@xxxxxxxxxxxxx>, Alexey Kuznetsov <kuznet@xxxxxxxxxxxxx>, Hideaki YOSHIFUJI <yoshfuji@xxxxxxxxxxxxxx>, Eric Dumazet <edumazet@xxxxxxxxxx>
Subject: [PATCH 02/26] net/bpfilter: split __bpfilter_process_sockopt
Cc: linux-crypto@xxxxxxxxxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, netdev@xxxxxxxxxxxxxxx, bpf@xxxxxxxxxxxxxxx, netfilter-devel@xxxxxxxxxxxxxxx, coreteam@xxxxxxxxxxxxx, linux-sctp@xxxxxxxxxxxxxxx, linux-hams@xxxxxxxxxxxxxxx, linux-bluetooth@xxxxxxxxxxxxxxx, bridge@xxxxxxxxxxxxxxxxxxxxxxxxxx, linux-can@xxxxxxxxxxxxxxx, dccp@xxxxxxxxxxxxxxx, linux-decnet-user@xxxxxxxxxxxxxxxxxxxxx, linux-wpan@xxxxxxxxxxxxxxx, linux-s390@xxxxxxxxxxxxxxx, mptcp@xxxxxxxxxxxx, lvs-devel@xxxxxxxxxxxxxxx, rds-devel@xxxxxxxxxxxxxx, linux-afs@xxxxxxxxxxxxxxxxxxx, tipc-discussion@xxxxxxxxxxxxxxxxxxxxx, linux-x25@xxxxxxxxxxxxxxx
From: Christoph Hellwig <hch@xxxxxx>
Date: Thu, 23 Jul 2020 08:08:44 +0200
Split __bpfilter_process_sockopt into a low-level send request routine and
the actual setsockopt hook to split the init time ping from the actual
setsockopt processing.

Signed-off-by: Christoph Hellwig <hch@xxxxxx>
---
 net/bpfilter/bpfilter_kern.c | 51 +++++++++++++++++++-----------------
 1 file changed, 27 insertions(+), 24 deletions(-)

diff --git a/net/bpfilter/bpfilter_kern.c b/net/bpfilter/bpfilter_kern.c
index 3bac5820062af1..78d561f2c54da7 100644
--- a/net/bpfilter/bpfilter_kern.c
+++ b/net/bpfilter/bpfilter_kern.c
@@ -31,48 +31,51 @@ static void __stop_umh(void)
                shutdown_umh();
 }
 
-static int __bpfilter_process_sockopt(struct sock *sk, int optname,
-                                     char __user *optval,
-                                     unsigned int optlen, bool is_set)
+static int bpfilter_send_req(struct mbox_request *req)
 {
-       struct mbox_request req;
        struct mbox_reply reply;
        loff_t pos;
        ssize_t n;
-       int ret = -EFAULT;
 
-       req.is_set = is_set;
-       req.pid = current->pid;
-       req.cmd = optname;
-       req.addr = (uintptr_t)optval;
-       req.len = optlen;
        if (!bpfilter_ops.info.tgid)
-               goto out;
+               return -EFAULT;
        pos = 0;
-       n = kernel_write(bpfilter_ops.info.pipe_to_umh, &req, sizeof(req),
+       n = kernel_write(bpfilter_ops.info.pipe_to_umh, req, sizeof(*req),
                           &pos);
-       if (n != sizeof(req)) {
+       if (n != sizeof(*req)) {
                pr_err("write fail %zd\n", n);
-               __stop_umh();
-               ret = -EFAULT;
-               goto out;
+               goto stop;
        }
        pos = 0;
        n = kernel_read(bpfilter_ops.info.pipe_from_umh, &reply, sizeof(reply),
                        &pos);
        if (n != sizeof(reply)) {
                pr_err("read fail %zd\n", n);
-               __stop_umh();
-               ret = -EFAULT;
-               goto out;
+               goto stop;
        }
-       ret = reply.status;
-out:
-       return ret;
+       return reply.status;
+stop:
+       __stop_umh();
+       return -EFAULT;
+}
+
+static int bpfilter_process_sockopt(struct sock *sk, int optname,
+                                   char __user *optval, unsigned int optlen,
+                                   bool is_set)
+{
+       struct mbox_request req = {
+               .is_set         = is_set,
+               .pid            = current->pid,
+               .cmd            = optname,
+               .addr           = (uintptr_t)optval,
+               .len            = optlen,
+       };
+       return bpfilter_send_req(&req);
 }
 
 static int start_umh(void)
 {
+       struct mbox_request req = { .pid = current->pid };
        int err;
 
        /* fork usermode process */
@@ -82,7 +85,7 @@ static int start_umh(void)
        pr_info("Loaded bpfilter_umh pid %d\n", pid_nr(bpfilter_ops.info.tgid));
 
        /* health check that usermode process started correctly */
-       if (__bpfilter_process_sockopt(NULL, 0, NULL, 0, 0) != 0) {
+       if (bpfilter_send_req(&req) != 0) {
                shutdown_umh();
                return -EFAULT;
        }
@@ -103,7 +106,7 @@ static int __init load_umh(void)
        mutex_lock(&bpfilter_ops.lock);
        err = start_umh();
        if (!err && IS_ENABLED(CONFIG_INET)) {
-               bpfilter_ops.sockopt = &__bpfilter_process_sockopt;
+               bpfilter_ops.sockopt = &bpfilter_process_sockopt;
                bpfilter_ops.start = &start_umh;
        }
        mutex_unlock(&bpfilter_ops.lock);
-- 
2.27.0


<Prev in Thread] Current Thread [Next in Thread>