On Thu, Aug 11, 2016 at 11:33:59AM -0400, Aaron Conole wrote: > Ben Pfaff <b...@ovn.org> writes: > > > On Mon, Aug 01, 2016 at 08:24:40AM -0400, Aaron Conole wrote: > >> Aaron Conole <acon...@redhat.com> writes: > >> > >> > Currently, when using Open vSwitch with DPDK and qemu guests, the > >> > recommended > >> > method for joining the guests is via the dpdkvhostuser interface. This > >> > interface uses Unix Domain sockets to communicate. When these sockets are > >> > created, they inherit the permissions and ownership from the > >> > vswitchd process. > >> > This can lead to an undesirable state where the QEMU process cannot use > >> > the > >> > socket file until manual intervention is performed (via `chown` > >> > and/or `chmod` > >> > calls). > >> > > >> > This patchset gives the ability to set the permissions and ownership of > >> > all > >> > dpdkvhostuser sockets from the database, avoiding the manual intervention > >> > required to connect QEMU and OVS via DPDK. > >> > > >> > The first patch adds chmod and chown calls to lib, with unit tests. The > >> > second patch hooks those calls into the netdev_dpdk_vhost_user_construct > >> > function, after the socket is created. > >> > > >> > Changes from v2: > >> > * Added a new 2nd patch to series for chmod/chown on already opened > >> > files. > >> > There exist known implementations for other systems, including > >> > FreeBSD, but > >> > only linux is implemented. ENOTSUP is set when these calls fail > >> > on non-linux > >> > systems. > >> > >> Ping. I was hoping to have this applied before the 2.6 branch was cut; > >> is that possible? > > > > The code in patch 2, which goes through every fd in /proc to find the > > socket it needs because DPDK will not tell it the fd and will not set > > the needed permissions, is appalling. It may be the biggest kluge I've > > seen this year. > > Ouch. I'm sure that's an accomplishment I don't want associated with my > name. Do you take issue with the design (I agree it's awful to need > anything like this)? Did the implementation really smell that bad?
It's not about the code (and it's certainly not ad hominem). It's about the whole technique. The idea of opening a socket, then scanning the whole fd table by reading through the file system to determine the number of the fd that was opened, is appalling. > > This would be slightly less appalling if it used fstat() and > > getsockname() instead of /proc. Still not great. > > I disagree - patch 2/3 wouldn't exist. [...] The approach I was talking about was to scan the fd table using a loop over the valid fds, calling fstat() on each to find out whether it's a socket then getsockname() to find out whether it's the right socket. Come to think of it, I don't know what happens if you try to getsockname() on a socket whose name is longer than whatever fits in sockaddr_un. Dammit. > [...] That goes to the last sentence > in this. Both of those calls will work for a descriptor (and notice > that patch 1/3 uses them). The issue I have is trying to go from a > pathname to a descriptor (which is not a standardized interface for a > plethora of reasons). If I had the descriptor, though, patch 2/3 would > never have been submitted (because it would be unneeded - I do > fchmod/fchown in patch 1/3). Yes, right. I understand the problem, I just don't understand why it exists. The DPDK maintainers can solve it instantly in 5 minutes of work. > > This definitely needs comments to explain why it exists and what it's > > doing. Thanks for the explanation. In this case, I meant that the *code* needs to have comments, since it had none. It took quite a while from looking at the code to figure out what was going on, and longer to figure out why. Comments should make this obvious to the reader. [...] > > This could be properly fixed in DPDK by adding a 1-line helper function > > that returns the fd for a vhost-user server. > > +1 > I agree strongly. However, Christian Ehrhardt and myself have each > submitted patches[5][6] to try and make this kind of thing non-odius. > These patches have not been accepted. Neither of those is a simple "return server->listen_fd;" function. Any chance that would be accepted? It would solve the problem just fine. > If you think that patch 2/3 is that maloderous that it cannot be > accepted, then there will always probably be this kind of disjointed > file-system permissions gap for vhost-user server mode interfaces. > Unless you have a better suggestion - I'm all ears then :) I do have one suggestion. Something like this: for (int i = 0; i < 10; i++) { /* Find the first available file descriptor, then close it. */ int fd = socket(...); close(fd); /* Create server socket. */ server = dpdk_create_server_socket(filename, ...); /* Check that fd is the new server socket fd. * This is normally true unless some other thread created a fd * concurrently. */ struct stat s; struct sockaddr_un sun; socklen_t sun_len = sizeof sun; if (!stat(fd, &s) && S_ISSOCK(s.st_mode) && getsockname(fd, &sun, &sun_len) && !strcmp(filename, sun.sun_path)) { /* Yay, we found the fd. */ return success; } /* Race. Try again. */ dpdk_close_server_socket(server); } _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev