svn commit: r309402 - stable/11/usr.sbin/bhyve

Julian Elischer julian at FreeBSD.org
Fri Dec 2 08:24:01 UTC 2016


Author: julian
Date: Fri Dec  2 08:24:00 2016
New Revision: 309402
URL: https://svnweb.freebsd.org/changeset/base/309402

Log:
  MFH: r309295
  
  bhyve: stability and performance improvement for dbgport
  
  The TCP server implementation in dbgport does not track clients, so it
  may try to write to a disconected socket resulting in SIGPIPE.
  Avoid that by setting SO_NOSIGPIPE socket option.
  
  Because dbgport emulates an I/O port to guest, the communication is done
  byte by byte.  Reduce latency of the TCP/IP transfers by using
  TCP_NODELAY option.  In my tests that change improves performance of
  kgdb commands with lots of output (e.g. info threads) by two orders of
  magnitude.
  
  A general note.  Since we have a uart emulation in bhyve, that can be
  used for the console and gdb access to guests.  So, bvmconsole and bvmdebug
  could be de-orbited now.  But there are many existing deployments that
  still dependend on those.
  
  Discussed with:	julian, jhb
  Sponsored by:	Panzura

Modified:
  stable/11/usr.sbin/bhyve/dbgport.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/usr.sbin/bhyve/dbgport.c
==============================================================================
--- stable/11/usr.sbin/bhyve/dbgport.c	Fri Dec  2 08:21:25 2016	(r309401)
+++ stable/11/usr.sbin/bhyve/dbgport.c	Fri Dec  2 08:24:00 2016	(r309402)
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <netinet/tcp.h>
 #include <sys/uio.h>
 
 #include <stdio.h>
@@ -55,8 +56,9 @@ static int
 dbg_handler(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
 	    uint32_t *eax, void *arg)
 {
-	char ch;
 	int nwritten, nread, printonce;
+	int on = 1;
+	char ch;
 
 	if (bytes == 2 && in) {
 		*eax = BVM_DBG_SIG;
@@ -74,8 +76,16 @@ again:
 			printonce = 1;
 		}
 		conn_fd = accept4(listen_fd, NULL, NULL, SOCK_NONBLOCK);
-		if (conn_fd < 0 && errno != EINTR)
+		if (conn_fd >= 0) {
+			/* Avoid EPIPE after the client drops off. */
+			(void)setsockopt(conn_fd, SOL_SOCKET, SO_NOSIGPIPE,
+			    &on, sizeof(on));
+			/* Improve latency for one byte at a time tranfers. */
+			(void)setsockopt(conn_fd, IPPROTO_TCP, TCP_NODELAY,
+			    &on, sizeof(on));
+		} else if (errno != EINTR) {
 			perror("accept");
+		}
 	}
 
 	if (in) {


More information about the svn-src-all mailing list