Date: Mon, 24 Jul 2017 06:19:04 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r321413 - stable/11/usr.sbin/bhyve Message-ID: <201707240619.v6O6J4ZV031347@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Mon Jul 24 06:19:04 2017 New Revision: 321413 URL: https://svnweb.freebsd.org/changeset/base/321413 Log: MFC r305898, r309120, r309121 (by jceel): Add virtio-console support to bhyve. Adds virtio-console device support to bhyve, allowing to create bidirectional character streams between host and guest. Syntax: -s <slotnum>,virtio-console,port1=/path/to/port1.sock,anotherport=... Maximum of 16 ports per device can be created. Every port is named and corresponds to an Unix domain socket created by bhyve. bhyve accepts at most one connection per port at a time. Limitations: - due to lack of destructors of in bhyve, sockets on the filesystem must be cleaned up manually after bhyve exits - there's no way to use "console port" feature, nor the console port resize as of now - emergency write is advertised, but no-op as of now Added: stable/11/usr.sbin/bhyve/pci_virtio_console.c - copied, changed from r305898, head/usr.sbin/bhyve/pci_virtio_console.c Modified: stable/11/usr.sbin/bhyve/Makefile stable/11/usr.sbin/bhyve/virtio.h Directory Properties: stable/11/ (props changed) Modified: stable/11/usr.sbin/bhyve/Makefile ============================================================================== --- stable/11/usr.sbin/bhyve/Makefile Mon Jul 24 06:07:44 2017 (r321412) +++ stable/11/usr.sbin/bhyve/Makefile Mon Jul 24 06:19:04 2017 (r321413) @@ -38,6 +38,7 @@ SRCS= \ pci_lpc.c \ pci_passthru.c \ pci_virtio_block.c \ + pci_virtio_console.c \ pci_virtio_net.c \ pci_virtio_rnd.c \ pci_uart.c \ Copied and modified: stable/11/usr.sbin/bhyve/pci_virtio_console.c (from r305898, head/usr.sbin/bhyve/pci_virtio_console.c) ============================================================================== --- head/usr.sbin/bhyve/pci_virtio_console.c Sat Sep 17 13:48:01 2016 (r305898, copy source) +++ stable/11/usr.sbin/bhyve/pci_virtio_console.c Mon Jul 24 06:19:04 2017 (r321413) @@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$"); #include "pci_emul.h" #include "virtio.h" #include "mevent.h" +#include "sockstream.h" #define VTCON_RINGSZ 64 #define VTCON_MAXPORTS 16 @@ -90,6 +91,7 @@ struct pci_vtcon_port { bool vsp_enabled; bool vsp_console; bool vsp_rx_ready; + bool vsp_open; int vsp_rxq; int vsp_txq; void * vsp_arg; @@ -116,6 +118,7 @@ struct pci_vtcon_softc { char * vsc_rootdir; int vsc_kq; int vsc_nports; + bool vsc_ready; struct pci_vtcon_port vsc_control_port; struct pci_vtcon_port vsc_ports[VTCON_MAXPORTS]; struct pci_vtcon_config *vsc_config; @@ -349,6 +352,7 @@ pci_vtcon_sock_accept(int fd __unused, enum ev_type t sock->vss_open = true; sock->vss_conn_fd = s; sock->vss_conn_evp = mevent_add(s, EVF_READ, pci_vtcon_sock_rx, sock); + pci_vtcon_open_port(sock->vss_port, true); } @@ -412,16 +416,21 @@ pci_vtcon_sock_tx(struct pci_vtcon_port *port, void *a int niov) { struct pci_vtcon_sock *sock; - int ret; + int i, ret; sock = (struct pci_vtcon_sock *)arg; if (sock->vss_conn_fd == -1) return; - ret = writev(sock->vss_conn_fd, iov, niov); + for (i = 0; i < niov; i++) { + ret = stream_write(sock->vss_conn_fd, iov[i].iov_base, + iov[i].iov_len); + if (ret <= 0) + break; + } - if (ret < 0 && errno != EWOULDBLOCK) { + if (ret <= 0) { mevent_delete_close(sock->vss_conn_evp); sock->vss_conn_fd = -1; sock->vss_open = false; @@ -444,11 +453,15 @@ pci_vtcon_control_tx(struct pci_vtcon_port *port, void switch (ctrl->event) { case VTCON_DEVICE_READY: + sc->vsc_ready = true; /* set port ready events for registered ports */ for (i = 0; i < VTCON_MAXPORTS; i++) { tmp = &sc->vsc_ports[i]; if (tmp->vsp_enabled) pci_vtcon_announce_port(tmp); + + if (tmp->vsp_open) + pci_vtcon_open_port(tmp, true); } break; @@ -489,6 +502,11 @@ static void pci_vtcon_open_port(struct pci_vtcon_port *port, bool open) { struct pci_vtcon_control event; + + if (!port->vsp_sc->vsc_ready) { + port->vsp_open = true; + return; + } event.id = port->vsp_id; event.event = VTCON_PORT_OPEN; Modified: stable/11/usr.sbin/bhyve/virtio.h ============================================================================== --- stable/11/usr.sbin/bhyve/virtio.h Mon Jul 24 06:07:44 2017 (r321412) +++ stable/11/usr.sbin/bhyve/virtio.h Mon Jul 24 06:19:04 2017 (r321413) @@ -210,6 +210,7 @@ struct vring_used { #define VIRTIO_DEV_NET 0x1000 #define VIRTIO_DEV_BLOCK 0x1001 #define VIRTIO_DEV_RANDOM 0x1005 +#define VIRTIO_DEV_CONSOLE 0x1003 /* * PCI config space constants.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201707240619.v6O6J4ZV031347>