sync with OpenBSD -current

This commit is contained in:
purplerain 2024-05-04 16:43:11 +00:00
parent c9341f2e4a
commit 22b3fbc138
Signed by: purplerain
GPG Key ID: F42C07F07E2E35B7
14 changed files with 148 additions and 125 deletions

View File

@ -1,4 +1,4 @@
/* $OpenBSD: a_time_tm.c,v 1.38 2024/04/11 06:49:19 tb Exp $ */ /* $OpenBSD: a_time_tm.c,v 1.42 2024/05/03 18:33:27 tb Exp $ */
/* /*
* Copyright (c) 2015 Bob Beck <beck@openbsd.org> * Copyright (c) 2015 Bob Beck <beck@openbsd.org>
* *
@ -88,9 +88,6 @@ tm_to_gentime(struct tm *tm, ASN1_TIME *atime)
return 0; return 0;
} }
if (atime == NULL)
return 1;
if (asprintf(&time_str, "%04u%02u%02u%02u%02u%02uZ", tm->tm_year + 1900, if (asprintf(&time_str, "%04u%02u%02u%02u%02u%02uZ", tm->tm_year + 1900,
tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min,
tm->tm_sec) == -1) { tm->tm_sec) == -1) {
@ -117,9 +114,6 @@ tm_to_utctime(struct tm *tm, ASN1_TIME *atime)
return 0; return 0;
} }
if (atime == NULL)
return 1;
if (asprintf(&time_str, "%02u%02u%02u%02u%02u%02uZ", if (asprintf(&time_str, "%02u%02u%02u%02u%02u%02uZ",
tm->tm_year % 100, tm->tm_mon + 1, tm->tm_mday, tm->tm_year % 100, tm->tm_mon + 1, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec) == -1) { tm->tm_hour, tm->tm_min, tm->tm_sec) == -1) {
@ -293,7 +287,6 @@ asn1_time_parse_cbs(const CBS *cbs, int is_gentime, struct tm *out_tm)
int int
ASN1_time_parse(const char *bytes, size_t len, struct tm *tm, int mode) ASN1_time_parse(const char *bytes, size_t len, struct tm *tm, int mode)
{ {
struct tm tml, *tmp = tm ? tm : &tml;
int type = 0; int type = 0;
CBS cbs; CBS cbs;
@ -306,7 +299,7 @@ ASN1_time_parse(const char *bytes, size_t len, struct tm *tm, int mode)
type = V_ASN1_UTCTIME; type = V_ASN1_UTCTIME;
if (CBS_len(&cbs) == GENTIME_LENGTH) if (CBS_len(&cbs) == GENTIME_LENGTH)
type = V_ASN1_GENERALIZEDTIME; type = V_ASN1_GENERALIZEDTIME;
if (asn1_time_parse_cbs(&cbs, type == V_ASN1_GENERALIZEDTIME, tmp)) { if (asn1_time_parse_cbs(&cbs, type == V_ASN1_GENERALIZEDTIME, tm)) {
if (mode != 0 && mode != type) if (mode != 0 && mode != type)
return -1; return -1;
return type; return type;
@ -323,15 +316,19 @@ static int
ASN1_TIME_set_string_internal(ASN1_TIME *s, const char *str, int mode) ASN1_TIME_set_string_internal(ASN1_TIME *s, const char *str, int mode)
{ {
struct tm tm; struct tm tm;
int type;
if ((type = ASN1_time_parse(str, strlen(str), &tm, mode)) == -1) if (ASN1_time_parse(str, strlen(str), &tm, mode) == -1)
return 0; return 0;
/* Only check str's format, as documented. */
if (s == NULL)
return 1;
switch (mode) { switch (mode) {
case V_ASN1_UTCTIME: case V_ASN1_UTCTIME:
return type == mode && tm_to_utctime(&tm, s); return tm_to_utctime(&tm, s);
case V_ASN1_GENERALIZEDTIME: case V_ASN1_GENERALIZEDTIME:
return type == mode && tm_to_gentime(&tm, s); return tm_to_gentime(&tm, s);
case RFC5280: case RFC5280:
return tm_to_rfc5280_time(&tm, s); return tm_to_rfc5280_time(&tm, s);
default: default:

View File

@ -16,12 +16,18 @@ static inline bool
static_cpu_has(uint16_t f) static_cpu_has(uint16_t f)
{ {
switch (f) { switch (f) {
case X86_FEATURE_CLFLUSH:
return curcpu()->ci_cflushsz != 0;
case X86_FEATURE_XMM4_1: case X86_FEATURE_XMM4_1:
return (cpu_ecxfeature & CPUIDECX_SSE41) != 0; return (cpu_ecxfeature & CPUIDECX_SSE41) != 0;
#ifdef __amd64__
case X86_FEATURE_CLFLUSH:
case X86_FEATURE_PAT:
return true;
#else
case X86_FEATURE_CLFLUSH:
return curcpu()->ci_cflushsz != 0;
case X86_FEATURE_PAT: case X86_FEATURE_PAT:
return (curcpu()->ci_feature_flags & CPUID_PAT) != 0; return (curcpu()->ci_feature_flags & CPUID_PAT) != 0;
#endif
case X86_FEATURE_HYPERVISOR: case X86_FEATURE_HYPERVISOR:
return (cpu_ecxfeature & CPUIDECX_HV) != 0; return (cpu_ecxfeature & CPUIDECX_HV) != 0;
default: default:
@ -32,7 +38,7 @@ static_cpu_has(uint16_t f)
static inline bool static inline bool
pat_enabled(void) pat_enabled(void)
{ {
return ((curcpu()->ci_feature_flags & CPUID_PAT) != 0); return static_cpu_has(X86_FEATURE_PAT);
} }
#define boot_cpu_has(x) static_cpu_has(x) #define boot_cpu_has(x) static_cpu_has(x)

View File

@ -1,4 +1,4 @@
/* $OpenBSD: if_igc.c,v 1.20 2024/04/12 19:27:43 jan Exp $ */ /* $OpenBSD: if_igc.c,v 1.21 2024/05/04 13:35:26 mbuhl Exp $ */
/*- /*-
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
* *
@ -44,10 +44,14 @@
#include <net/if.h> #include <net/if.h>
#include <net/if_media.h> #include <net/if_media.h>
#include <net/route.h>
#include <net/toeplitz.h> #include <net/toeplitz.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <netinet/if_ether.h> #include <netinet/if_ether.h>
#include <netinet/tcp.h>
#include <netinet/tcp_timer.h>
#include <netinet/tcp_var.h>
#if NBPFILTER > 0 #if NBPFILTER > 0
#include <net/bpf.h> #include <net/bpf.h>
@ -796,6 +800,7 @@ igc_setup_interface(struct igc_softc *sc)
ifp->if_capabilities |= IFCAP_CSUM_IPv4; ifp->if_capabilities |= IFCAP_CSUM_IPv4;
ifp->if_capabilities |= IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4; ifp->if_capabilities |= IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
ifp->if_capabilities |= IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6; ifp->if_capabilities |= IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6;
ifp->if_capabilities |= IFCAP_TSOv4 | IFCAP_TSOv6;
/* Initialize ifmedia structures. */ /* Initialize ifmedia structures. */
ifmedia_init(&sc->media, IFM_IMASK, igc_media_change, igc_media_status); ifmedia_init(&sc->media, IFM_IMASK, igc_media_change, igc_media_status);
@ -2025,13 +2030,11 @@ igc_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp, int prod,
{ {
struct ether_extracted ext; struct ether_extracted ext;
struct igc_adv_tx_context_desc *txdesc; struct igc_adv_tx_context_desc *txdesc;
uint32_t mss_l4len_idx = 0;
uint32_t type_tucmd_mlhl = 0; uint32_t type_tucmd_mlhl = 0;
uint32_t vlan_macip_lens = 0; uint32_t vlan_macip_lens = 0;
int off = 0; int off = 0;
ether_extract_headers(mp, &ext);
vlan_macip_lens |= (sizeof(*ext.eh) << IGC_ADVTXD_MACLEN_SHIFT);
/* /*
* In advanced descriptors the vlan tag must * In advanced descriptors the vlan tag must
* be placed into the context descriptor. Hence * be placed into the context descriptor. Hence
@ -2046,6 +2049,10 @@ igc_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp, int prod,
} }
#endif #endif
ether_extract_headers(mp, &ext);
vlan_macip_lens |= (sizeof(*ext.eh) << IGC_ADVTXD_MACLEN_SHIFT);
if (ext.ip4) { if (ext.ip4) {
type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_IPV4; type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_IPV4;
if (ISSET(mp->m_pkthdr.csum_flags, M_IPV4_CSUM_OUT)) { if (ISSET(mp->m_pkthdr.csum_flags, M_IPV4_CSUM_OUT)) {
@ -2075,6 +2082,30 @@ igc_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp, int prod,
} }
} }
if (ISSET(mp->m_pkthdr.csum_flags, M_TCP_TSO)) {
if (ext.tcp) {
uint32_t hdrlen, thlen, paylen, outlen;
thlen = ext.tcphlen;
outlen = mp->m_pkthdr.ph_mss;
mss_l4len_idx |= outlen << IGC_ADVTXD_MSS_SHIFT;
mss_l4len_idx |= thlen << IGC_ADVTXD_L4LEN_SHIFT;
hdrlen = sizeof(*ext.eh) + ext.iphlen + thlen;
paylen = mp->m_pkthdr.len - hdrlen;
CLR(*olinfo_status, IGC_ADVTXD_PAYLEN_MASK);
*olinfo_status |= paylen << IGC_ADVTXD_PAYLEN_SHIFT;
*cmd_type_len |= IGC_ADVTXD_DCMD_TSE;
off = 1;
tcpstat_add(tcps_outpkttso,
(paylen + outlen - 1) / outlen);
} else
tcpstat_inc(tcps_outbadtso);
}
if (off == 0) if (off == 0)
return 0; return 0;
@ -2085,7 +2116,7 @@ igc_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp, int prod,
htolem32(&txdesc->vlan_macip_lens, vlan_macip_lens); htolem32(&txdesc->vlan_macip_lens, vlan_macip_lens);
htolem32(&txdesc->type_tucmd_mlhl, type_tucmd_mlhl); htolem32(&txdesc->type_tucmd_mlhl, type_tucmd_mlhl);
htolem32(&txdesc->seqnum_seed, 0); htolem32(&txdesc->seqnum_seed, 0);
htolem32(&txdesc->mss_l4len_idx, 0); htolem32(&txdesc->mss_l4len_idx, mss_l4len_idx);
return 1; return 1;
} }

View File

@ -1,4 +1,4 @@
/* $OpenBSD: igc_base.h,v 1.2 2024/03/25 20:25:13 mbuhl Exp $ */ /* $OpenBSD: igc_base.h,v 1.3 2024/05/04 13:35:26 mbuhl Exp $ */
/*- /*-
* Copyright 2021 Intel Corp * Copyright 2021 Intel Corp
* Copyright 2021 Rubicon Communications, LLC (Netgate) * Copyright 2021 Rubicon Communications, LLC (Netgate)
@ -66,6 +66,7 @@ struct igc_adv_tx_context_desc {
#define IGC_ADVTXD_POPTS_ISCO_FULL 0x00001800 #define IGC_ADVTXD_POPTS_ISCO_FULL 0x00001800
#define IGC_ADVTXD_POPTS_IPSEC 0x00000400 /* IPSec offload request */ #define IGC_ADVTXD_POPTS_IPSEC 0x00000400 /* IPSec offload request */
#define IGC_ADVTXD_PAYLEN_SHIFT 14 /* Adv desc PAYLEN shift */ #define IGC_ADVTXD_PAYLEN_SHIFT 14 /* Adv desc PAYLEN shift */
#define IGC_ADVTXD_PAYLEN_MASK 0xFFFFD000 /* Adv desc PAYLEN shift */
/* Advanced Transmit Context Descriptor Config */ /* Advanced Transmit Context Descriptor Config */
#define IGC_ADVTXD_MACLEN_SHIFT 9 /* Adv ctxt desc mac len shift */ #define IGC_ADVTXD_MACLEN_SHIFT 9 /* Adv ctxt desc mac len shift */

View File

@ -1,4 +1,4 @@
/* $OpenBSD: uipc_socket.c,v 1.332 2024/05/02 11:55:31 mvs Exp $ */ /* $OpenBSD: uipc_socket.c,v 1.333 2024/05/03 17:43:09 mvs Exp $ */
/* $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $ */ /* $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $ */
/* /*
@ -159,14 +159,15 @@ soalloc(const struct protosw *prp, int wait)
case AF_INET6: case AF_INET6:
switch (prp->pr_type) { switch (prp->pr_type) {
case SOCK_RAW: case SOCK_RAW:
so->so_snd.sb_flags |= SB_MTXLOCK | SB_OWNLOCK; so->so_snd.sb_flags |= SB_MTXLOCK;
/* FALLTHROUGH */ /* FALLTHROUGH */
case SOCK_DGRAM: case SOCK_DGRAM:
so->so_rcv.sb_flags |= SB_MTXLOCK | SB_OWNLOCK; so->so_rcv.sb_flags |= SB_MTXLOCK;
break; break;
} }
break; break;
case AF_UNIX: case AF_UNIX:
so->so_snd.sb_flags |= SB_MTXLOCK;
so->so_rcv.sb_flags |= SB_MTXLOCK; so->so_rcv.sb_flags |= SB_MTXLOCK;
break; break;
} }
@ -354,18 +355,16 @@ sofree(struct socket *so, int keep_lock)
mtx_leave(&so->so_snd.sb_mtx); mtx_leave(&so->so_snd.sb_mtx);
/* /*
* Regardless on '_locked' postfix, must release solock() before * Unlocked dispose and cleanup is safe. Socket is unlinked
* call sorflush_locked() for SB_OWNLOCK marked socket. Can't * from everywhere. Even concurrent sotask() thread will not
* release solock() and call sorflush() because solock() release * call somove().
* is unwanted for tcp(4) socket.
*/ */
if (so->so_proto->pr_flags & PR_RIGHTS &&
so->so_proto->pr_domain->dom_dispose)
(*so->so_proto->pr_domain->dom_dispose)(so->so_rcv.sb_mb);
m_purge(so->so_rcv.sb_mb);
if (so->so_rcv.sb_flags & SB_OWNLOCK) if (!keep_lock)
sounlock(so);
sorflush_locked(so);
if (!((so->so_rcv.sb_flags & SB_OWNLOCK) || keep_lock))
sounlock(so); sounlock(so);
#ifdef SOCKET_SPLICE #ifdef SOCKET_SPLICE
@ -574,7 +573,7 @@ sosend(struct socket *so, struct mbuf *addr, struct uio *uio, struct mbuf *top,
size_t resid; size_t resid;
int error; int error;
int atomic = sosendallatonce(so) || top; int atomic = sosendallatonce(so) || top;
int dosolock = ((so->so_snd.sb_flags & SB_OWNLOCK) == 0); int dosolock = ((so->so_snd.sb_flags & SB_MTXLOCK) == 0);
if (uio) if (uio)
resid = uio->uio_resid; resid = uio->uio_resid;
@ -846,7 +845,7 @@ soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio,
const struct protosw *pr = so->so_proto; const struct protosw *pr = so->so_proto;
struct mbuf *nextrecord; struct mbuf *nextrecord;
size_t resid, orig_resid = uio->uio_resid; size_t resid, orig_resid = uio->uio_resid;
int dosolock = ((so->so_rcv.sb_flags & SB_OWNLOCK) == 0); int dosolock = ((so->so_rcv.sb_flags & SB_MTXLOCK) == 0);
mp = mp0; mp = mp0;
if (paddr) if (paddr)
@ -945,7 +944,7 @@ restart:
SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 1"); SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 1");
SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 1"); SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 1");
if (so->so_rcv.sb_flags & (SB_MTXLOCK | SB_OWNLOCK)) { if (so->so_rcv.sb_flags & SB_MTXLOCK) {
sbunlock_locked(so, &so->so_rcv); sbunlock_locked(so, &so->so_rcv);
if (dosolock) if (dosolock)
sounlock_shared(so); sounlock_shared(so);
@ -1247,7 +1246,11 @@ dontblock:
SBLASTMBUFCHK(&so->so_rcv, "soreceive 4"); SBLASTMBUFCHK(&so->so_rcv, "soreceive 4");
if (pr->pr_flags & PR_WANTRCVD) { if (pr->pr_flags & PR_WANTRCVD) {
sb_mtx_unlock(&so->so_rcv); sb_mtx_unlock(&so->so_rcv);
if (!dosolock)
solock_shared(so);
pru_rcvd(so); pru_rcvd(so);
if (!dosolock)
sounlock_shared(so);
sb_mtx_lock(&so->so_rcv); sb_mtx_lock(&so->so_rcv);
} }
} }
@ -1306,17 +1309,17 @@ sorflush_locked(struct socket *so)
const struct protosw *pr = so->so_proto; const struct protosw *pr = so->so_proto;
int error; int error;
if ((sb->sb_flags & SB_OWNLOCK) == 0) if ((sb->sb_flags & SB_MTXLOCK) == 0)
soassertlocked(so); soassertlocked(so);
error = sblock(so, sb, SBL_WAIT | SBL_NOINTR); error = sblock(so, sb, SBL_WAIT | SBL_NOINTR);
/* with SBL_WAIT and SLB_NOINTR sblock() must not fail */ /* with SBL_WAIT and SLB_NOINTR sblock() must not fail */
KASSERT(error == 0); KASSERT(error == 0);
if (sb->sb_flags & SB_OWNLOCK) if (sb->sb_flags & SB_MTXLOCK)
solock(so); solock(so);
socantrcvmore(so); socantrcvmore(so);
if (sb->sb_flags & SB_OWNLOCK) if (sb->sb_flags & SB_MTXLOCK)
sounlock(so); sounlock(so);
mtx_enter(&sb->sb_mtx); mtx_enter(&sb->sb_mtx);
@ -1334,10 +1337,10 @@ sorflush_locked(struct socket *so)
void void
sorflush(struct socket *so) sorflush(struct socket *so)
{ {
if ((so->so_rcv.sb_flags & SB_OWNLOCK) == 0) if ((so->so_rcv.sb_flags & SB_MTXLOCK) == 0)
solock_shared(so); solock_shared(so);
sorflush_locked(so); sorflush_locked(so);
if ((so->so_rcv.sb_flags & SB_OWNLOCK) == 0) if ((so->so_rcv.sb_flags & SB_MTXLOCK) == 0)
sounlock_shared(so); sounlock_shared(so);
} }
@ -1383,7 +1386,7 @@ sosplice(struct socket *so, int fd, off_t max, struct timeval *tv)
membar_consumer(); membar_consumer();
} }
if (so->so_rcv.sb_flags & SB_OWNLOCK) { if (so->so_rcv.sb_flags & SB_MTXLOCK) {
if ((error = sblock(so, &so->so_rcv, SBL_WAIT)) != 0) if ((error = sblock(so, &so->so_rcv, SBL_WAIT)) != 0)
return (error); return (error);
solock(so); solock(so);
@ -1471,7 +1474,7 @@ sosplice(struct socket *so, int fd, off_t max, struct timeval *tv)
release: release:
sbunlock(sosp, &sosp->so_snd); sbunlock(sosp, &sosp->so_snd);
out: out:
if (so->so_rcv.sb_flags & SB_OWNLOCK) { if (so->so_rcv.sb_flags & SB_MTXLOCK) {
sounlock(so); sounlock(so);
sbunlock(so, &so->so_rcv); sbunlock(so, &so->so_rcv);
} else { } else {
@ -1885,6 +1888,7 @@ sorwakeup(struct socket *so)
void void
sowwakeup(struct socket *so) sowwakeup(struct socket *so)
{ {
if ((so->so_snd.sb_flags & SB_MTXLOCK) == 0)
soassertlocked_readonly(so); soassertlocked_readonly(so);
#ifdef SOCKET_SPLICE #ifdef SOCKET_SPLICE
@ -1976,7 +1980,7 @@ sosetopt(struct socket *so, int level, int optname, struct mbuf *m)
if ((long)cnt <= 0) if ((long)cnt <= 0)
cnt = 1; cnt = 1;
if (((sb->sb_flags & SB_OWNLOCK) == 0)) if (((sb->sb_flags & SB_MTXLOCK) == 0))
solock(so); solock(so);
mtx_enter(&sb->sb_mtx); mtx_enter(&sb->sb_mtx);
@ -2003,7 +2007,7 @@ sosetopt(struct socket *so, int level, int optname, struct mbuf *m)
} }
mtx_leave(&sb->sb_mtx); mtx_leave(&sb->sb_mtx);
if (((sb->sb_flags & SB_OWNLOCK) == 0)) if (((sb->sb_flags & SB_MTXLOCK) == 0))
sounlock(so); sounlock(so);
break; break;
@ -2380,6 +2384,7 @@ filt_sowrite(struct knote *kn, long hint)
int rv; int rv;
MUTEX_ASSERT_LOCKED(&so->so_snd.sb_mtx); MUTEX_ASSERT_LOCKED(&so->so_snd.sb_mtx);
if ((so->so_snd.sb_flags & SB_MTXLOCK) == 0)
soassertlocked_readonly(so); soassertlocked_readonly(so);
kn->kn_data = sbspace(so, &so->so_snd); kn->kn_data = sbspace(so, &so->so_snd);

View File

@ -1,4 +1,4 @@
/* $OpenBSD: uipc_socket2.c,v 1.152 2024/05/02 21:26:52 mvs Exp $ */ /* $OpenBSD: uipc_socket2.c,v 1.153 2024/05/03 17:43:09 mvs Exp $ */
/* $NetBSD: uipc_socket2.c,v 1.11 1996/02/04 02:17:55 christos Exp $ */ /* $NetBSD: uipc_socket2.c,v 1.11 1996/02/04 02:17:55 christos Exp $ */
/* /*
@ -228,9 +228,10 @@ sonewconn(struct socket *head, int connstatus, int wait)
*/ */
if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat)) if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat))
goto fail; goto fail;
mtx_enter(&head->so_snd.sb_mtx);
so->so_snd.sb_wat = head->so_snd.sb_wat; so->so_snd.sb_wat = head->so_snd.sb_wat;
so->so_snd.sb_lowat = head->so_snd.sb_lowat; so->so_snd.sb_lowat = head->so_snd.sb_lowat;
mtx_enter(&head->so_snd.sb_mtx);
so->so_snd.sb_timeo_nsecs = head->so_snd.sb_timeo_nsecs; so->so_snd.sb_timeo_nsecs = head->so_snd.sb_timeo_nsecs;
mtx_leave(&head->so_snd.sb_mtx); mtx_leave(&head->so_snd.sb_mtx);
@ -543,7 +544,7 @@ sblock(struct socket *so, struct sockbuf *sb, int flags)
{ {
int error = 0, prio = PSOCK; int error = 0, prio = PSOCK;
if (sb->sb_flags & SB_OWNLOCK) { if (sb->sb_flags & SB_MTXLOCK) {
int rwflags = RW_WRITE; int rwflags = RW_WRITE;
if (!(flags & SBL_NOINTR || sb->sb_flags & SB_NOINTR)) if (!(flags & SBL_NOINTR || sb->sb_flags & SB_NOINTR))
@ -586,7 +587,7 @@ out:
void void
sbunlock_locked(struct socket *so, struct sockbuf *sb) sbunlock_locked(struct socket *so, struct sockbuf *sb)
{ {
if (sb->sb_flags & SB_OWNLOCK) { if (sb->sb_flags & SB_MTXLOCK) {
rw_exit(&sb->sb_lock); rw_exit(&sb->sb_lock);
return; return;
} }
@ -603,7 +604,7 @@ sbunlock_locked(struct socket *so, struct sockbuf *sb)
void void
sbunlock(struct socket *so, struct sockbuf *sb) sbunlock(struct socket *so, struct sockbuf *sb)
{ {
if (sb->sb_flags & SB_OWNLOCK) { if (sb->sb_flags & SB_MTXLOCK) {
rw_exit(&sb->sb_lock); rw_exit(&sb->sb_lock);
return; return;
} }

View File

@ -1,4 +1,4 @@
/* $OpenBSD: uipc_usrreq.c,v 1.205 2024/05/02 17:10:55 mvs Exp $ */ /* $OpenBSD: uipc_usrreq.c,v 1.206 2024/05/03 17:43:09 mvs Exp $ */
/* $NetBSD: uipc_usrreq.c,v 1.18 1996/02/09 19:00:50 christos Exp $ */ /* $NetBSD: uipc_usrreq.c,v 1.18 1996/02/09 19:00:50 christos Exp $ */
/* /*
@ -477,20 +477,24 @@ uipc_dgram_shutdown(struct socket *so)
void void
uipc_rcvd(struct socket *so) uipc_rcvd(struct socket *so)
{ {
struct unpcb *unp = sotounpcb(so);
struct socket *so2; struct socket *so2;
if ((so2 = unp_solock_peer(so)) == NULL) if (unp->unp_conn == NULL)
return; return;
so2 = unp->unp_conn->unp_socket;
/* /*
* Adjust backpressure on sender * Adjust backpressure on sender
* and wakeup any waiting to write. * and wakeup any waiting to write.
*/ */
mtx_enter(&so->so_rcv.sb_mtx); mtx_enter(&so->so_rcv.sb_mtx);
mtx_enter(&so2->so_snd.sb_mtx);
so2->so_snd.sb_mbcnt = so->so_rcv.sb_mbcnt; so2->so_snd.sb_mbcnt = so->so_rcv.sb_mbcnt;
so2->so_snd.sb_cc = so->so_rcv.sb_cc; so2->so_snd.sb_cc = so->so_rcv.sb_cc;
mtx_leave(&so2->so_snd.sb_mtx);
mtx_leave(&so->so_rcv.sb_mtx); mtx_leave(&so->so_rcv.sb_mtx);
sowwakeup(so2); sowwakeup(so2);
sounlock(so2);
} }
int int
@ -509,10 +513,6 @@ uipc_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
goto out; goto out;
} }
if (so->so_snd.sb_state & SS_CANTSENDMORE) {
error = EPIPE;
goto dispose;
}
if (unp->unp_conn == NULL) { if (unp->unp_conn == NULL) {
error = ENOTCONN; error = ENOTCONN;
goto dispose; goto dispose;
@ -525,11 +525,23 @@ uipc_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
* send buffer counts to maintain backpressure. * send buffer counts to maintain backpressure.
* Wake up readers. * Wake up readers.
*/ */
/*
* sbappend*() should be serialized together
* with so_snd modification.
*/
mtx_enter(&so2->so_rcv.sb_mtx); mtx_enter(&so2->so_rcv.sb_mtx);
mtx_enter(&so->so_snd.sb_mtx);
if (so->so_snd.sb_state & SS_CANTSENDMORE) {
mtx_leave(&so->so_snd.sb_mtx);
mtx_leave(&so2->so_rcv.sb_mtx);
error = EPIPE;
goto dispose;
}
if (control) { if (control) {
if (sbappendcontrol(so2, &so2->so_rcv, m, control)) { if (sbappendcontrol(so2, &so2->so_rcv, m, control)) {
control = NULL; control = NULL;
} else { } else {
mtx_leave(&so->so_snd.sb_mtx);
mtx_leave(&so2->so_rcv.sb_mtx); mtx_leave(&so2->so_rcv.sb_mtx);
error = ENOBUFS; error = ENOBUFS;
goto dispose; goto dispose;
@ -542,6 +554,7 @@ uipc_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
so->so_snd.sb_cc = so2->so_rcv.sb_cc; so->so_snd.sb_cc = so2->so_rcv.sb_cc;
if (so2->so_rcv.sb_cc > 0) if (so2->so_rcv.sb_cc > 0)
dowakeup = 1; dowakeup = 1;
mtx_leave(&so->so_snd.sb_mtx);
mtx_leave(&so2->so_rcv.sb_mtx); mtx_leave(&so2->so_rcv.sb_mtx);
if (dowakeup) if (dowakeup)

View File

@ -1,4 +1,4 @@
/* $OpenBSD: fifo_vnops.c,v 1.104 2024/03/26 09:46:47 mvs Exp $ */ /* $OpenBSD: fifo_vnops.c,v 1.105 2024/05/03 17:43:09 mvs Exp $ */
/* $NetBSD: fifo_vnops.c,v 1.18 1996/03/16 23:52:42 christos Exp $ */ /* $NetBSD: fifo_vnops.c,v 1.18 1996/03/16 23:52:42 christos Exp $ */
/* /*
@ -174,10 +174,10 @@ fifo_open(void *v)
return (error); return (error);
} }
fip->fi_readers = fip->fi_writers = 0; fip->fi_readers = fip->fi_writers = 0;
solock(wso); mtx_enter(&wso->so_snd.sb_mtx);
wso->so_snd.sb_state |= SS_CANTSENDMORE; wso->so_snd.sb_state |= SS_CANTSENDMORE;
wso->so_snd.sb_lowat = PIPE_BUF; wso->so_snd.sb_lowat = PIPE_BUF;
sounlock(wso); mtx_leave(&wso->so_snd.sb_mtx);
} else { } else {
rso = fip->fi_readsock; rso = fip->fi_readsock;
wso = fip->fi_writesock; wso = fip->fi_writesock;
@ -185,9 +185,9 @@ fifo_open(void *v)
if (ap->a_mode & FREAD) { if (ap->a_mode & FREAD) {
fip->fi_readers++; fip->fi_readers++;
if (fip->fi_readers == 1) { if (fip->fi_readers == 1) {
solock(wso); mtx_enter(&wso->so_snd.sb_mtx);
wso->so_snd.sb_state &= ~SS_CANTSENDMORE; wso->so_snd.sb_state &= ~SS_CANTSENDMORE;
sounlock(wso); mtx_leave(&wso->so_snd.sb_mtx);
if (fip->fi_writers > 0) if (fip->fi_writers > 0)
wakeup(&fip->fi_writers); wakeup(&fip->fi_writers);
} }
@ -554,7 +554,6 @@ filt_fifowrite(struct knote *kn, long hint)
struct socket *so = kn->kn_hook; struct socket *so = kn->kn_hook;
int rv; int rv;
soassertlocked(so);
MUTEX_ASSERT_LOCKED(&so->so_snd.sb_mtx); MUTEX_ASSERT_LOCKED(&so->so_snd.sb_mtx);
kn->kn_data = sbspace(so, &so->so_snd); kn->kn_data = sbspace(so, &so->so_snd);
@ -625,11 +624,9 @@ filt_fifowmodify(struct kevent *kev, struct knote *kn)
struct socket *so = kn->kn_hook; struct socket *so = kn->kn_hook;
int rv; int rv;
solock(so);
mtx_enter(&so->so_snd.sb_mtx); mtx_enter(&so->so_snd.sb_mtx);
rv = knote_modify(kev, kn); rv = knote_modify(kev, kn);
mtx_leave(&so->so_snd.sb_mtx); mtx_leave(&so->so_snd.sb_mtx);
sounlock(so);
return (rv); return (rv);
} }
@ -640,11 +637,9 @@ filt_fifowprocess(struct knote *kn, struct kevent *kev)
struct socket *so = kn->kn_hook; struct socket *so = kn->kn_hook;
int rv; int rv;
solock(so);
mtx_enter(&so->so_snd.sb_mtx); mtx_enter(&so->so_snd.sb_mtx);
rv = knote_process(kn, kev); rv = knote_process(kn, kev);
mtx_leave(&so->so_snd.sb_mtx); mtx_leave(&so->so_snd.sb_mtx);
sounlock(so);
return (rv); return (rv);
} }

View File

@ -1,4 +1,4 @@
/* $OpenBSD: nfs.h,v 1.53 2017/02/22 11:42:46 mpi Exp $ */ /* $OpenBSD: nfs.h,v 1.54 2024/05/04 10:53:37 jsg Exp $ */
/* $NetBSD: nfs.h,v 1.10.4.1 1996/05/27 11:23:56 fvdl Exp $ */ /* $NetBSD: nfs.h,v 1.10.4.1 1996/05/27 11:23:56 fvdl Exp $ */
/* /*
@ -43,7 +43,6 @@
#define NFS_TIMEO (1 * NFS_HZ) /* Default timeout = 1 second */ #define NFS_TIMEO (1 * NFS_HZ) /* Default timeout = 1 second */
#define NFS_MINTIMEO (1 * NFS_HZ) /* Min timeout to use */ #define NFS_MINTIMEO (1 * NFS_HZ) /* Min timeout to use */
#define NFS_MAXTIMEO (60 * NFS_HZ) /* Max timeout to backoff to */ #define NFS_MAXTIMEO (60 * NFS_HZ) /* Max timeout to backoff to */
#define NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops*/
#define NFS_TIMEOUTMUL 2 /* Timeout/Delay multiplier */ #define NFS_TIMEOUTMUL 2 /* Timeout/Delay multiplier */
#define NFS_MAXREXMIT 100 /* Stop counting after this many */ #define NFS_MAXREXMIT 100 /* Stop counting after this many */
#define NFS_RETRANS 10 /* Num of retrans for soft mounts */ #define NFS_RETRANS 10 /* Num of retrans for soft mounts */
@ -74,19 +73,6 @@
(((n)->nd_flag & ND_NFSV3) ? (((n)->nd_nam2) ? \ (((n)->nd_flag & ND_NFSV3) ? (((n)->nd_nam2) ? \
NFS_MAXDGRAMDATA : NFS_MAXDATA) : NFS_V2MAXDATA) NFS_MAXDGRAMDATA : NFS_MAXDATA) : NFS_V2MAXDATA)
/*
* sys/malloc.h needs M_NFSDIROFF, M_NFSRVDESC and M_NFSBIGFH added.
*/
#ifndef M_NFSRVDESC
#define M_NFSRVDESC M_TEMP
#endif
#ifndef M_NFSDIROFF
#define M_NFSDIROFF M_TEMP
#endif
#ifndef M_NFSBIGFH
#define M_NFSBIGFH M_TEMP
#endif
/* /*
* The B_INVAFTERWRITE flag should be set to whatever is required by the * The B_INVAFTERWRITE flag should be set to whatever is required by the
* buffer cache code to say "Invalidate the block after it is written back". * buffer cache code to say "Invalidate the block after it is written back".
@ -159,13 +145,8 @@ struct nfsstats {
/* /*
* Flags for nfssvc() system call. * Flags for nfssvc() system call.
*/ */
#define NFSSVC_BIOD 0x002
#define NFSSVC_NFSD 0x004 #define NFSSVC_NFSD 0x004
#define NFSSVC_ADDSOCK 0x008 #define NFSSVC_ADDSOCK 0x008
#define NFSSVC_AUTHIN 0x010
#define NFSSVC_GOTAUTH 0x040
#define NFSSVC_AUTHINFAIL 0x080
#define NFSSVC_MNTD 0x100
/* /*
* fs.nfs sysctl(3) identifiers * fs.nfs sysctl(3) identifiers
@ -306,8 +287,6 @@ struct nfsd {
/* Bits for "nfsd_flag" */ /* Bits for "nfsd_flag" */
#define NFSD_WAITING 0x01 #define NFSD_WAITING 0x01
#define NFSD_REQINPROG 0x02 #define NFSD_REQINPROG 0x02
#define NFSD_NEEDAUTH 0x04
#define NFSD_AUTHFAIL 0x08
/* /*
* This structure is used by the server for describing each request. * This structure is used by the server for describing each request.

View File

@ -1,4 +1,4 @@
/* $OpenBSD: nfs_var.h,v 1.64 2024/04/30 17:04:23 miod Exp $ */ /* $OpenBSD: nfs_var.h,v 1.65 2024/05/04 11:25:24 jsg Exp $ */
/* $NetBSD: nfs_var.h,v 1.3 1996/02/18 11:53:54 fvdl Exp $ */ /* $NetBSD: nfs_var.h,v 1.3 1996/02/18 11:53:54 fvdl Exp $ */
/* /*
@ -66,8 +66,6 @@ int nfs_readlinkrpc(struct vnode *, struct uio *, struct ucred *);
int nfs_readrpc(struct vnode *, struct uio *); int nfs_readrpc(struct vnode *, struct uio *);
int nfs_writerpc(struct vnode *, struct uio *, int *, int *); int nfs_writerpc(struct vnode *, struct uio *, int *, int *);
int nfs_removeit(struct sillyrename *); int nfs_removeit(struct sillyrename *);
int nfs_mmap(void *);
int nfs_blkatoff(void *);
int nfs_writebp(struct buf *, int); int nfs_writebp(struct buf *, int);
#define nfs_ioctl ((int (*)(void *))enoioctl) #define nfs_ioctl ((int (*)(void *))enoioctl)
@ -153,7 +151,6 @@ void nfsm_uiotombuf(struct mbuf **, struct uio *, size_t);
void nfsm_strtombuf(struct mbuf **, void *, size_t); void nfsm_strtombuf(struct mbuf **, void *, size_t);
void nfsm_buftombuf(struct mbuf **, void *, size_t); void nfsm_buftombuf(struct mbuf **, void *, size_t);
int nfs_adv(struct mbuf **, caddr_t *, int, int); int nfs_adv(struct mbuf **, caddr_t *, int, int);
int nfsm_strtmbuf(struct mbuf **, char **, char *, long);
int nfs_vfs_init(struct vfsconf *); int nfs_vfs_init(struct vfsconf *);
int nfs_attrtimeo(struct nfsnode *); int nfs_attrtimeo(struct nfsnode *);
int nfs_loadattrcache(struct vnode **, struct mbuf **, caddr_t *, int nfs_loadattrcache(struct vnode **, struct mbuf **, caddr_t *,
@ -190,7 +187,6 @@ void nfsm_srvfhtom(struct mbuf **, fhandle_t *, int);
/* nfs_syscalls.c */ /* nfs_syscalls.c */
int sys_nfssvc(struct proc *, void *, register_t *); int sys_nfssvc(struct proc *, void *, register_t *);
void nfsrv_init(int); void nfsrv_init(int);
void start_nfsio(void *);
void nfs_getset_niothreads(int); void nfs_getset_niothreads(int);
/* nfs_kq.c */ /* nfs_kq.c */

View File

@ -1,4 +1,4 @@
/* $OpenBSD: socketvar.h,v 1.129 2024/04/11 13:32:51 mvs Exp $ */ /* $OpenBSD: socketvar.h,v 1.130 2024/05/03 17:43:09 mvs Exp $ */
/* $NetBSD: socketvar.h,v 1.18 1996/02/09 18:25:38 christos Exp $ */ /* $NetBSD: socketvar.h,v 1.18 1996/02/09 18:25:38 christos Exp $ */
/*- /*-
@ -134,8 +134,7 @@ struct socket {
#define SB_ASYNC 0x0010 /* ASYNC I/O, need signals */ #define SB_ASYNC 0x0010 /* ASYNC I/O, need signals */
#define SB_SPLICE 0x0020 /* buffer is splice source or drain */ #define SB_SPLICE 0x0020 /* buffer is splice source or drain */
#define SB_NOINTR 0x0040 /* operations not interruptible */ #define SB_NOINTR 0x0040 /* operations not interruptible */
#define SB_MTXLOCK 0x0080 /* use sb_mtx for sockbuf protection */ #define SB_MTXLOCK 0x0080 /* sblock() doesn't need solock() */
#define SB_OWNLOCK 0x0100 /* sblock() doesn't need solock() */
void (*so_upcall)(struct socket *so, caddr_t arg, int waitf); void (*so_upcall)(struct socket *so, caddr_t arg, int waitf);
caddr_t so_upcallarg; /* Arg for above */ caddr_t so_upcallarg; /* Arg for above */

View File

@ -1,4 +1,4 @@
.\" $OpenBSD: aucat.1,v 1.120 2024/03/20 08:42:11 ratchov Exp $ .\" $OpenBSD: aucat.1,v 1.121 2024/05/03 16:48:41 ratchov Exp $
.\" .\"
.\" Copyright (c) 2006 Alexandre Ratchov <alex@caoua.org> .\" Copyright (c) 2006 Alexandre Ratchov <alex@caoua.org>
.\" .\"
@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.Dd $Mdocdate: March 20 2024 $ .Dd $Mdocdate: May 3 2024 $
.Dt AUCAT 1 .Dt AUCAT 1
.Os .Os
.Sh NAME .Sh NAME
@ -224,26 +224,26 @@ MIDI control is intended to be used together with
.Xr sndiod 8 . .Xr sndiod 8 .
For instance, the following command will create two devices: For instance, the following command will create two devices:
the default the default
.Va snd/0 .Va snd/default
and a MMC-controlled one and a MMC-controlled one
.Va snd/0.mmc : .Va snd/defaul.mmc :
.Bd -literal -offset indent .Bd -literal -offset indent
$ sndiod -r 48000 -z 480 -s default -t slave -s mmc $ sndiod -r 48000 -z 480 -s default -t slave -s mmc
.Ed .Ed
.Pp .Pp
Programs using Programs using
.Va snd/0 .Va snd/default
behave normally, while programs using behave normally, while programs using
.Va snd/0.mmc .Va snd/mmc
wait for the MMC start signal and start synchronously. wait for the MMC start signal and start synchronously.
Then, the following command will play a file on the Then, the following command will play a file on the
.Va snd/0.mmc .Va snd/mmc
audio device, giving full control to MIDI software or hardware audio device, giving full control to MIDI software or hardware
connected to the connected to the
.Va midithru/0 .Va midithru/0
MIDI port: MIDI port:
.Bd -literal -offset indent .Bd -literal -offset indent
$ aucat -f snd/0.mmc -q midithru/0 -i file.wav $ aucat -f snd/mmc -q midithru/0 -i file.wav
.Ed .Ed
.Pp .Pp
At this stage, At this stage,
@ -253,9 +253,9 @@ actions in the MIDI sequencer, assuming it's configured to
transmit MMC on transmit MMC on
.Va midithru/0 .Va midithru/0
and and
.Va snd/0.mmc . .Va snd/mmc .
Furthermore, the MIDI sequencer could be configured to use the Furthermore, the MIDI sequencer could be configured to use the
.Va snd/0.mmc .Va snd/mmc
port as MTC clock source, assured to be synchronous to playback of port as MTC clock source, assured to be synchronous to playback of
.Pa file.wav . .Pa file.wav .
.Sh EXAMPLES .Sh EXAMPLES

View File

@ -1,4 +1,4 @@
.\" $OpenBSD: sndiod.8,v 1.16 2022/03/07 08:58:33 ratchov Exp $ .\" $OpenBSD: sndiod.8,v 1.17 2024/05/03 16:47:15 ratchov Exp $
.\" .\"
.\" Copyright (c) 2006-2012 Alexandre Ratchov <alex@caoua.org> .\" Copyright (c) 2006-2012 Alexandre Ratchov <alex@caoua.org>
.\" .\"
@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.Dd $Mdocdate: March 7 2022 $ .Dd $Mdocdate: May 3 2024 $
.Dt SNDIOD 8 .Dt SNDIOD 8
.Os .Os
.Sh NAME .Sh NAME
@ -404,7 +404,7 @@ is
and the default sub-device exposed by and the default sub-device exposed by
.Nm .Nm
is is
.Pa snd/0 . .Pa snd/default .
.Pp .Pp
If If
.Nm .Nm
@ -506,17 +506,17 @@ are recommended:
.Pp .Pp
For instance, the following command will create two devices: For instance, the following command will create two devices:
the default the default
.Va snd/0 .Va snd/default
and a MIDI-controlled and a MIDI-controlled
.Va snd/0.mmc : .Va snd/mmc :
.Bd -literal -offset indent .Bd -literal -offset indent
$ sndiod -r 48000 -z 400 -s default -t slave -s mmc $ sndiod -r 48000 -z 400 -s default -t slave -s mmc
.Ed .Ed
.Pp .Pp
Streams connected to Streams connected to
.Va snd/0 .Va snd/default
behave normally, while streams connected to behave normally, while streams connected to
.Va snd/0.mmc .Va snd/mmc
wait for the MMC start signal and start synchronously. wait for the MMC start signal and start synchronously.
Regardless of which device a stream is connected to, Regardless of which device a stream is connected to,
its playback volume knob is exposed. its playback volume knob is exposed.
@ -547,9 +547,9 @@ and to fall back to the PCI one when it's disconnected.
Start server using default parameters, creating an Start server using default parameters, creating an
additional sub-device for output to channels 2:3 only (rear speakers additional sub-device for output to channels 2:3 only (rear speakers
on most cards), exposing the on most cards), exposing the
.Pa snd/0 .Pa snd/default
and and
.Pa snd/0.rear .Pa snd/rear
devices: devices:
.Bd -literal -offset indent .Bd -literal -offset indent
$ sndiod -s default -c 2:3 -s rear $ sndiod -s default -c 2:3 -s rear
@ -557,9 +557,9 @@ $ sndiod -s default -c 2:3 -s rear
.Pp .Pp
Start server creating the default sub-device with low volume and Start server creating the default sub-device with low volume and
an additional sub-device for high volume output, exposing the an additional sub-device for high volume output, exposing the
.Pa snd/0 .Pa snd/default
and and
.Pa snd/0.max .Pa snd/max
devices: devices:
.Bd -literal -offset indent .Bd -literal -offset indent
$ sndiod -v 65 -s default -v 127 -s max $ sndiod -v 65 -s default -v 127 -s max

View File

@ -1,4 +1,4 @@
.\" $OpenBSD: vmctl.8,v 1.77 2024/05/02 15:46:10 mlarkin Exp $ .\" $OpenBSD: vmctl.8,v 1.78 2024/05/04 07:51:21 jmc Exp $
.\" .\"
.\" Copyright (c) 2015-2024 Mike Larkin <mlarkin@openbsd.org> .\" Copyright (c) 2015-2024 Mike Larkin <mlarkin@openbsd.org>
.\" .\"
@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.Dd $Mdocdate: May 2 2024 $ .Dd $Mdocdate: May 4 2024 $
.Dt VMCTL 8 .Dt VMCTL 8
.Os .Os
.Sh NAME .Sh NAME
@ -143,7 +143,7 @@ not the disk image.
In order to move a VM from one host to another, disk files must be In order to move a VM from one host to another, disk files must be
synced between the send and the receive processes and must be located synced between the send and the receive processes and must be located
under the same path. under the same path.
.It Cm show Op Ar id .It Cm show Oo Fl r Oc Op Ar id
An alias for the An alias for the
.Cm status .Cm status
command. command.