net: rock: Look up the ctl FD with the listen FD (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 15 Dec 2017 21:31:22 +0000 (16:31 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 20 Dec 2017 18:37:08 +0000 (13:37 -0500)
Epoll may need to tap all three FDs when tapping a socket/rock.  This is
the glibc portion of the change - epoll still taps only the listen FD.
Even if we don't use this for epoll, tracking the ctlfd doesn't hurt and
may prove useful.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/Versions
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/plan9_sockets.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/sys/plan9_helpers.h
user/iplib/epoll.c

index bdce76f..3a8d19f 100644 (file)
@@ -60,7 +60,7 @@ libc {
     register_close_cb;
     register_fork_cb;
 
-    _sock_lookup_listen_fd;
+    _sock_lookup_rock_fds;
     get_sibling_fd;
     write_hex_to_fd;
 
index 9f2ea48..a7303dd 100644 (file)
@@ -351,19 +351,21 @@ static int _rock_open_listen_fd(Rock *r)
        return ret;
 }
 
-/* Used by user/iplib (e.g. epoll).  Returns an FD for the listen file, opened
- * O_PATH, for this conversation.  Returns -1 on error. */
-int _sock_lookup_listen_fd(int sock_fd, bool can_open)
+/* Used by user/iplib (e.g. epoll).  Returns the FDs for the ctl_fd and for the
+ * listen file, opened O_PATH, for this conversation.  Returns -1 on no FDs. */
+void _sock_lookup_rock_fds(int sock_fd, bool can_open_listen_fd,
+                           int *listen_fd_r, int *ctl_fd_r)
 {
        Rock *r = _sock_findrock(sock_fd, 0);
 
+       *listen_fd_r = -1;
+       *ctl_fd_r = -1;
        if (!r || r->domain == PF_UNIX)
-               return -1;
-       if (r->has_listen_fd)
-               return r->listen_fd;
-       if (!can_open)
-               return -1;
-       return _rock_open_listen_fd(r);
+               return;
+       if (!r->has_listen_fd && can_open_listen_fd)
+               _rock_open_listen_fd(r);
+       *listen_fd_r = r->listen_fd;    /* might still be -1.  that's OK. */
+       *ctl_fd_r = r->ctl_fd;
 }
 
 /* Used by fcntl for F_SETFL. */
index 74d2f70..a67a8b8 100644 (file)
@@ -75,7 +75,8 @@ extern void _sock_ingetaddr(Rock *, struct sockaddr_in *, socklen_t *,
                                                        const char *);
 extern int _sock_strip_opts(int type);
 extern int _sock_get_opts(int type);
-extern int _sock_lookup_listen_fd(int sock_fd, bool can_open);
+extern void _sock_lookup_rock_fds(int sock_fd, bool can_open_listen_fd,
+                                  int *listen_fd_r, int *ctl_fd_r);
 extern void _sock_mirror_fcntl(int sock_fd, int cmd, long arg);
 
 int get_sibling_fd(int fd, const char *sibling);
index a25fc79..8890eb1 100644 (file)
@@ -357,7 +357,7 @@ static int __epoll_ctl_add(struct epoll_ctlr *ep, int fd,
        struct ceq_event *ceq_ev;
        struct ep_fd_data *ep_fd;
        struct fd_tap_req tap_req = {0};
-       int ret, filter, sock_listen_fd;
+       int ret, filter, sock_listen_fd, sock_ctl_fd;
        struct epoll_event listen_event;
 
        /* Only support ET.  Also, we just ignore EPOLLONESHOT.  That might work,
@@ -386,7 +386,7 @@ static int __epoll_ctl_add(struct epoll_ctlr *ep, int fd,
         * As far as tracking the FD goes for epoll_wait() reporting, if the app
         * wants to track the FD they think we are using, then they already passed
         * that in event->data. */
-       sock_listen_fd = _sock_lookup_listen_fd(fd, TRUE);
+       _sock_lookup_rock_fds(fd, TRUE, &sock_listen_fd, &sock_ctl_fd);
        if (sock_listen_fd >= 0) {
                listen_event.events = EPOLLET | EPOLLIN | EPOLLHUP;
                listen_event.data = event->data;
@@ -431,7 +431,7 @@ static int __epoll_ctl_del(struct epoll_ctlr *ep, int fd,
        struct ceq_event *ceq_ev;
        struct ep_fd_data *ep_fd;
        struct fd_tap_req tap_req = {0};
-       int ret, sock_listen_fd;
+       int ret, sock_listen_fd, sock_ctl_fd;
 
        /* If we were dealing with a socket shim FD, we tapped both the listen and
         * the data file and need to untap both of them.
@@ -440,7 +440,7 @@ static int __epoll_ctl_del(struct epoll_ctlr *ep, int fd,
         * In that case, we don't want to try and open it.  If the listen FD isn't
         * open, then we know it isn't in an epoll set.  We also know the data FD
         * isn't epolled either, since we always epoll both FDs for rocks. */
-       sock_listen_fd = _sock_lookup_listen_fd(fd, FALSE);
+       _sock_lookup_rock_fds(fd, FALSE, &sock_listen_fd, &sock_ctl_fd);
        if (sock_listen_fd >= 0) {
                /* It's possible to fail here.  Even though we tapped it already, if the
                 * deletion was triggered from close callbacks, it's possible for the