bhyve: allow for automatic destruction on power-off

Introduce -D flag that allows for the VM to be destroyed on guest initiated
power-off by the bhyve(8) process itself.
This is quality of life change that allows for simpler deployments without
the need for bhyvectl --destroy.

Requested by:	swills
Reviewed by:	0mp (manpages), grehan, kib, swills
Approved by:	kib (mentor)
MFC after:	2 weeks
Sponsored by:	Mysterious Code Ltd.
Differential Revision:	https://reviews.freebsd.org/D25414
This commit is contained in:
Pawel Biernacki 2020-06-25 12:35:20 +00:00
parent eb8a06388c
commit 0a1016f9e8
2 changed files with 14 additions and 5 deletions

View File

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd May 18, 2020
.Dd Jun 25, 2020
.Dt BHYVE 8
.Os
.Sh NAME
@ -32,7 +32,7 @@
.Nd "run a guest operating system inside a virtual machine"
.Sh SYNOPSIS
.Nm
.Op Fl AabCeHhPSuWwxY
.Op Fl AabCDeHhPSuWwxY
.Oo
.Sm off
.Fl c\~
@ -131,6 +131,8 @@ If a
is specified more than once the last one has precedence.
.It Fl C
Include guest memory in core file.
.It Fl D
Destroy the VM on guest initiated power-off.
.It Fl e
Force
.Nm

View File

@ -197,6 +197,7 @@ static int gdb_port = 0;
static int guest_vmexit_on_hlt, guest_vmexit_on_pause;
static int virtio_msix = 1;
static int x2apic_mode = 0; /* default is xAPIC */
static int destroy_on_poweroff = 0;
static int strictio;
static int strictmsr = 1;
@ -236,7 +237,7 @@ usage(int code)
{
fprintf(stderr,
"Usage: %s [-abehuwxACHPSWY]\n"
"Usage: %s [-abehuwxACDHPSWY]\n"
" %*s [-c [[cpus=]numcpus][,sockets=n][,cores=n][,threads=n]]\n"
" %*s [-g <gdb port>] [-l <lpc>]\n"
" %*s [-m mem] [-p vcpu:hostcpu] [-s <pci>] [-U uuid] <vm>\n"
@ -244,6 +245,7 @@ usage(int code)
" -A: create ACPI tables\n"
" -c: number of cpus and/or topology specification\n"
" -C: include guest memory in core file\n"
" -D: destroy on power-off\n"
" -e: exit on unhandled I/O access\n"
" -g: gdb port\n"
" -h: help\n"
@ -815,6 +817,8 @@ vmexit_suspend(struct vmctx *ctx, struct vm_exit *vmexit, int *pvcpu)
case VM_SUSPEND_RESET:
exit(0);
case VM_SUSPEND_POWEROFF:
if (destroy_on_poweroff)
vm_destroy(ctx);
exit(1);
case VM_SUSPEND_HALT:
exit(2);
@ -1101,9 +1105,9 @@ main(int argc, char *argv[])
memflags = 0;
#ifdef BHYVE_SNAPSHOT
optstr = "abehuwxACHIPSWYp:g:G:c:s:m:l:U:r:";
optstr = "abehuwxACDHIPSWYp:g:G:c:s:m:l:U:r:";
#else
optstr = "abehuwxACHIPSWYp:g:G:c:s:m:l:U:";
optstr = "abehuwxACDHIPSWYp:g:G:c:s:m:l:U:";
#endif
while ((c = getopt(argc, argv, optstr)) != -1) {
switch (c) {
@ -1116,6 +1120,9 @@ main(int argc, char *argv[])
case 'b':
bvmcons = 1;
break;
case 'D':
destroy_on_poweroff = 1;
break;
case 'p':
if (pincpu_parse(optarg) != 0) {
errx(EX_USAGE, "invalid vcpu pinning "