From nobody Fri Feb 07 14:47:00 2025 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4YqGyY0zzLz5mHd8; Fri, 07 Feb 2025 14:47:01 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4YqGyX6yyqz3CMs; Fri, 07 Feb 2025 14:47:00 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738939621; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=7GwgPa8BU1zXnjWFhdQ+clPVFV6l81SBT89ULjU5NiA=; b=FCKukP3YgpIvNgHsMx77ZH7/SRQ7jHLR7LTgvqwJu6tF/mgGE+MB4p74wYry2nuYMMs66X DgaJKraJhbd3uLnq3FqW3qV6Kgnu9xwKlkotUUvkq/w2R0/BqcVl+al03NAhjXpXCjA5Gn uRnO51IYP+0oH5N1eZJozrShqsQOrCbofZPZzTHxSf7YKnyPifoOiAU6+xmgtMEtqRRiFN nA+V2KTvoMmpniztUNS+5canpk9WlOvMFnQNmvZyWkQWIVB/3nrMqtWdyzVZtFwp79B4K0 IdEplBRCz3RR2eYGKBm2t1XnZT6XtDzQLl5qPoJpIFH9nezxuI6lpLcQAeNBMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738939621; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=7GwgPa8BU1zXnjWFhdQ+clPVFV6l81SBT89ULjU5NiA=; b=g+15qBppjXClyc3BxdiBum2B7Zn2NFxlFjjtXm3+sQ2n498bIg+PUDg1OGkQi5kKqCPgNL pPykB3rtoKSZSN7P8bd84hWVjs0CETOvDvAdk94FGgs8lGRhSdG2MOs+tgItqdccUATV9F G9pl4ViOgpTezbhIGC2M3Fv4F8qZ5F0KM4SZVlOLYP6qTxB+J2QbbdcdYPpjoc1ROy2zg8 zCnn83uPTpAWoDnvgegqn+WKLEeH93JOifED8UQoxgrthME3zsKIvowFlpUpXnbVe+Sxad aCwhA1sR5JhZV636IRRT3gEA7xKpdutoocZuxTh2dH13Lkq72oTLAMV4OwhigA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1738939621; a=rsa-sha256; cv=none; b=txU7yJkLRyAL2oEmZS0bt0hkCrjaQ848APbI6JyhRJqH/eq0Zsp9pkVPN9J6Tk5OboKfOh +dcTzloY88kFI5SBll1pYzU6MaDeOUcgLGrskBR4qbhV/NX2DJGpxoUGDLi4k+hPASxDhy vs6GbKj6OFGkUzOddEvvcNtWfYsBnAERMuPz/XIUXy9nzzZ7K4MOx5gzmWEFoEBKWM319o XMd+z1BDI3BQ//SLEL4zkcplJz2R3mBBygfY8ei45AuXS8GUDIU1vsqkwCeU1GZ37Ac/zR /ZNk2/msDhQYzfRKM4ky/bAtXystJNFhOp1GgDtTrAo5HUiDO1BMCh17HzrEgQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4YqGyX5tMwzDHV; Fri, 07 Feb 2025 14:47:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 517El0KM002785; Fri, 7 Feb 2025 14:47:00 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 517El0KL002782; Fri, 7 Feb 2025 14:47:00 GMT (envelope-from git) Date: Fri, 7 Feb 2025 14:47:00 GMT Message-Id: <202502071447.517El0KL002782@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Mark Johnston Subject: git: f34a651bc988 - stable/14 - bhyve: Use a non-blocking read in slirp_recv() List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: f34a651bc98881ab352132496e82acb960c321a3 Auto-Submitted: auto-generated The branch stable/14 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=f34a651bc98881ab352132496e82acb960c321a3 commit f34a651bc98881ab352132496e82acb960c321a3 Author: Mark Johnston AuthorDate: 2025-01-07 14:33:06 +0000 Commit: Mark Johnston CommitDate: 2025-02-07 14:46:53 +0000 bhyve: Use a non-blocking read in slirp_recv() When using the slirp backend with the e1000 frontend, I otherwise get hangs in readv(), caused by the e1000 emulation not checking whether bytes are available before trying to read them. In particular, that device model expects the recv callback to return 0 if no bytes are available, and with slirp it would end up blocking forever. The virtio device model uses the peek_recvlen to check first, so I didn't notice the problem when implementing the slirp backend. Make the slirp backend more flexible to accommodate e1000. MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D48164 (cherry picked from commit d3bdfa583044dbfb76ef777939b86bb68baebee7) --- usr.sbin/bhyve/net_backend_slirp.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/usr.sbin/bhyve/net_backend_slirp.c b/usr.sbin/bhyve/net_backend_slirp.c index 1d6ed45b90f2..45139214afd6 100644 --- a/usr.sbin/bhyve/net_backend_slirp.c +++ b/usr.sbin/bhyve/net_backend_slirp.c @@ -609,11 +609,22 @@ static ssize_t slirp_recv(struct net_backend *be, const struct iovec *iov, int iovcnt) { struct slirp_priv *priv = NET_BE_PRIV(be); + struct msghdr hdr; ssize_t n; - n = readv(priv->pipe[0], iov, iovcnt); - if (n < 0) + hdr.msg_name = NULL; + hdr.msg_namelen = 0; + hdr.msg_iov = __DECONST(struct iovec *, iov); + hdr.msg_iovlen = iovcnt; + hdr.msg_control = NULL; + hdr.msg_controllen = 0; + hdr.msg_flags = 0; + n = recvmsg(priv->pipe[0], &hdr, MSG_DONTWAIT); + if (n < 0) { + if (errno == EWOULDBLOCK) + return (0); return (-1); + } assert(n <= SLIRP_MTU); return (n); }