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