On Thu, Mar 18, 2021 at 08:47:12PM +0100, Ilya Maximets wrote: > On 3/18/21 6:52 PM, Stefan Hajnoczi wrote: > > On Wed, Mar 17, 2021 at 09:25:26PM +0100, Ilya Maximets wrote: > >> And some housekeeping usually required for applications in case the > >> socket server terminated abnormally and socket files left on a file > >> system: > >> "failed to bind to vhu: Address already in use; remove it and try again" > > > > QEMU avoids this by unlinking before binding. The drawback is that users > > might accidentally hijack an existing listen socket, but that can be > > solved with a pidfile. > > How exactly this could be solved with a pidfile? A pidfile prevents two instances of the same service from running at the same time. The same effect can be achieved by the container orchestrator, systemd, etc too because it refuses to run the same service twice. > And what if this is > a different application that tries to create a socket on a same path? > e.g. QEMU creates a socket (started in a server mode) and user > accidentally created dpdkvhostuser port in Open vSwitch instead of > dpdkvhostuserclient. This way rte_vhost library will try to bind > to an existing socket file and will fail. Subsequently port creation > in OVS will fail. We can't allow OVS to unlink files because this > way OVS users will have ability to unlink random sockets that OVS has > access to and we also has no idea if it's a QEMU that created a file > or it was a virtio-user application or someone else. If rte_vhost unlinks the socket then the user will find that networking doesn't work. They can either hot unplug the QEMU vhost-user-net device or restart QEMU, depending on whether they need to keep the guest running or not. This is a misconfiguration that is recoverable. Regarding letting OVS unlink files, I agree that it shouldn't if this create a security issue. I don't know the security model of OVS. > There are, probably, ways to detect if there is any alive process that > has this socket open, but that sounds like too much for this purpose, > also I'm not sure if it's possible if actual user is in a different > container. > So I don't see a good reliable way to detect these conditions. This > falls on shoulders of a higher level management software or a user to > clean these socket files up before adding ports. Does OVS always run in the same net namespace (pod) as the DPDK application? If yes, then abstract AF_UNIX sockets can be used. Abstract AF_UNIX sockets don't have a filesystem path and the socket address disappears when there is no process listening anymore. > >> This patch-set aims to eliminate most of the inconveniences by > >> leveraging an infrastructure service provided by a SocketPair Broker. > > > > I don't understand yet why this is useful for vhost-user, where the > > creation of the vhost-user device backend and its use by a VMM are > > closely managed by one piece of software: > > > > 1. Unlink the socket path. > > 2. Create, bind, and listen on the socket path. > > 3. Instantiate the vhost-user device backend (e.g. talk to DPDK/SPDK > > RPC, spawn a process, etc) and pass in the listen fd. > > 4. In the meantime the VMM can open the socket path and call connect(2). > > As soon as the vhost-user device backend calls accept(2) the > > connection will proceed (there is no need for sleeping). > > > > This approach works across containers without a broker. > > Not sure if I fully understood a question here, but anyway. > > This approach works fine if you know what application to run. > In case of a k8s cluster, it might be a random DPDK application > with virtio-user ports running inside a container and want to > have a network connection. Also, this application needs to run > virtio-user in server mode, otherwise restart of the OVS will > require restart of the application. So, you basically need to > rely on a third-party application to create a socket with a right > name and in a correct location that is shared with a host, so > OVS can find it and connect. > > In a VM world everything is much more simple, since you have > a libvirt and QEMU that will take care of all of these stuff > and which are also under full control of management software > and a system administrator. > In case of a container with a "random" DPDK application inside > there is no such entity that can help. Of course, some solution > might be implemented in docker/podman daemon to create and manage > outside-looking sockets for an application inside the container, > but that is not available today AFAIK and I'm not sure if it > ever will. Wait, when you say there is no entity like management software or a system administrator, then how does OVS know to instantiate the new port? I guess something still needs to invoke ovs-ctl add-port? Can you describe the steps used today (without the broker) for instantiating a new DPDK app container and connecting it to OVS? Although my interest is in the vhost-user protocol I think it's necessary to understand the OVS requirements here and I know little about them. Stefan