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) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to