Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 2 Dec 2016 08:21:25 +0000 (UTC)
From:      Julian Elischer <julian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r309401 - stable/10/usr.sbin/bhyve
Message-ID:  <201612020821.uB28LPJk000249@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: julian
Date: Fri Dec  2 08:21:25 2016
New Revision: 309401
URL: https://svnweb.freebsd.org/changeset/base/309401

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/10/usr.sbin/bhyve/dbgport.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/usr.sbin/bhyve/dbgport.c
==============================================================================
--- stable/10/usr.sbin/bhyve/dbgport.c	Fri Dec  2 08:21:08 2016	(r309400)
+++ stable/10/usr.sbin/bhyve/dbgport.c	Fri Dec  2 08:21:25 2016	(r309401)
@@ -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) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201612020821.uB28LPJk000249>