svn commit: r309121 - head/usr.sbin/bhyve

Jakub Wojciech Klama jceel at FreeBSD.org
Thu Nov 24 22:16:19 UTC 2016


Author: jceel
Date: Thu Nov 24 22:16:18 2016
New Revision: 309121
URL: https://svnweb.freebsd.org/changeset/base/309121

Log:
  virtio_console: handle short writes to an Unix domain socket gracefully.
  
  writev() can do a short write.  Retrying it results in a very convoluted
  and complex code, so we iterate over iovec and do regular stream_write()
  instead.
  
  Approved by:	trasz
  Sponsored by:	iXsystems, Inc.

Modified:
  head/usr.sbin/bhyve/pci_virtio_console.c

Modified: head/usr.sbin/bhyve/pci_virtio_console.c
==============================================================================
--- head/usr.sbin/bhyve/pci_virtio_console.c	Thu Nov 24 21:53:42 2016	(r309120)
+++ head/usr.sbin/bhyve/pci_virtio_console.c	Thu Nov 24 22:16:18 2016	(r309121)
@@ -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
@@ -425,16 +426,21 @@ pci_vtcon_sock_tx(struct pci_vtcon_port 
     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;


More information about the svn-src-head mailing list