From nobody Thu Jan 26 22:12:11 2023 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 4P2w183z5Vz3c8bm; Thu, 26 Jan 2023 22:12:12 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4P2w1819TSz3wjL; Thu, 26 Jan 2023 22:12:12 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1674771132; 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=TQ3vp0JnvwCcxeITS+K0QIZxW0cBX+Cw1lWBr7B71a8=; b=fYkXJ/gv6+5og4ugU3H/voryz/m9NEYR5WiGjI0JIOkLev3bJ2Js9FJOpKb1eJq8rR2hDQ Q6kC4OaKciCf83g03DMCmDkftkMny9XtnZgdFPJD1y5aYeZFSak3aZMaogUp2AwgVqMWVU yQBnGok0nXDRKoNGOdFRIwUYTAUL6PQRTkcdUeXPvQ/BOloeqfYQed0i+777WZ6bgu3xL8 IU38qGh0vT6TZ2gE6yZ56HDAgM6azE9uRtU3O3c8bg1i9VM8thXOr1mzB5BIurnZt5lHGl JhTB85EvzU6W53YEx9/Fjk3q3IO/o34OGwZMbFYUMg21SUZTfgnFF++fI+bKKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1674771132; 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=TQ3vp0JnvwCcxeITS+K0QIZxW0cBX+Cw1lWBr7B71a8=; b=YIysgfo2QaZwpauGOXDHdlbql+9UqS1PGVaUcZdeCq6TnZh8CJ9PCSO8X793Y47gPupchx mz1SoTBf+buvTz2Rf4KYgD63DsJc16DIHaqQe+1oZQXXB8ilKaKMXgDJJmpBhV08GMUyr7 ES2mNNAedJguss48z8EDy2ZxSEky4iwZo7pm0Ym4YhKI6EyuLeJ9oFEc9qmAtnU1zGGTS+ jL8GMRcILMh86e2tiEaLp2pwjYOnRZEbFeh4Eek7mmJPMKij6g+Xao/JzQoBr/kELYwhqF SwZW0wKqNy4zudPI2t5u19tWik47WjhrQpcAXpZPIu/Zfs7DmCMuL4egtS3iig== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1674771132; a=rsa-sha256; cv=none; b=WXDcAOq+9g3R/KZEJTydEuhPpJmdXmNiMzyBtUB+u/bWK/C4BhlB1QT5WFXHdRkAOjqAup xgzrNXXF/Prsq6Ya+BmFsyruGOKkgeNUlXOy2ZJ9lLymqeogjjlqJYdX7IIKq1JYOYbTks yDO9HsGlWneQKcxH5eeYxnnbt3mRiZyJu7pAgiWJsEbPTvMoZrv4NdcOMACinGzKJf4dW6 eyTcdljwzZmXruth9fVABW7TzvbP02FbNpoBf9dCcuMwur+VnnyJxlTCb/J9suOFdyz28x 0b5nrAxth7q8CIlmRG/ZjfK5CzVuXFrEIeL02Ipn6RpKoZFAz+OxX39VXOJ1DQ== 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 4P2w180G7Rzm4m; Thu, 26 Jan 2023 22:12:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 30QMCBEj022362; Thu, 26 Jan 2023 22:12:11 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30QMCBm0022361; Thu, 26 Jan 2023 22:12:11 GMT (envelope-from git) Date: Thu, 26 Jan 2023 22:12:11 GMT Message-Id: <202301262212.30QMCBm0022361@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: b88a7eae3584 - stable/13 - vmm: Use a cpuset_t for vCPUs waiting for STARTUP IPIs. 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: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: b88a7eae3584c338c80611269b5790637386d798 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=b88a7eae3584c338c80611269b5790637386d798 commit b88a7eae3584c338c80611269b5790637386d798 Author: John Baldwin AuthorDate: 2022-11-18 18:05:10 +0000 Commit: John Baldwin CommitDate: 2023-01-26 22:05:52 +0000 vmm: Use a cpuset_t for vCPUs waiting for STARTUP IPIs. Retire the boot_state member of struct vlapic and instead use a cpuset in the VM to track vCPUs waiting for STARTUP IPIs. INIT IPIs add vCPUs to this set, and STARTUP IPIs remove vCPUs from the set. STARTUP IPIs are only reported to userland for vCPUs that were removed from the set. In particular, this permits a subsequent change to allocate vCPUs on demand when the vCPU may not be allocated until after a STARTUP IPI is reported to userland. Reviewed by: corvink, markj Differential Revision: https://reviews.freebsd.org/D37173 (cherry picked from commit c0f35dbf19c3c8825bd2b321d8efd582807d1940) --- sys/amd64/include/vmm.h | 3 +++ sys/amd64/vmm/io/vlapic.c | 46 ++++++++++-------------------------------- sys/amd64/vmm/io/vlapic_priv.h | 7 ------- sys/amd64/vmm/vmm.c | 27 +++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 42 deletions(-) diff --git a/sys/amd64/include/vmm.h b/sys/amd64/include/vmm.h index b7506faaee92..3e58c82fb95c 100644 --- a/sys/amd64/include/vmm.h +++ b/sys/amd64/include/vmm.h @@ -319,9 +319,12 @@ int vm_restore_time(struct vm *vm); typedef void (*vm_rendezvous_func_t)(struct vcpu *vcpu, void *arg); int vm_smp_rendezvous(struct vcpu *vcpu, cpuset_t dest, vm_rendezvous_func_t func, void *arg); + cpuset_t vm_active_cpus(struct vm *vm); cpuset_t vm_debug_cpus(struct vm *vm); cpuset_t vm_suspended_cpus(struct vm *vm); +cpuset_t vm_start_cpus(struct vm *vm, const cpuset_t *tostart); +void vm_await_start(struct vm *vm, const cpuset_t *waiting); #endif /* _SYS__CPUSET_H_ */ static __inline int diff --git a/sys/amd64/vmm/io/vlapic.c b/sys/amd64/vmm/io/vlapic.c index 1a8b54bba3bf..e13cdcc63d57 100644 --- a/sys/amd64/vmm/io/vlapic.c +++ b/sys/amd64/vmm/io/vlapic.c @@ -1039,7 +1039,6 @@ vlapic_icrlo_write_handler(struct vlapic *vlapic, bool *retu) cpuset_t dmask, ipimask; uint64_t icrval; uint32_t dest, vec, mode, shorthand; - struct vlapic *vlapic2; struct vcpu *vcpu; struct vm_exit *vmexit; struct LAPIC *lapic; @@ -1128,14 +1127,9 @@ vlapic_icrlo_write_handler(struct vlapic *vlapic, bool *retu) i == vlapic->vcpuid) break; - /* - * Userland which doesn't support the IPI exit - * requires that the boot state is set to SIPI - * here. - */ - vcpu = vm_vcpu(vlapic->vm, i); - vlapic2 = vm_lapic(vcpu); - vlapic2->boot_state = BS_SIPI; + /* vCPU i is waiting for SIPI. */ + CPU_SETOF(i, &dmask); + vm_await_start(vlapic->vm, &dmask); break; } @@ -1158,11 +1152,10 @@ vlapic_icrlo_write_handler(struct vlapic *vlapic, bool *retu) /* * Ignore SIPIs in any state other than wait-for-SIPI */ - vcpu = vm_vcpu(vlapic->vm, i); - vlapic2 = vm_lapic(vcpu); - if (vlapic2->boot_state != BS_SIPI) + CPU_SETOF(i, &dmask); + dmask = vm_start_cpus(vlapic->vm, &dmask); + if (CPU_EMPTY(&dmask)) break; - vlapic2->boot_state = BS_RUNNING; vmexit = vm_exitinfo(vlapic->vcpu); vmexit->exitcode = VM_EXITCODE_SPINUP_AP; @@ -1173,19 +1166,10 @@ vlapic_icrlo_write_handler(struct vlapic *vlapic, bool *retu) break; } - CPU_FOREACH_ISSET(i, &dmask) { - vcpu = vm_vcpu(vlapic->vm, i); - vlapic2 = vm_lapic(vcpu); - - /* - * Ignore SIPIs in any state other than wait-for-SIPI - */ - if (vlapic2->boot_state != BS_SIPI) - continue; - vlapic2->boot_state = BS_RUNNING; - CPU_SET(i, &ipimask); - } - + /* + * Ignore SIPIs in any state other than wait-for-SIPI + */ + ipimask = vm_start_cpus(vlapic->vm, &dmask); break; default: return (1); @@ -1210,9 +1194,6 @@ vlapic_handle_init(struct vcpu *vcpu, void *arg) struct vlapic *vlapic = vm_lapic(vcpu); vlapic_reset(vlapic); - - /* vlapic_reset modifies the boot state. */ - vlapic->boot_state = BS_SIPI; } int @@ -1223,6 +1204,7 @@ vm_handle_ipi(struct vcpu *vcpu, struct vm_exit *vme, bool *retu) case APIC_DELMODE_INIT: vm_smp_rendezvous(vcpu, vme->u.ipi.dmask, vlapic_handle_init, NULL); + vm_await_start(vcpu_vm(vcpu), &vme->u.ipi.dmask); break; case APIC_DELMODE_STARTUP: break; @@ -1598,11 +1580,6 @@ vlapic_reset(struct vlapic *vlapic) lapic->dcr_timer = 0; vlapic_dcr_write_handler(vlapic); - if (vlapic->vcpuid == 0) - vlapic->boot_state = BS_RUNNING; /* BSP */ - else - vlapic->boot_state = BS_INIT; /* AP */ - vlapic->svr_last = lapic->svr; } @@ -1900,7 +1877,6 @@ vlapic_snapshot(struct vm *vm, struct vm_snapshot_meta *meta) sizeof(vlapic->isrvec_stk), meta, ret, done); SNAPSHOT_VAR_OR_LEAVE(vlapic->isrvec_stk_top, meta, ret, done); - SNAPSHOT_VAR_OR_LEAVE(vlapic->boot_state, meta, ret, done); SNAPSHOT_BUF_OR_LEAVE(vlapic->lvt_last, sizeof(vlapic->lvt_last), diff --git a/sys/amd64/vmm/io/vlapic_priv.h b/sys/amd64/vmm/io/vlapic_priv.h index 2ac0cbf68117..ccae4b748880 100644 --- a/sys/amd64/vmm/io/vlapic_priv.h +++ b/sys/amd64/vmm/io/vlapic_priv.h @@ -125,12 +125,6 @@ do { \ VLAPIC_CTR1((vlapic), msg " isr7 0x%08x", isrptr[7 << 2]); \ } while (0) -enum boot_state { - BS_INIT, - BS_SIPI, - BS_RUNNING -}; - /* * 16 priority levels with at most one vector injected per level. */ @@ -175,7 +169,6 @@ struct vlapic { int isrvec_stk_top; uint64_t msr_apicbase; - enum boot_state boot_state; /* * Copies of some registers in the virtual APIC page. We do this for diff --git a/sys/amd64/vmm/vmm.c b/sys/amd64/vmm/vmm.c index 57c8555f08fe..2ba71a641deb 100644 --- a/sys/amd64/vmm/vmm.c +++ b/sys/amd64/vmm/vmm.c @@ -173,6 +173,7 @@ struct vm { struct vrtc *vrtc; /* (o) virtual RTC */ volatile cpuset_t active_cpus; /* (i) active vcpus */ volatile cpuset_t debug_cpus; /* (i) vcpus stopped for debug */ + cpuset_t startup_cpus; /* (i) [r] waiting for startup */ int suspend; /* (i) stop VM execution */ volatile cpuset_t suspended_cpus; /* (i) suspended vcpus */ volatile cpuset_t halted_cpus; /* (x) cpus in a hard halt */ @@ -486,6 +487,7 @@ vm_init(struct vm *vm, bool create) CPU_ZERO(&vm->active_cpus); CPU_ZERO(&vm->debug_cpus); + CPU_ZERO(&vm->startup_cpus); vm->suspend = 0; CPU_ZERO(&vm->suspended_cpus); @@ -2422,6 +2424,30 @@ vm_suspended_cpus(struct vm *vm) return (vm->suspended_cpus); } +/* + * Returns the subset of vCPUs in tostart that are awaiting startup. + * These vCPUs are also marked as no longer awaiting startup. + */ +cpuset_t +vm_start_cpus(struct vm *vm, const cpuset_t *tostart) +{ + cpuset_t set; + + mtx_lock(&vm->rendezvous_mtx); + CPU_AND(&set, &vm->startup_cpus, tostart); + CPU_ANDNOT(&vm->startup_cpus, &vm->startup_cpus, &set); + mtx_unlock(&vm->rendezvous_mtx); + return (set); +} + +void +vm_await_start(struct vm *vm, const cpuset_t *waiting) +{ + mtx_lock(&vm->rendezvous_mtx); + CPU_OR(&vm->startup_cpus, &vm->startup_cpus, waiting); + mtx_unlock(&vm->rendezvous_mtx); +} + void * vcpu_stats(struct vcpu *vcpu) { @@ -2770,6 +2796,7 @@ vm_snapshot_vm(struct vm *vm, struct vm_snapshot_meta *meta) if (ret != 0) goto done; + SNAPSHOT_VAR_OR_LEAVE(vm->startup_cpus, meta, ret, done); done: return (ret); }