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

Ian Lepore ian at freebsd.org
Thu Nov 24 22:24:06 UTC 2016


On Thu, 2016-11-24 at 22:16 +0000, Jakub Wojciech Klama wrote:
> 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.
>   

Doesn't pwritev(2) simplify iterating to handle short writes?

-- Ian


>   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-all mailing list