net: rock: Look up the ctl FD with the listen FD (XCC) 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>
diff --git a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/Versions b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/Versions index bdce76f..3a8d19f 100644 --- a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/Versions +++ b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/Versions
@@ -60,7 +60,7 @@ register_close_cb; register_fork_cb; - _sock_lookup_listen_fd; + _sock_lookup_rock_fds; get_sibling_fd; write_hex_to_fd;
diff --git a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/plan9_sockets.c b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/plan9_sockets.c index 9f2ea48..a7303dd 100644 --- a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/plan9_sockets.c +++ b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/plan9_sockets.c
@@ -351,19 +351,21 @@ 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. */
diff --git a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/sys/plan9_helpers.h b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/sys/plan9_helpers.h index 74d2f70..a67a8b8 100644 --- a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/sys/plan9_helpers.h +++ b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/sys/plan9_helpers.h
@@ -75,7 +75,8 @@ 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);
diff --git a/user/iplib/epoll.c b/user/iplib/epoll.c index a25fc79..8890eb1 100644 --- a/user/iplib/epoll.c +++ b/user/iplib/epoll.c
@@ -357,7 +357,7 @@ 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 @@ * 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 @@ 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 @@ * 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